Android 10 L2CAP 连接 IOException 超时 Wii 平衡板

Posted

技术标签:

【中文标题】Android 10 L2CAP 连接 IOException 超时 Wii 平衡板【英文标题】:Android 10 L2CAP connection IOException timeout Wii Balance Board 【发布时间】:2020-05-16 16:01:05 【问题描述】:

背景

很久以前,我的任务是为 Wii 平衡板制作一个 android 应用程序,经过一番折腾后,我发现 android 不再支持 L2CAP。更多 research 导致了解它正在 Android 10 中重新添加。随着 Android 10 的推出,我现在一直在尝试破解它。

问题

所以我目前的简单目标是创建与 Wii 平衡板的连接。

我的连接方法是:

开始发现

将发现的蓝牙设备添加到列表中

当你点击一个设备时,它会尝试像这样打开一个套接字:

bluetoothSocket = btDevice.createInsecureL2capChannel(port);

正如WiiBrew 网站上所述,我使用 psm 值 0x13 作为输入,使用 0x11 作为输出。

然后我使用bluetoothSocket.connect 并继续接收 IOException(超时错误)

我也尝试过同时使用createL2capChannelcreateInsecureL2capChannel,结果相同

我能够成功地使用btDevice.createBond() 与设备配对,然后将手机的BT 地址向后使用.setpin(),Wii 平衡板只是充当“哑”输入设备。 (不确定是否需要配对/好主意)

以上是我尝试连接的简化流程。我还尝试使用 Paul Burton 的 fitscales 存储库中的 BalanceBoard.java 更新所有旧蓝牙代码,但我仍然会超时。

【问题讨论】:

【参考方案1】:

您查看过 bt_stack 日志吗?

这是我尝试用 wiimote 打开套接字的过程:

04-05 12:25:04.949 E/bt_stack(4895): [ERROR:btif_sock_l2cap.cc(244)] SOCK_LIST: free(id = 4) - NO app_fd!
04-05 12:25:04.949 I/bt_stack(4895): [INFO:btsnoop.cc(323)] clear_l2cap_whitelist: Clearing whitelist from l2cap channel. conn_handle=65535 cid=65:0
04-05 12:25:04.949 E/bt_l2cap(4895): L2CA_FreeLePSM: Invalid PSM=19 value!
04-05 12:25:40.141 I/bt_stack(4895): [INFO:btsnoop.cc(323)] clear_l2cap_whitelist: Clearing whitelist from l2cap channel. conn_handle=1 cid=66:64
04-05 12:25:55.736 I/bt_stack(4895): [INFO:btsnoop.cc(323)] clear_l2cap_whitelist: Clearing whitelist from l2cap channel. conn_handle=2 cid=67:65

我相信这就是问题所在,我只是一个新手,所以我不确定可以做些什么。我知道旧的连接方式将 fd 作为参数传递给蓝牙套接字构造函数,但我认为这不再可能了

【讨论】:

仅供参考,在此文件中生成了无效的 PSM 值错误:android.googlesource.com/platform/system/bt/+/master/stack/…,并且 PSM 范围限制为 0x80 到 0xFF。范围常量在此文件中:android.googlesource.com/platform/system/bt/+/refs/heads/master/…,您可以看到它们定义为 LE_DYNAMIC_PSM_START 和 LE_DYNAMIC_PSM_END。

以上是关于Android 10 L2CAP 连接 IOException 超时 Wii 平衡板的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中实例化 L2Cap 套接字?

13.3.1 QBluetoothSocket类介绍

蓝牙 LE - 安卓上的 L2CAP CO 通道

2 个设备之间的并发 L2CAP 和/或 GATT 连接

蓝牙的L2CAP协议

L2CAP IOS + Linux (Bluez)