我尝试通过蓝牙低功耗 GATT 模式将 android 连接到 linux。
Bluez中有一个示例代码:btgatt-server.c http://code.metager.de/source/xref/linux/bluetooth/bluez/tools/btgatt-server.c?r=61a4a47df67fcc8fd71d1acda28ee2b28219ffa0,我用它作为服务器。
Android 端如下Android官方示例:连接到GATT服务器 https://developer.android.com/guide/topics/connectivity/bluetooth-le.html。即,使用函数BluetoothDevice::connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)。
运行后,Android部分返回连接成功(BluetoothGattCallback::onConnectionStateChange参数为STATE_CONNECTED),但linux中的程序(btgatt-server)没有得到任何响应,仍然阻塞在等待接受。
(第 485 行)。
我还使用了另一个示例代码:l2cap-ble.c https://github.com/sandeepmistry/noble/blob/master/src/l2cap-ble.c,结果完全一样。
有人可以帮助我吗?我的目标是:连接后,linux gatt 服务器将向 Android 发送数据。然后断开连接。
非常感谢。
我刚刚面临同样的问题。
这似乎是 Android 和 Broadcom 蓝牙模块发生的错误。 Android 以某种方式连接到错误的 l2cap 通道。
解决方法是明确禁用 BR/EDR广告中的支持。
google 上的 bug 报告和 #8 的解决方案可以找到here https://code.google.com/p/android/issues/detail?id=58896#c8,引用对我有帮助的提示:
我已从 Broadcom 获得了有关此错误的信息,但我认为这不是他们的错误。如果未在通告中专门设置“BR/EDR 不支持”位(位 2),则 Broadcom 堆栈将使用 BR/EDR 和 BTLE。
将领先的广告包从 020102 更改为 020106 解决了该问题。
使用蓝色btmgmt为了在设备 hci0 上配置广告,我发出以下命令:
btmgmt -i hci0 power off
btmgmt -i hci0 le on
btmgmt -i hci0 connectable on
btmgmt -i hci0 bredr off # Disables BR/EDR !
btmgmt -i hci0 advertising on
btmgmt -i hci0 power on
启动 bluez btgatt-server 示例:
btgatt-server -i hci0 -s low -t public -r -v
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)