Android - 从特征

时间:2018-04-09 12:06:16

标签: android bluetooth-lowenergy

我正试图通过Android Studio与Red Bear Labs nRF8001 Arduino Shield进行交互。我成功地通过Android发送命令并在我的Arduino上接收它。

但是我希望阅读我的Arduino的回复,使用" OnCharacteristicChange" - 但研究显示需要描述符。

这是我的代码示例:

  @Override
         public void onServicesDiscovered(BluetoothGatt gatt, int status) {
             super.onServicesDiscovered(gatt, status);
             if(status != BluetoothGatt.GATT_SUCCESS){
                 Log.i("BtServiceCallback","OnServicesDiscovered Failed!");
             }
             BluetoothGattService service = gatt.getService(RBLService.UUID_BLE_SHIELD_SERVICE);
             BluetoothGattCharacteristic characteristic = service.getCharacteristic(RBLService.UUID_BLE_SHIELD_TX);

             BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(RBLGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
             descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
             gatt.writeDescriptor(descriptor);

             byte[] val = readSetPoint.getBytes();
             characteristic.setValue(val);
             gatt.setCharacteristicNotification(characteristic,true);
             gatt.writeCharacteristic(characteristic);

             Log.i("Sent = ", characteristic.getStringValue(0));
         }

每当我尝试从特征中创建描述符时,我都会收到以下错误:

 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.bluetooth.BluetoothGattDescriptor.setValue(byte[])' on a null object reference
    at uk.ac.as988brighton.bluecontroller.MainActivity$1.onServicesDiscovered(MainActivity.java:160)
    at android.bluetooth.BluetoothGatt$1.onSearchComplete(BluetoothGatt.java:286)
    at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:103)
    at android.os.Binder.execTransact(Binder.java:573)

我正在使用RBL' Github中的UUID:

public static String CLIENT_CHARACTERISTIC_CONFIG = "00002902-0000-1000-8000-00805f9b34fb";
public static String BLE_SHIELD_TX = "713d0003-503e-4c75-ba94-3148f18d941e";
public static String BLE_SHIELD_RX = "713d0002-503e-4c75-ba94-3148f18d941e";
public static String BLE_SHIELD_SERVICE = "713d0000-503e-4c75-ba94-3148f18d941e";

我不确定导致空描述符的原因。

修改 我为描述符使用了不同的组合 - 例如使用

 BluetoothGattDescriptor characteristic.getDescriptor(RBLService.UUID_BLE_SHIELD_TX);

但仍然收到同样的错误。

1 个答案:

答案 0 :(得分:0)

看起来你需要确保你的命名是一样的。您的服务和特征uuid都声明为BLE_SHIELD_SERVICEBLE_SHIELD_TX,但您尝试使用UUID_BLE_SHIELD_SERVICEUUID_BLE_SHIELD_TX访问它们。

所以改变 BluetoothGattService service = gatt.getService(RBLService.UUID_BLE_SHIELD_SERVICE);

BluetoothGattService service = gatt.getService(RBLService.BLE_SHIELD_SERVICE);

BluetoothGattCharacteristic characteristic = service.getCharacteristic(RBLService.UUID_BLE_SHIELD_TX);

BluetoothGattCharacteristic characteristic = service.getCharacteristic(RBLService.BLE_SHIELD_TX);

我相信它应该有效。还要确保从外围设备广播那些确切的服务和特征uuid。

祝你好运!