从 Bluez 5.48 开始,iPhone 在连接 BLE GAP 外围设备时需要配对,为啥?
Posted
技术标签:
【中文标题】从 Bluez 5.48 开始,iPhone 在连接 BLE GAP 外围设备时需要配对,为啥?【英文标题】:Since Bluez 5.48, iPhones require pairing when connecting on a BLE GAP peripheral, why?从 Bluez 5.48 开始,iPhone 在连接 BLE GAP 外围设备时需要配对,为什么? 【发布时间】:2020-03-31 12:41:20 【问题描述】:我有一个使用 Bluez 5.X 和 DBus 在嵌入式设备上运行的应用程序。
我的应用程序将具有“NoInputNoOutput”功能的代理和适配器设置为不可配对(我不想配对)。
我的嵌入式设备不启动连接(GAP 外围设备)和广播广告(GATT 服务器)。
使用 BlueZ 5.48(和 5.52),当我尝试从 android 设备连接到我的嵌入式设备时,一切正常,但是当我尝试使用 iOS 时,连接会在一段时间后丢失并且在btmon工具中有以下日志:
> ACL Data RX: Handle 68 flags 0x02 dlen 9 #1050 [hci0] 398.940027
ATT: Error Response (0x01) len 4
Read Request (0x0a)
Handle: 0x0016
Error: Insufficient Authentication (0x05)
< ACL Data TX: Handle 68 flags 0x00 dlen 7 #1051 [hci0] 398.940268
ATT: Read Request (0x0a) len 2
Handle: 0x0016
> ACL Data RX: Handle 68 flags 0x02 dlen 9 #1052 [hci0] 398.991500
ATT: Error Response (0x01) len 4
Read Request (0x0a)
Handle: 0x0016
Error: Insufficient Authentication (0x05)
如果我的应用程序将适配器设置为可配对(但我不想要),我会在 iPhone(不是安卓)上弹出一个窗口,以授权配对
信息:
BlueZ 5.47 没有这个问题 我没有在 iPhone 的常规蓝牙中看到我的嵌入式设备 “设备”列表。 即使我的应用程序没有设置任何 特点我没有发现(在 ChangeLog 和 git 中)自 BlueZ 5.47 以来的更改,这会导致此问题。有什么想法吗?
我认为 iPhone 上有一个 GATT 服务器,因为我可以看到许多在连接时在 DBus 上注册的对象。即使我设置了具有“读取加密”权限(nRF Connect)的特性的 GATT 服务器,我也没有这个问题。
我的分析:
在 Iphone 上,我启动了与嵌入式设备的连接
我的嵌入式设备尝试读取某些内容(受保护的特征 ?) 在 iPhone 上(不行!!为什么?)
iPhone 拒绝“加密不足”(?)
我的嵌入式设备发送“安全请求”
Iphone 发送“配对请求”
我的嵌入式拒绝“不支持原因配对”
编辑: 弹出窗口出现提交“客户端:将 set-filter-uuids 重命名为 uuids”(e1021f7e486ebd6c0618673a758fa2c50d81109c)(在 Bluez 5.47 和 5.48 之间)
【问题讨论】:
你能弄清楚它试图读取哪个属性吗? 【参考方案1】:这有点晚了,但希望这可以帮助遇到同样问题的其他人。
在将电池 GATT 特性移至 DBUS org.bluez.Battery1 interface 后,Bluez v5.48 开始出现此问题。
解决此问题的最简单方法是阻止 Bluez 电池插件在启动时加载。您需要修改位于以下路径的蓝牙服务文件: /lib/systemd/system/bluetooth.service 。在此文件中,转到以“ExecStart”开头的行并确保该行具有“ExecStart=/usr/lib/bluetooth/bluetoothd -P battery”(不带引号)。这个-P选项prevents any listed plugins from loading。
解决此问题的另一种方法是编写您自己的自定义代理来自动接受配对请求。我使用了Bluez simple-agent example 并对其进行了修改,以便 RequestPinCode 函数始终成功返回,而不是要求输入。这种方法的缺点是它仍然要求 ios 用户进行配对。不过,如果您想通过完全配对的蓝牙连接获得可靠性和加密访问,这可能是一个积极的结果。
【讨论】:
这是我的问题。谢谢你。 Gatt Server 在 Android 上运行完美,但在 Iphone 上一直要求配对,即使注册代理使用“NoInputNoOutput”。【参考方案2】:我的程序不正确(弹出窗口没有出现在提交“客户端:将 set-filter-uuids 重命名为 uuids”:“客户端”对应于“bluetoothctl”,与我的使用无关) .
实际上,弹出窗口与电池模块一起出现。 我不知道为什么,但我对这个解决方法很满意(适用于 Bluez 5.48 和 5.52):
在“Makefile.plugins”文件中,删除以下行:
builtin_modules += battery
builtin_sources += profiles/battery/battery.c
并强制将 automake 放入您的“bluez5_utils.mk”:
BLUEZ5_UTILS_AUTORECONF = YES
感谢 Emil 考虑我的问题。 我比较了在连接期间获得的日志“/var/log/message”,有无弹出:唯一的区别是:
这些行仅在与弹出窗口连接期间出现:
profiles/battery/battery.c:batt_probe() BATT profile probe (6E:FA:33:75:2A:6A)
src/service.c:change_state() 0x8c17200: device 6E:FA:33:75:2A:6A profile batt-profile state changed: unavailable -> disconnected (0)
profiles/battery/battery.c:batt_accept() BATT profile accept (6E:FA:33:75:2A:6A)
src/service.c:change_state() 0x8c17200: device 6E:FA:33:75:2A:6A profile batt-profile state changed: disconnected -> connected (0)
而且这些行只在连接过程中出现,没有弹出:
src/gatt-client.c:service_create() Exported GATT service: /org/bluez/hci0/dev_6E_FA_33_75_2A_6A/service0014
src/gatt-client.c:characteristic_create() Exported GATT characteristic: /org/bluez/hci0/dev_6E_FA_33_75_2A_6A/service0014/char0015
src/gatt-client.c:descriptor_create() Exported GATT characteristic descriptor: /org/bluez/hci0/dev_6E_FA_33_75_2A_6A/service0014/char0015/desc0017
【讨论】:
我正在从他们网站上的 tarball 安装 bluez。我修改了 Makefile.plugins,但没有看到任何 bluez5_utils.mk。在我制作并安装该修改后,句柄 0x0016 仍然会引发重复错误。也许是因为我错过了那个 .mk 文件。以上是关于从 Bluez 5.48 开始,iPhone 在连接 BLE GAP 外围设备时需要配对,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
在连接到热点时通过 iPhone 连接到 localhost
iPhone - 数据 URI(css 背景图像)仅在连接到 WIFI 时有效