Android 蓝牙状态 133 onCharacteristicwrite [英] Android Bluetooth status 133 in onCharacteristicwrite

查看:62
本文介绍了Android 蓝牙状态 133 onCharacteristicwrite的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm new to Android and now doing a simple app that requires writing some data into a peripheral device.

实际上三星 GT-S7272C 设备没有任何问题.但是当我切换到 Sony LT29i 时,当我尝试写入某个特性时,总会出现状态 133.我会给出一些简短的代码.

Actually nothing goes wrong in a Samsung GT-S7272C device. But when I switch to Sony LT29i, there will always be a status 133 when I'm trying to write into a certain characteristic. I will give out some brief code.

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 函数:

and the onCharacteristicWrite function:

@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并进入第一个状态为0if语句,表示成功.问题是 if 语句中的第二个写入操作,它也会触发 onCharacteristicWrite 函数,但会产生状态 133,在 官方网站.然后设备自动断开连接.

Writing into first characteristic has nothing wrong and control will reach the onCharacteristicWrite and enter the first if statement with status 0, which means success. Problem is the second writing action in the if statement, which will also trigger onCharacteristicWrite function but yield a status 133, which cannot be found in the official site. Then the device disconnect automatically.

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

I've confirmed that the data type and the offset are all correct. And because in another device it works really nice, I think there might be some tiny differences of the bluetooth stack implementation between different device that I should do something more tricky to solve this problem.

我已经搜索了很长时间的结果.一些结果让我找到了 C 源代码(抱歉,我会发布下面的链接,因为我没有足够的声誉发布 2 个以上的链接),但我只能发现 133 表示 GATT_ERROR在那里,这并不比 133 更有帮助.我也在google group里发现了一个issue,讨论了一些熟悉的问题,但是在这里没找到解决办法.

I've search for result for a long time. Some results lead me to the C source code(Sorry, I will post the link below because I don't have enough reputation to post more than 2 links), but I can only find that 133 means GATT_ERROR there, which is not more helpful than just a 133. I've also found a issue in google group, discussing some familiar questions, but I failed to find a solution here.

我有点难过,因为如果 C 代码有问题,即使我能找到问题所在,我仍然没有办法在我自己的代码中改正,对吧?

I'm a little bit sad because, if it is something wrong with the C code, even if I can locate what's wrong, I still have no way to make it right in my own code, right?

希望有人有熟悉的经验,可以给我一些建议.非常感谢!

I hope that someone has the familiar experience before and may give me some suggestions. Thanks a lot!

链接:

  • 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

推荐答案

当我尝试写入一些我不记得的特性时,我遇到了类似的问题,尽管我是否遇到了相同的错误代码.(它在某些设备上有效,而在其他设备上无效).

I had a similar issue when I tried to write to some characteristic I can't remember though if i got the same error code or not. (And it worked on some devices while it didn't on others).

问题出在characteristicswriteTypeproperty.

因为特征可以设置值:

  • 无响应写入 OR
  • 写有响应

参考此属性,您必须在将实际数据写入特征之前设置 writeType.

In reference to this property you have to set the writeType before writing the actual data to the characteristic.

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

You can set the type once you get the Characteristic but before writing to it.

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

这篇关于Android 蓝牙状态 133 onCharacteristicwrite的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆