2013-11-17 3 views
0

Я хочу континуульную читать RSSI после GATT является connected.code так:android bluetooth LE - Почему onReadRemoteRssi не работает?

final BluetoothDevice device = mBluetoothAdapter 
     .getRemoteDevice(address); 
if (device == null) { 
    Log.w(TAG, "Device not found. Unable to connect."); 
    return false; 
} 

mBluetoothGatt = device.connectGatt(this, false, mGattCallback); 
Log.d(TAG, "Trying to create a new connection."); 
boolean readRssiFlag = mBluetoothGatt.readRemoteRssi(); 
Log.i(TAG,"readRssiFlag: "+readRssiFlag); 

mGattCallback так:

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { 
     .... 
     @Override 
     public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { 
      Log.i(TAG,"rssi = " + rssi); 
     } 
     ... 
    }; 

и onReadRemoteRssi не работает. скажите мне, как изменить код или другие решения для чтения rssi!

Спасибо за советы!

ответ

0
mBluetoothGatt = device.connectGatt(this, false, mGattCallback); 
Log.d(TAG, "Trying to create a new connection."); 
boolean readRssiFlag = mBluetoothGatt.readRemoteRssi(); 

Проблема в том, что вы не дождались изменения состояния соединения перед вызовом readRemoteRssi. Самый ранний момент для вызова readRemoteRssi - после того, как вы получите onConnectionStateChange с newState = 2 (подключено).

3
private mRssiTimer; 
.... 
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() 
{ 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) 
    { 
     if (newState == BluetoothProfile.STATE_CONNECTED) 
     {    
      TimerTask task = new TimerTask() 
     { 
      @Override 
      public void run() 
      { 
       mBluetoothGatt.readRemoteRssi(); 
      } 
     }; 
     mRssiTimer = new Timer(); 
     mRssiTimer.schedule(task, 1000, 1000); 
     } 
     else if (newState == BluetoothProfile.STATE_DISCONNECTED) 
     { 
     mRssiTimer.cancel(); 
     } 
    } 
    .... 
} 
Смежные вопросы