问题描述
用于测试设备:的Nexus 4,安卓4.3
Device used for testing: Nexus 4, Android 4.3
连接工作正常,但我的回调 onCharacteristicChanged
方法不会被调用。不过我在注册通知使用 setCharacteristicNotification(字符,真)
在 onServicesDiscovered
和功能甚至返回true。
Connection is working fine but the onCharacteristicChanged
Method of my callback is never called. However I am registering for notifications using setCharacteristicNotification(char, true)
inside onServicesDiscovered
and that function even returns true.
设备日志(实际上有的没有的消息在所有的时候通知的应的出现/通过蓝牙设备发送):
Device log (there are actually no messages at all when notifications should appear / are sent via the Bluetooth device):
07-28 18:15:06.936 16777-16809/de.ffuf.leica.sketch D/BluetoothGatt: setCharacteristicNotification() - uuid: 3ab10101-f831-4395-b29d-570977d5bf94 enable: true
07-28 18:15:06.936 4372-7645/com.android.bluetooth D/BtGatt.GattService: registerForNotification() - address=C9:79:25:34:19:6C enable: true
07-28 18:15:06.936 4372-7645/com.android.bluetooth D/BtGatt.btif: btif_gattc_reg_for_notification
07-28 18:15:06.946 4372-7645/com.android.bluetooth D/BtGatt.btif: btgattc_handle_event: Event 1018
07-28 18:15:06.946 4372-7645/com.android.bluetooth D/BtGatt.GattService: onRegisterForNotifications() - address=null, status=0, registered=1, charUuid=3ab10101-f831-4395-b29d-570977d5bf94
07-28 18:15:06.946 4372-7645/com.android.bluetooth D/BtGatt.btif: btgattc_handle_event: Event 1016
07-28 18:15:06.946 4372-7645/com.android.bluetooth D/BtGatt.btif: btgattc_handle_event: Event 1018
07-28 18:15:06.946 4372-7645/com.android.bluetooth D/BtGatt.GattService: onRegisterForNotifications() - address=null, status=0, registered=1, charUuid=3ab10102-f831-4395-b29d-570977d5bf94
07-28 18:15:06.946 4372-7645/com.android.bluetooth D/BtGatt.btif: btgattc_handle_event: Event 1016
07-28 18:15:06.946 4372-7684/com.android.bluetooth E/bt-btif: already has a pending command!!
07-28 18:15:06.946 4372-7645/com.android.bluetooth D/BtGatt.btif: btgattc_handle_event: Event 1013
07-28 18:15:06.946 4372-7684/com.android.bluetooth E/bt-btif: already has a pending command!!
07-28 18:15:06.946 4372-7645/com.android.bluetooth D/BtGatt.btif: btgattc_handle_event: Event 1013
07-28 18:15:06.946 4372-7684/com.android.bluetooth E/bt-btif: already has a pending command!!
07-28 18:15:06.976 4372-7645/com.android.bluetooth D/BtGatt.btif: btif_gattc_upstreams_evt: Event 9
关贸总协定通知做工精细用iOS和应用程序基本上做同样的在Android(登记通知等)。
GATT Notifications work fine using iOS and the app basically does the same as on Android (registering for notification etc.).
有没有其他人经历过这样的一个可能的解决方案?
Has anyone else experienced this with a possible solution?
推荐答案
好像你忘了写,告诉你BLE设备走在这种模式下,描述符。请参阅处理描述符在http://developer.android.com/guide/topics/connectivity/bluetooth-le.html#notification
It seems like you forgot to write the Descriptor which tells your BLE device to go in this mode. See the code lines that deal with descriptor at http://developer.android.com/guide/topics/connectivity/bluetooth-le.html#notification
如果不设置这个描述符,你从来没有收到更新的特性。呼叫 setCharacteristicNotification
是远远不够的。这是一个常见的错误。
Without setting this descriptor, you never receive updates to a characteristic. Calling setCharacteristicNotification
is not enough. This is a common mistake.
code剪断
protected static final UUID CHARACTERISTIC_UPDATE_NOTIFICATION_DESCRIPTOR_UUID = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
public boolean setCharacteristicNotification(BluetoothDevice device, UUID serviceUuid, UUID characteristicUuid,
boolean enable) {
if (IS_DEBUG)
Log.d(TAG, "setCharacteristicNotification(device=" + device.getName() + device.getAddress() + ", UUID="
+ characteristicUuid + ", enable=" + enable + " )");
BluetoothGatt gatt = mGattInstances.get(device.getAddress()); //I just hold the gatt instances I got from connect in this HashMap
BluetoothGattCharacteristic characteristic = gatt.getService(serviceUuid).getCharacteristic(characteristicUuid);
gatt.setCharacteristicNotification(characteristic, enable);
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CHARACTERISTIC_UPDATE_NOTIFICATION_DESCRIPTOR_UUID);
descriptor.setValue(enable ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE : new byte[] { 0x00, 0x00 });
return gatt.writeDescriptor(descriptor); //descriptor write operation successfully started?
}
这篇关于Android的BLE API:GATT通知没有收到的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!