그러냐

안드로이드 블루투스 신호강도 측정하기 본문

android

안드로이드 블루투스 신호강도 측정하기

관절분리 2016. 1. 28. 10:57
반응형

출처 : http://zxcyc.egloos.com/viewer/175671

 

 

블루투스에 신호강도 (RSSI) 측정법이 있어 작성합니다.

WI-FI에는 접속을 할 경우 흔히 게이지를 표시가 되어 누구나 알고 있지만,

잘쓰지 않는 블루투스에도 측정이 가능합니다.

간단하게 안드로이드 SDK에 있는 Bluetooth Chat 샘플소스로 살펴봤습니다.

이클립스에 File > New > Project 를 선택합니다.


샘플 프로젝트를 선택 후 안드로이드 버전을 선택하시고 다음을 누릅니다.  (4.0 버전을 선택 했습니다.)


BluetoothChat 선택 후 Finish 선택.

프로젝트에 보시면 src에 파일 3개가 있는데 이 중 DeviceListActivity.java 파일이 Bluetooth Scan을 담당하는 파일입니다.

우선 IntentFilter 등록 하는 부분은 onCreate에 있습니다.

 



 

 

1
2
3
4
5
6
7
8
9
// Register for broadcasts when a device is discovered
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(mReceiver, filter);
 
// Register for broadcasts when discovery has finished
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
this.registerReceiver(mReceiver, filter);
 
 



그리고 아래로 내려오시면 Receiver가 있는데, BluetoothDevice.ACTION_FOUND.equals(action) if문에

Scan으로 발견한 deviceName()과 deviceAddress()를 List에 추가 하는 부분에

신호 측정과 관련된 소스를 추가 합니다.


1
2
3
4
5
6
7
 
short rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,  Short.MIN_VALUE);
 
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
    mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress() + " (RSSI : "+rssi +"dBm)");
}
 



그리고 실행합니다.

메뉴 > Connect a device 선택 (두개가 동일함)

Scan for devices 버튼 터치

아래와 같은 결과가 나옵니다.

 



아 그리고 실행하실때

 


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
12-23 21:30:56.686: E/AndroidRuntime(7069): FATAL EXCEPTION: main
12-23 21:30:56.686: E/AndroidRuntime(7069): java.lang.NullPointerException
12-23 21:30:56.686: E/AndroidRuntime(7069):  at com.example.android.BluetoothChat.BluetoothChat.setStatus(BluetoothChat.java:235)
12-23 21:30:56.686: E/AndroidRuntime(7069):  at com.example.android.BluetoothChat.BluetoothChat.access$4(BluetoothChat.java:233)
12-23 21:30:56.686: E/AndroidRuntime(7069):  at com.example.android.BluetoothChat.BluetoothChat$2.handleMessage(BluetoothChat.java:260)
12-23 21:30:56.686: E/AndroidRuntime(7069):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-23 21:30:56.686: E/AndroidRuntime(7069):  at android.os.Looper.loop(Looper.java:137)
12-23 21:30:56.686: E/AndroidRuntime(7069):  at android.app.ActivityThread.main(ActivityThread.java:4950)
12-23 21:30:56.686: E/AndroidRuntime(7069):  at java.lang.reflect.Method.invokeNative(Native Method)
12-23 21:30:56.686: E/AndroidRuntime(7069):  at java.lang.reflect.Method.invoke(Method.java:511)
12-23 21:30:56.686: E/AndroidRuntime(7069):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:997)
12-23 21:30:56.686: E/AndroidRuntime(7069):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:764)
12-23 21:30:56.686: E/AndroidRuntime(7069):  at dalvik.system.NativeStart.main(Native Method)
 


이런 오류가 난다면, BluetoothChat.java 파일의


     private final void setStatus(int resId) {
        //final ActionBar actionBar = getActionBar();
        //actionBar.setSubtitle(resId);
    }

    private final void setStatus(CharSequence subTitle) {
       // final ActionBar actionBar = getActionBar();
        //actionBar.setSubtitle(subTitle);
    }




요 두함수에 주석처리하면 실행 됩니다. (먼가 설정이 필요한 듯 합니다.)

 


 

반응형