我是Android新手,现在正在做一个简单的应用程序,需要将一些数据写入外围设备。
三星GT-S7272C设备实际上没有出错。但是当我切换到Sony LT29i时,当我试图写入某个特征时,总会有状态133。我会给出一些简短的代码。
BluetoothGattService syncService = gatt.getService(SYNC_DATA_SERVICE);
BluetoothGattCharacteristic tChar = syncService.getCharacteristic(SYNC_TIME_INPUT_CHAR);
if (tChar == null) throw new AssertionError("characteristic null when sync time!");
int diff = /*a int*/;
tChar.setValue(diff, BluetoothGattCharacteristic.FORMAT_SINT32, 0);
gatt.writeCharacteristic(tChar);
和onCharacteristicWrite函数:
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
Log.d(TAG, String.format("Sync: onCharWrite, status = %d", status));
try {
if (status != BluetoothGatt.GATT_SUCCESS) throw new AssertionError("Error on char write");
super.onCharacteristicWrite(gatt, characteristic, status);
if (characteristic.getUuid().equals(SYNC_TIME_INPUT_CHAR)) {
BluetoothGattService syncService = gatt.getService(SYNC_DATA_SERVICE);
BluetoothGattCharacteristic tChar = syncService.getCharacteristic(SYNC_HEIGHT_INPUT_CHAR);
if (tChar == null) throw new AssertionError("characteristic null when sync time!");
tChar.setValue(/*another int*/, BluetoothGattCharacteristic.FORMAT_SINT32, 0);
gatt.writeCharacteristic(tChar);
}
else if {
...
}
} catch (AssertionError e) {
...
}
写入第一个特征没有任何错误,控制将到达onCharacteristicWrite并输入状态为if
的第一个0
语句,这意味着成功。问题是if
语句中的第二个写操作,它还会触发onCharacteristicWrite函数,但会产生状态133
,这在the official site中找不到。然后设备自动断开连接。
我确认数据类型和偏移都是正确的。而且因为在另一个设备中它工作得非常好,我认为不同设备之间的蓝牙堆栈实现可能存在一些微小的差异,我应该做一些更难以解决这个问题的事情。
我已经搜索了很长时间的结果。一些结果将我引向C源代码(对不起,我将在下面发布链接,因为我没有足够的声誉发布超过2个链接),但我只能发现133
表示GATT_ERROR ,这比133
更有帮助。我也在google小组中发现了一个问题,讨论了一些熟悉的问题,但我在这里找不到解决方案。
我有点难过,因为如果C代码有问题,即使我能找到错误的内容,我仍无法在我自己的代码中做到正确,对吧?
我希望有人以前有过熟悉的经历,可能会给我一些建议。非常感谢!
链接:
C源代码:https://android.googlesource.com/platform/external/bluetooth/bluedroid/+/android-4.4.2_r1/stack/include/gatt_api.h
问题:https://code.google.com/p/android/issues/detail?id=58381
答案 0 :(得分:6)
当我尝试写一些特征时,我遇到了类似的问题,但是如果我得到相同的错误代码,我就不记得了。 (它在某些设备上工作,但在其他设备上却没有。)
问题是property
和characteristics
的{{1}}。
因为特征可以设置值:
writeType
或write without response
在参考此属性时,您必须在将实际数据写入特征之前设置write with response
。
您可以在获得“特征”之后但在写入之前设置类型。
writeType
答案 1 :(得分:4)
这里是错误/成功状态代码和含义
GATT_ILLEGAL_PARAMETER
0x0087
(135)GATT_NO_RESOURCES
0x0080
(128)GATT_INTERNAL_ERROR
0x0081
(129)GATT_WRONG_STATE
0x0082
(130)GATT_DB_FULL
0x0083
(131)GATT_BUSY
0x0084
(132)GATT_ERROR
0x0085
(133)GATT_CMD_STARTED
0x0086
(134)GATT_PENDING
0x0088
(136)GATT_AUTH_FAIL
0x0089
(137)GATT_MORE
0x008a
(138)GATT_INVALID_CFG
0x008b
(139)GATT_SERVICE_STARTED
0x008c
(140)GATT_ENCRYPED_MITM
GATT_SUCCESS
GATT_ENCRYPED_NO_MITM
0x008d
(141)GATT_NOT_ENCRYPTED
0x008e
(142)答案 2 :(得分:2)
对于那些因为状态133 onCharacteristicWrite而可能找到这篇文章的人,我发现我们得到这133个结果因为远程设备断开连接。我在Android方面失去了很多时间寻找问题,后来才发现问题出在另一边。
从此我收集到status = 133似乎是某种undocumented错误的一般原因。
答案 3 :(得分:2)
在我的情况下,我需要在新活动中重用活动Gatt连接但是不能并且经常与错误133断开连接。
因此,我在BluetoothGatt.close()
之前呼叫startActivity()
,并在onStart()
中(重新)连接。
如果有人对如何保持连接有更好的了解,请发帖。
答案 4 :(得分:0)
我遇到了与错误 133 相同的问题,我不得不使用可靠的写入来使其工作(抱歉使用 Kotlin 代码而不是 Java):
fun BluetoothGatt.myWrite(characteristic: BluetoothGattCharacteristic, payload: ByteArray) {
// Set write type
characteristic.writeType = when {
characteristic.containsProperty(BluetoothGattCharacteristic.PROPERTY_WRITE) -> BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT
characteristic.containsProperty(BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) -> BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE
else -> error("Characteristic ${characteristic.uuid} cannot be written to")
}
// set the payload
characteristic.setValue(payload)
// write
this.beginReliableWrite()
this.writeCharacteristic(characteristic)
this.executeReliableWrite()
}
使用扩展功能:
fun BluetoothGattCharacteristic.containsProperty(property: Int): Boolean {
return properties and property != 0
}