Web Bluetooth 与点对点连接
前言
需求需要实现手持终端设备与 web 网页的点对点数据传输,不希望有服务器参与,想到了 web 的 USB 与 Bluetooth API,对 Web Bluetooth API 进行了研究。
蓝牙 GATT 基础知识
GATT(通用属性配置文件,蓝牙低功耗(BLE)中定义的一种规范)定义了如何在蓝牙低功耗设备之间进行数据的传输和交互。它规定了蓝牙设备之间的数据格式、通信协议以及数据的组织方式。通过 GATT,不同的蓝牙设备可以交换各种类型的数据,如传感器数据、设备状态信息等。
GATT 采用分层的组织结构,分为 Service(服务)、Characteristic(特性)、Property(属性)三层:
Service: 一个蓝牙设备可以有一个或多个服务,这些服务提供不同的功能,如
battery_service
(电池服务)、heart_rate
(心率服务)Characteristic: 提供与服务相关的功能,比如
battery_service
服务的battery_level
特征提供电池电量的数据Property: 特性上的属性,用于操作特性值,比如
write
、read
用于读写特性值
Service、Characteristic 都有一个 UUID 用于标识服务、特性,Service 的 UUID 格式固定为 0x0000[xxxx]-0000-1000-8000-00805F9B34FB
,其中 [xxxx]
是可变部分,其余固定,比如电池服务的 UUID 为 0000180F-0000-1000-8000-00805f9b34fb
,可简写为 0x180F
,当自定义蓝牙 GATT 服务时定义的 UUID 需要采用相同的格式。
在使用 Web Bluetooth API 时,我们通过服务名称或服务 UUID 来找到我们需要的蓝牙服务。
Web Bluetooth API
Web Bluetooth 所有接口构建在 Promise
之上,只支持在可信来源中使用(localhost 或 https),主要有以下接口(完整接口查看 MDN 文档):
Bluetooth
:提供查询蓝牙可用性和请求访问设备的方法getAvailability
:返回用户代理的蓝牙可用性requestDevice
:请求蓝牙设备,返回一个BluetoothDevice
实例;必须由用户手势触发,一般会弹出蓝牙选择器,如果没有可用的蓝牙选择器则默认选择匹配的第一个BluetoothDevice
:蓝牙设备相关接口,具有一个gatt
属性是对BluetoothRemoteGATTServer
实例的引用BluetoothRemoteGATTServer
:可以理解为对 gatt 服务器的引用,通过 gatt 服务器可以获取到他所拥有的 Serviceconnected
:脚本执行环境是否已与设备连接connect
:脚本执行环境连接到 BluetoothDevicedisconnect
:脚本执行环境断开与 BluetoothDevice 的连接getPrimaryService
:通过服务别名或 UUID 获取到对应的 Service,是一个BluetoothRemoteGATTService
实例getPrimaryServices
:获取多个 ServiceBluetoothRemoteGATTService
:对 Service 的引用isPrimary
:指示这是一个主要还是次要的服务getCharacteristic
:获取指定 UUID 的 Characteristic 特性,是一个BluetoothRemoteGATTCharacteristic
实例getCharacteristics
:获取多个特性BluetoothRemoteGATTCharacteristic
:对特性的引用readValue
:读取特性值writeValueWithResponse
:写入特性值
看一个简单的示例:
得到的效果为:
Android 自定义 GATT 服务
简单通过上述代码搜索设备并尝试建立连接进行通讯,会发现无法达到自己想要的效果;为了更好的理解 Web Bluetooth,自定义一个 GATT 服务实现通讯是很好的方法:
上述代码是 Android 应用主 Activity 的代码,配合上述代码需要在 Android 应用配置清单中添加对应的权限:
在编译打开这个 Android 应用后,会开启一个 UUID 为 0x9527 的蓝牙服务,包含一个 UUID 为 11009527-1100-1100-1100-110011001100
的特性,这个特性会在被读取时,将特性值设置为 “Hello from custom characteristic!”,并发送响应到调用方。我们用以下 web 端的代码来测试一下:
查看效果:
除了被动读写外,Android 端的 gatt 服务器还支持 notifyCharacteristicChanged
方法,此方法会触发 web 端 characteristic 实例的 characteristicvaluechanged
事件获取最新的特性值,通过这种方式可以做到主动通知 web 端的效果。
通过自定义终端应用实现自定义 GATT 服务器的方式可以完成与 web 端的点对点连接,但是 web bluetooth 的兼容性还不足以支持完成大型的项目,稳定性也无法考证。
原文地址:https://yuanyxh.com/articles/web_bluetooth_and_point_to_point_connection.html
参考资料
MDN: https://developer.mozilla.org/en-US/docs/Web/API/Web_Bluetooth_API
通过 JavaScript 与蓝牙设备通信: https://developer.chrome.com/docs/capabilities/bluetooth?hl=zh-cn
一文带你认识蓝牙 GATT 协议: https://juejin.cn/post/7160308393503113247
-- end
版权声明: 本文为 InfoQ 作者【yuanyxh】的原创文章。
原文链接:【http://xie.infoq.cn/article/b5a954742ee8e290343bc7859】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论