小编tyl*_*ler的帖子

三星 Android 10 BLE MTU>23 问题

问题:在运行 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

android bluetooth samsung-mobile kotlin bluetooth-lowenergy

9
推荐指数
1
解决办法
1657
查看次数

确定客户端是否使用套接字关闭了与服务器的连接

我试图检查客户端是否丢失了连接,以便我可以关闭客户端连接,允许客户端重新连接。

我有以下内容。

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

这似乎也没有产生错误,然后客户端失去连接。

注意:我试图在服务器端完成此操作,因此发送一点并等待回复并不是我真正想要的。通常我只是写给客户端而不接收数据,因此在阻塞中运行我的代码不是问题,因为我通常在写而不是读。

php sockets apache ubuntu websocket

5
推荐指数
1
解决办法
3209
查看次数