2017-04-20 10 views
0

Ich versuche eine Android-App zu implementieren, die nach BLE-Geräten sucht. Da ich eine Art von Entfernungsinformation der Beacons benötige, möchte ich das RSSI kontinuierlich lesen. Momentan kann ich den RSSI anzeigen, aber der Wert ändert sich nicht. Die Anwendung liest den Wert einmal und aktualisiert den Wert nicht. Ich habe die Beispiel-BLE-Anwendung von gitHub als Grundlage verwendet.Wie wird der RSSI eines BLE-Geräts kontinuierlich angezeigt?

Das ist mein Bluetooth-Gerät:

class DeviceHolder{ 
    BluetoothDevice device; 
    int rssi; 
    public DeviceHolder(BluetoothDevice device, int rssi){ 
     this. device = device; 
     this.rssi = rssi; 
    } 
} 

Die Liste Adapter:

private class LeDeviceListAdapter extends BaseAdapter { 
    private ArrayList<BluetoothDevice> mLeDevices; 
    private ArrayList<DeviceHolder> mLeHolders; 
    private LayoutInflater mInflator; 

    public LeDeviceListAdapter() { 
     super(); 
     mLeDevices = new ArrayList<BluetoothDevice>(); 
     mLeHolders = new ArrayList<DeviceHolder>(); 
     mInflator = DeviceScanActivity.this.getLayoutInflater(); 
    } 
    public void addDevice(DeviceHolder deviceHolder) { 
     if(!mLeDevices.contains(deviceHolder.device)) { 
      mLeDevices.add(deviceHolder.device); 
      mLeHolders.add(deviceHolder); 
     } 
    } 

und die Scan-Rückruf:

private BluetoothAdapter.LeScanCallback mLeScanCallback = 
     new BluetoothAdapter.LeScanCallback() { 

      @Override 
      public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 
       DeviceHolder deviceHolder = new DeviceHolder(device,rssi); 
       runOnUiThread(new DeviceAddTask(deviceHolder)); 
      } 
     }; 

class DeviceAddTask implements Runnable { 
    DeviceHolder deviceHolder; 

    public DeviceAddTask(DeviceHolder deviceHolder) { 
     this.deviceHolder = deviceHolder; 
    } 

    public void run() { 
     mLeDeviceListAdapter.addDevice(deviceHolder); 
     mLeDeviceListAdapter.notifyDataSetChanged(); 
    } 
} 

Die Bluetooth GattCallback im BluetoothLeService Aktivität sieht wie folgt aus :

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     String intentAction; 
     if (newState == BluetoothProfile.STATE_CONNECTED) { 
      intentAction = ACTION_GATT_CONNECTED; 
      mConnectionState = STATE_CONNECTED; 
      boolean rssiStatus = mBluetoothGatt.readRemoteRssi(); 
      broadcastUpdate(intentAction); 
      Log.i(TAG, "Connected to GATT server."); 
      // Attempts to discover services after successful connection. 
      Log.i(TAG, "Attempting to start service discovery:" + 
        mBluetoothGatt.discoverServices()); 

     } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { 
      intentAction = ACTION_GATT_DISCONNECTED; 
      mConnectionState = STATE_DISCONNECTED; 
      Log.i(TAG, "Disconnected from GATT server."); 
      broadcastUpdate(intentAction); 
     } 
    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
     if (status == BluetoothGatt.GATT_SUCCESS) { 
      broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED); 
     } else { 
      Log.w(TAG, "onServicesDiscovered received: " + status); 
     } 
    } 

    @Override 
    public void onCharacteristicRead(BluetoothGatt gatt, 
            BluetoothGattCharacteristic characteristic, 
            int status) { 
     if (status == BluetoothGatt.GATT_SUCCESS) { 
      broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); 
     } 
    } 

    @Override 
    public void onCharacteristicChanged(BluetoothGatt gatt, 
             BluetoothGattCharacteristic characteristic) { 
     broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); 
    } 

    public void onReadRemoteRssi(BluetoothGatt gatt, 
           int rssi, int status){ 
     super.onReadRemoteRssi(gatt, rssi, status); 
     if (status == BluetoothGatt.GATT_SUCCESS) { 
      Log.d(TAG, String.format("BluetoothGatt ReadRssi[%d]", rssi)); 
     } else { 
      Log.w(TAG, "onReadRemoteRssi received: " + status); 
     } 
     broadcastUpdate(ACTION_RSSI_VALUE_READ, rssi); 

    } 
}; 

private void broadcastUpdate(final String action) { 
    final Intent intent = new Intent(action); 
    sendBroadcast(intent); 
} 

private void broadcastUpdate(final String action, int rssi){ 
    Log.d(TAG, "broadcastUpdate - rssi"); 
    final Intent intent = new Intent(action); 
    intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_RSSI, rssi); 
    intent.setAction(ACTION_RSSI_VALUE_READ); 
    sendBroadcast(intent); 
} 

Ich suchte im Internet und Stackoverflow nach Anleitung, aber die bereitgestellten Lösungen funktionierten nicht für mich. Ich benutze ein Samsung Galaxy S5 mit Android 6.01. Hat jemand einen Hinweis, wie der RSSI kontinuierlich für nicht angeschlossene Geräte angezeigt wird (während des Scannens)? Hinweise auf eine falsche Implementierung sind ebenfalls willkommen.

Vielen Dank für Ihre Hilfe!

Sayus

PS: onReadRemoteRssi implementiert ist, weil ich die RSSI, wenn die Geräte auch conected werden lesen wollen. Diese Funktionalität ist derzeit nicht wichtig und ist nur schön zu haben.

Antwort

0

Ihre Anwendung liest einen RSSI-Wert einmal und aktualisiert ihn nicht, da beim Hinzufügen eines neuen BluetoothDevice in Ihrem Adapter überprüft wird, ob es bereits einen enthält.

if(!mLeDevices.contains(deviceHolder.device)) { 
     mLeDevices.add(deviceHolder.device); 
     mLeHolders.add(deviceHolder); 
    } 

Stattdessen würde ich ein Map<BluetoothDevice,Integer> schaffen, in dem Sie den RSSI-Wert für das Gerät aktualisieren: mDeviceRssi.put(device, rssi).

+0

vielen dank für ihre antwort! Jetzt verstehe ich das Problem. Und ich verstehe auch, dass ich das gelistete Gerät nur aktualisieren sollte. Da ich neu in Android-Entwicklung bin, wäre ich sehr dankbar, wenn Sie ein wenig mehr Informationen über Map und wie man es in meinem Code verwenden könnte. Ein hilfreicher Link würde auch ausreichen. Nochmals vielen Dank! – Sayus

Verwandte Themen