安卓蓝牙状态 133 在字符写入

我是Android的新手,现在做一个简单的应用程序,需要将一些数据写入外围设备。

实际上,三星GT-S7272C设备中没有任何问题。但是当我切换到索尼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) {
        ...
    }

写入第一个特征没有错,控制将到达 on 字符写入并输入第一个语句 状态 ,这意味着成功。问题是语句中的第二个写入操作,它也会触发 onCharacteristicWrite 函数,但会产生状态 ,这在官方网站上找不到。然后设备自动断开连接。if0if133

我已确认数据类型和偏移量都正确。而且由于在另一台设备中它的工作效果非常好,我认为不同设备之间的蓝牙堆栈实现可能存在一些微小的差异,我应该做一些更棘手的事情来解决这个问题。

我搜索结果已经很长时间了。一些结果将我引向C源代码(对不起,我将发布下面的链接,因为我没有足够的声誉来发布超过2个链接),但我只能找到这意味着GATT_ERROR那里,这并不比仅仅一个更有用。我也在谷歌小组中发现了一个问题,讨论了一些熟悉的问题,但我在这里找不到解决方案。133133

我有点难过,因为如果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


答案 1

当我试图写到一些我不记得的特征时,我遇到了类似的问题,尽管我是否得到了相同的错误代码(它在某些设备上有效,而在其他设备上不起作用)。

事实证明,问题在于 和 .propertycharacteristicswriteType

因为特征可以设置值:

  • write without response
  • write with response

在引用此属性时,您必须在将实际数据写入特征之前设置 。writeType

您可以在获得特征后但在写入之前设置类型。

BluetoothGattCharacteristic tChar = syncService.getCharacteristic(SYNC_HEIGHT_INPUT_CHAR);
        if (tChar == null) throw new AssertionError("characteristic null when sync time!");

        // use one of them in regards of the Characteristic's property
        tChar.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
        //tChar.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);


        tChar.setValue(/*another int*/, BluetoothGattCharacteristic.FORMAT_SINT32, 0);
        gatt.writeCharacteristic(tChar);

答案 2

此处的错误/成功状态代码和含义

  • 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)

推荐