我正试图通过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);
但仍然收到同样的错误。
答案 0 :(得分:0)
看起来你需要确保你的命名是一样的。您的服务和特征uuid都声明为BLE_SHIELD_SERVICE
和BLE_SHIELD_TX
,但您尝试使用UUID_BLE_SHIELD_SERVICE
和UUID_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。
祝你好运!