2016-06-16 30 views
1

AndroidデバイスからBLEとやり取りしてセンサー値を読み取ろうとしていますが、APIのレベルが21を超えています。デバイスをスキャンして接続しました。最初の課題は、すべての特性値を1つのショットで一緒に読み取ることでした。いくつかは優先順位キューを使用してそれを行うことを提案しました。私は賢明に実装しました。AndroidでBLEの値を継続的に読み取る

BluetoothGattCallback gattCallBack = new BluetoothGattCallback() { 
     @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     switch (newState) { 
      case BluetoothProfile.STATE_CONNECTED: 
       Log.d(TAG, "STATE_CONNECTED"); 
       bluetoothGatt.discoverServices(); 
       break; 
      case BluetoothProfile.STATE_DISCONNECTED: 
       Log.d(TAG, "STATE_DISCONNECTED"); 
       break; 
      default: 
       Log.d(TAG, "STATE_OTHER"); 

     } 
    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
     final List<BluetoothGattService> services = gatt.getServices(); 
     characteristics = new ArrayList<BluetoothGattCharacteristic>(); 
     characteristics.add(services.get(1).getCharacteristics().get(0)); 
     characteristics.add(services.get(1).getCharacteristics().get(1)); 
     characteristics.add(services.get(1).getCharacteristics().get(2)); 

     characteristics.add(services.get(2).getCharacteristics().get(0)); 
     characteristics.add(services.get(2).getCharacteristics().get(1)); 
     characteristics.add(services.get(2).getCharacteristics().get(2)); 

     characteristics.add(services.get(3).getCharacteristics().get(0)); 
     characteristics.add(services.get(3).getCharacteristics().get(1)); 
     characteristics.add(services.get(3).getCharacteristics().get(2)); 
     requesReadCharacteristics(gatt); 
    } 

    public void requesReadCharacteristics(BluetoothGatt gatt) { 
     gatt.readCharacteristic(characteristics.get(characteristics.size() - 1)); 
    } 

    @Override 
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { 
     if (status == 0) { 
      Log.d(TAG, "DeviceNameFetchFromDevice: " + characteristic.getValue()); 
      characteristics.remove(characteristics.get(characteristics.size() - 1)); 

      if (characteristics.size() > 0) { 
       requesReadCharacteristics(gatt); 
      } else { 
       gatt.disconnect(); 
      } 
     } 
    } 

    @Override 
    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { 
     super.onCharacteristicWrite(gatt, characteristic, status); 
    } 
}; 

は今は連続的に(10秒の間隔毎等)のセンサ値を読み取るためにBLEデバイスによって監視することが必要なので、私は繰り返し特性値を読み取り、それらの値を取得する必要があります。しかし、最初の呼び出しの後には、 "readCharacteristic"を呼び出すことはできません。

今のところ、BLEデバイスへの接続を切断して再度接続するような、一定間隔でconnectDevice(BluetoothDevice)を呼び出すように実装しました。 readCharacteristicを繰り返し呼び出してデバイスに接続できる方法はありますか?私の理解によれば、デバイスの取り外しと接続は効率的ではありません。その後、

mBluetoothLeService.setCharacteristicNotification(characteristic, true); 

を、あなたがすることができます:私に知らせてください、何が、あなたが通知をオンにする必要があります。この

https://github.com/sandeeptengale/androidble/

+0

「最初の呼び出し後にbleはreadCharacterisitcを呼び出すことができません」というエラーが何か、または何を意味していますか? – p2pkit

答えて

1

最初のような任意の例がある場合は、正しいアプローチはcontinueslyデバイスを読んだり、共有することです

onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) 
+0

@zkywaklkerありがとうございますが、特性値が変更されるたびに通知します。私は切断されずに定期的に各特性を読み取る必要があります –

+0

定期的に各特性を読み取る方法の解決策を得ましたか? –

関連する問題