成功解决familiar problem in onCharacteristicwrite后,我继续在133
函数中遇到这些状态readCharacteristic
。
这里有一个简短的代码:我将特征存储到onServicesDiscovered
函数中的变量:
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
try {
syncDataService = gatt.getService(GiraffeFriendAttributes.SYNC_DATA_SERVICE);
if (syncDataService == null) throw new AssertionError("sync data service null!");
syncDataInputChar = syncDataService.getCharacteristic(GiraffeFriendAttributes.SYNC_DATA_INPUT_CHAR);
syncDataOutputChar = syncDataService.getCharacteristic(GiraffeFriendAttributes.SYNC_DATA_OUTPUT_CHAR);
if (syncDataInputChar == null || syncDataOutputChar == null) throw new AssertionError("sync data service null!");
...
} catch ...
}
然后在将SYNC_DATA_INPUT_CHAR
写入设备之后,设备将更改其中一个特性的值,我将需要获取该值。所以我在下面写代码。
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
Log.d(TAG, String.format("Sync: onCharWrite, status = %d", status));
try {
...
else if (characteristic.getUuid().equals(SYNC_DATA_INPUT_CHAR)) {
Log.d(TAG, String.format("Sync: on write data index: %x, %x", dataIndexs[0], dataIndexs[1]));
gatt.readCharacteristic(syncDataOutputChar);
}
} catch ...
}
readCharacteristic
函数发生错误,它会触发状态为onCharacteristicRead
的{{1}}函数。
以下是一些日志:
133
正如@benka告诉我的那样,我检查了特征的属性,发现值为10.我认为它应该是2(PROPERTY_READ)+ 8(PROPERTY_WRITE),所以直接调用函数{{ 1}}应该没问题。我将把这个特征的所有属性放在下面。
D/BluetoothGatt﹕ writeCharacteristic() - uuid: 0000ffa6-0000-1000-8000-00805f9b34fb
D/BluetoothGatt﹕ onCharacteristicRead() - Device=78:A5:04:3D:4F:C6 UUID=0000ffab-0000-1000-8000-00805f9b34fb Status=133
W/BluetoothGatt﹕ Unhandled exception: java.lang.NullPointerException: src == null
onClientConnectionState() - status=0 clientIf=4 device=78:A5:04:3D:4F:C6
我希望如果有人有这个熟悉的问题,可以给我一些建议。
非常感谢!
---编辑1
我忘了说,上面的值都是小数,但它可以视为十六进制。
---编辑2
经过长时间的努力,问题仍然没有解决,但我做了一些实验。
由于读取的特性既可读又可写,我试着写一些东西,只是为了看看会发生什么。
readCharacteristic
出乎意料的是,它会产生一个DeadObjectException并退出。这很奇怪,可能是导致问题的一些线索。而且我也认为上面日志中的syncDataOutputChar = {android.bluetooth.BluetoothGattCharacteristic@830030678056}
mDescriptors = {java.util.ArrayList@830030679448} size = 0
mValue = null
mUuid = {java.util.UUID@830030680416}"0000ffab-0000-1000-8000-00805f9b34fb"
mService = {android.bluetooth.BluetoothGattService@830031005904}
mProperties = 10
mPermissions = 0
mKeySize = 16
mInstance = 0
mWriteType = 2
也值得挖掘。