Android BLE:onCharacteristicRead 仅在第一次工作

Posted

技术标签:

【中文标题】Android BLE:onCharacteristicRead 仅在第一次工作【英文标题】:Android BLE: onCharacteristicRead works only first time 【发布时间】:2018-10-31 14:13:17 【问题描述】:

Gatt 通信仅在第一次使用时才有效。 我已经阅读了很多与此相关的问题,但没有任何解决方案有帮助。 整个过程: 1.重启手机 2. 运行应用程序 3. 应用程序连接到 BLE 设备并获取可访问的 Wifi 网络列表 (SdkGattAttributes.WIFI_CHAR_WIFI_LIST) 到目前为止一切正常 4. 重启应用 5. 应用程序连接到设备并尝试获取 wifi 列表,但从未收到onCharacteristicRead。没有 writeCharacteristic 在此之前发送 6.手机重启后应用程序能够获取wifi列表但只能再次获取一次 有什么问题。一些资源释放还是什么?如果需要,我可以发布一些代码。 提前致谢。

【问题讨论】:

我有一个类似的问题,我会连接到一个设备,调用一个特性,然后不断开连接。然后我会尝试另一个连接,但无法从相同的特征中获取我的数据。解决方案是在我对特征进行读取或写入操作后显式断开连接 感谢您的努力,但没有帮助。 【参考方案1】:

我最终找到了解决方案,所以我在这里发布给其他人。

问题是在连接成功后 MTU 设置为 mBluetoothGatt.requestMtu(512) 并且服务被请求mBluetoothGatt.discoverServices() 一个接一个地请求,这可能会混淆 gatt。

public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) 
    if (newState == BluetoothProfile.STATE_CONNECTED) 
        mBluetoothGatt.discoverServices();
        mBluetoothGatt.requestMtu(512);
    

解决方案: 首先请求 mtu,完成后发现服务

public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) 
    if (newState == BluetoothProfile.STATE_CONNECTED) 
        mBluetoothGatt.requestMtu(512);
    

public void onMtuChanged (BluetoothGatt gatt, int mtu, int status) 
    if (status == BluetoothGatt.GATT_SUCCESS) 
        mBluetoothGatt.discoverServices();
    

【讨论】:

【参考方案2】:

如果需要,不要忘记在onCharacteristicWriteRequest 中发送回复:

if (responseNeeded) 
            bluetoothGattServer?.sendResponse(device,
                    requestId,
                    BluetoothGatt.GATT_SUCCESS,
                    offset,
                    value)
        

还有一种可能,如果你发送的数据没有一次收到(preparedWrite为真,有特定的偏移量),你需要在数据完全收到后在onExecuteWrite上处理并发送响应。

bluetoothGattServer?.sendResponse(device,
                requestId,
                BluetoothGatt.GATT_SUCCESS,
                0,
                ByteArray(0))

【讨论】:

感谢您的努力,但没有帮助。

以上是关于Android BLE:onCharacteristicRead 仅在第一次工作的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用支持 BLE 的 Android/iPhone 作为 BLE 信标?

android BLE Peripheral 手机模拟设备发出BLE广播 BluetoothLeAdvertiser

android BLE Peripheral 手机模拟设备发出BLE广播 BluetoothLeAdvertiser

Android BLE 库分享

Android 10 BLE 连接问题

Android BLE 通知