2024 年 5 月 9 日在墨尔本的/dev/world的演讲记录与幻灯片,主题为“Bluetooth Low Energy On All The Things”,视频可在 AUC 的 YouTube 频道观看。
- 离线优先应用与 BLE 的优势:介绍离线优先应用概念,即使离线也能工作并同步数据,BLE 可实现客户端在未连接服务器时协作共享数据,提升用户体验,BLE 范围广、无需持续交互、可后台运行且跨平台兼容,但速度相对较慢且使用较复杂。
- BLE 工作原理:BLE 设备有“中央”(客户端)和“外围”(服务器)两种角色,现代 iPhone 开放状态下范围超 100 米,可创建大型设备 mesh。连接时 BLE 基于 GATT 协议,特性可组织为服务并由 UUID 标识,特性数据量小,需分段传输,可通过 L2CAP 协议提供可靠数据流,类似 TCP,iOS 11 和 Android 10 才支持 L2CAP,若仅针对 iOS 和 Mac 开发,可忽略 GATT 直接使用 L2CAP,若支持 Android 6 及以下则需兼容 GATT。
六个棘手领域及建议:
- 广告内容:Core Bluetooth 对广告内容控制有限,可利用服务 UUID 确定感兴趣的设备,避免随意连接,iOS 可在本地名称字段写入设备标识,Android 可在制造商数据中写入,接收广告时检查两字段。
- 设备识别与追踪:BLE 广告标识基于设备传输的 MAC 地址,手机会使用随机 MAC 地址并动态旋转,导致难以确定设备是否相同,可在本地名称或制造商数据中加入唯一值用于追踪,同时注意广播和接收的数据不可信,需在建立安全连接后传输敏感数据。
- 认证与加密:BLE 有自身安全机制,通常涉及配对,应配置为不安全模式,使用不安全的 L2CAP 通道和特性,在应用层提供安全层,可选择 Mutual TLS 或 Noise Protocol,前者适用于有中央账户注册的情况,后者适用于临时建立信任关系的情况。
- 打开 L2CAP 通道:作为外围设备(类似服务器)可打开监听接收连接请求,客户端需指定类似端口号的 PSM,iOS 和 Android 上 PSM 动态分配为 192,可在服务的额外特性中或广告中传输 PSM 值,以实现从 GATT 到 L2CAP 的升级。
- 选择连接对象:作为外围设备无法控制连接,需制定中心设备连接的策略和规则,例如根据接收广告的速率判断设备是否稳定,选择合适的设备连接,避免不必要的连接浪费连接槽,可在本地名称字段中加入 tiebreaker 用于确定连接角色。
- 后台模式:开启 Xcode 中的后台模式以实现应用在后台与其他设备共享数据,但 iOS 对后台模式的蓝牙通信有诸多限制,如广告频率降低、扫描周期缩短、应用标识变化等,这些限制可能导致设备发现时间延长,但用户体验在无网络时仍很有趣,应用在后台被唤醒后可同时进行蓝牙和 peer-to-peer WiFi 通信。
- 跨平台 BLE 实现:在 Ditto SDK 中支持多种 SDK 目标,如 Android、Windows、Mac、WASM 等,将大部分逻辑推到用 Rust 编写的公共核心代码中,针对每个平台使用平台特定的驱动,如 Objective C(Apple)、Kotlin(Android)、windows-rs crate(Windows)、DBus(Linux),通过抽象通用接口实现跨平台访问 BLE 功能,避免代码重复。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。