问题:在运行 Android 10 的三星设备 (S10e) 上设置 MTU>23 并将数据写入特征后,连接超时并关闭。
根本原因:超时的原因是电话硬件实际上没有发送任何东西......所以终端设备没有响应(确认)。
我怎么知道这不是终端设备问题:其他设备(像素)不会出现此问题,如果运行 Android 9,S10 也不会出现此问题。
详情:我们在BluetoothGatt中使用requestMtu将MTU改为185,然后onMtuChanged返回mtu值为185,状态为GATT_SUCCESS。当我们发送大约 40 个字节的较长消息时,BluetoothGatt 的 writeCharacteristic 的返回值为 true,但是 onCharacteristicWrite 回调会给我们一个 133 状态码,这不是 GATT_SUCCESS。然后设备将断开连接。
为什么我需要更大的 MTU:我们期望能够使用更大的 MTU,以便我们可以将数据发送到终端设备以提供 Wi-Fi 凭据。终端设备被构建为一次只接受所有凭据(假设 MTU>23 不会成为问题。所以我们有客户无法使用的现场设备。
问题:有什么想法或解决方法可以尝试吗?
手机信息:三星 s10e 操作系统:Android 10 Android 安全补丁:2020 年 3 月 1 日
终端设备信息:ESP32
我试图检查客户端是否丢失了连接,以便我可以关闭客户端连接,允许客户端重新连接。
我有以下内容。
$socket = @socket_create_listen("12345");
while (true) {
$client = socket_accept($socket);
socket_write($client, 'hello');
while (true) {
//Code to exit this loop when client looses connection
socket_write($client, '');
echo socket_last_error($socket);
}
socket_close($client);
}
Run Code Online (Sandbox Code Playgroud)
试图:
[1] 向客户端写入一个空字符串,希望如果客户端断开连接会产生错误,但这不起作用。
[2] 使用 ocket_select
$r = array($socket);
$w = NULL;
$e = NULL;
if (false === socket_select($r, $w, $e, 0)) {
echo "socket_select() failed, reason: " .
socket_strerror(socket_last_error()) . "\n";
}
Run Code Online (Sandbox Code Playgroud)
这似乎也没有产生错误,然后客户端失去连接。
注意:我试图在服务器端完成此操作,因此发送一点并等待回复并不是我真正想要的。通常我只是写给客户端而不接收数据,因此在阻塞中运行我的代码不是问题,因为我通常在写而不是读。