onCharacteristicwrite中的Android蓝牙状态133

时间:2014-09-17 11:01:33

标签: java android bluetooth bluetooth-lowenergy

我是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

5 个答案:

答案 0 :(得分:6)

当我尝试写一些特征时,我遇到了类似的问题,但是如果我得到相同的错误代码,我就不记得了。 (它在某些设备上工作,但在其他设备上却没有。)

问题是propertycharacteristics的{​​{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
}