发布:在三星设备(S10e)上设置MTU>23后,运行Android10并将数据写入到连接超时和关闭的特性中。
根原因:超时的原因是手机硬件实际上没有发送anything...so,终端设备没有响应(Ack)。
,我怎么知道它不是终端设备问题,:这个问题不发生在其他设备(像素)上,如果它运行Android9,也不会在S10上发生。
Details:我们使用BluetoothGatt中的requestMtu将MTU更改为185,然后onMtuChanged返回mtu值为185,状态为GATT_SUCCESS。当我们发送长度约为40字节的消息时,writeCharacteristic of BluetoothGatt的返回值为真,但onCharacteristicWrite回调将给出133个状态代码,而不是GATT_SUCCESS。然后设备就会断开。
为什么我需要一个更大的MTU:我们期望的是能够使用一个更大的MTU,这样我们就可以将数据发送到终端设备来提供Wi凭据。终端设备的构建是为了一次只接受凭证(假设MTU>23不会成为问题)。所以我们有客户不能使用的现场设备。
问题:我们有什么想法或解决办法可以尝试吗?
手机信息:三星s10e Os: Android 10 Android安全补丁:2020年3月1日
终端设备信息: ESP32
发布于 2021-09-07 13:05:34
我没有使用三星设备,但我在Sunmi设备上也有同样的问题,显然问题是试图发送完整的MTU或任何接近这个值的值。如果我协商512并试图发送512,我将得到133状态,然后是断开连接,但是如果我协商512并发送500字节,则整个过程运行良好。现在我正在使用这个公式,但我只测试了MTU协商值512的情况:
private int getMtu() {
return Math.max(GattClient.DEFAULT_MTU, (int)(this.mtu * .99));
}其想法是,您总是发送至少20个字节,因为这是很好的工作,即使MTU不是谈判。除此之外,我只发送了99%的MTU。我再也得不到133的地位了。
发布于 2021-04-21 15:58:13
这不是你的代码的问题,而是三星的BLE栈的问题。本质上,三星在调用setMTU方法时什么也不做。允许写入正确工作的方法是等待133状态代码,等待设备断开,然后调用BLE connect方法并再次尝试写入。调用其他BLE方法可能再次导致失败。逻辑应如下所示:
写到特征。如果onCharacteristicWrite中的状态为133,则等待设备断开连接。调用connect方法。连接后,重试写(可能会出现进程的指数退避)。
https://stackoverflow.com/questions/61098739
复制相似问题