当前位置: 首页 > 面试题库 >

onCharacteristicwrite中的Android蓝牙状态133

南宫俊逸
2023-03-14
问题内容

我是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状态为status的语句0,这表示成功。问题是if语句中的第二次写操作,这还将触发onCharacteristicWrite函数,但会产生一个状态133,该状态在官方网站上找不到。然后,设备会自动断开连接。

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

我一直在寻找结果。一些结果将我引导到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


问题答案:

当我尝试写入某些特征时,我也遇到了类似的问题,但是我是否记得相同的错误代码。 (它可以在某些设备上运行,而不能在其他设备上运行)。

原来是问题property出在characteristics和的writeType

由于特征可以设置值:

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


 类似资料:
  • 获取手机蓝牙开启状态, 未授权时先授权再check 示例代码 Swift: RokidMobileSDK.binder.enableBLE() Objc: [RokidMobileSDK.binder enableBLE]; 在 SDKBinderObserver 实现类中的 onBLEEnabled() 函数 获取蓝牙开启状态。 Swift: // 手机蓝牙状态变更,用户是开起来了蓝牙功能

  • 查询蓝牙状态 接口说明 查询手机蓝牙状态,是否打开。 举个大栗子: boolean btStatus = RokidMobileSDK.binder.getBTStatus() 注册蓝牙状态监听器 接口说明 监听手机蓝牙状态发生改变,手机蓝牙打开 或者 关闭都会调用这个函数。 举个大栗子: RokidMobileSDK.binder.registerBTStateChangeListener(n

  • Hy,我们正在通过蓝牙开发android多人游戏。这是一款多人LUDO游戏,其中4名玩家相互连接并进行游戏。 我们被困在第三和第四名球员的连接。 上面是建立连接的示例代码。但是在连接服务类中,我们有以下代码 当移动设备连接到第三个或第四个设备时,它返回myBSock==null。但是如果代码正常工作,它必须返回设备的地址,并且应该将mBtDeviceAddresses.add(设备);添加到服务器

  • ap.getBluetoothAdapterState(OPTION, CALLBACK) 获取本机蓝牙模块状态。 CALLBACK 参数说明 名称 类型 描述 discovering Boolean 是否正在搜索设备 available Boolean 蓝牙模块是否可用(需支持 BLE 并且蓝牙是打开状态) 错误码说明 error 描述 12 获取失败 代码示例 <script src="htt

  • 有没有办法在Android上ping蓝牙设备?Android中没有连接或配对蓝牙设备,但我事先知道设备的MAC地址和PIN。我试图实现的是ping一个MAC地址列表,看看是否有任何设备在范围内。

  • ap.onBluetoothAdapterStateChange(CALLBACK) 监听本机蓝牙状态变化的事件。 CALLBACK 参数说明 名称 类型 描述 available Boolean 蓝牙模块是否可用 discovering Boolean 蓝牙模块是否处于搜索状态 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/