在网页上通过蓝牙串行

弗朗索瓦·博福
François Beaufort

借助 Web Bluetooth APIWeb Serial API,Web 应用可分别与蓝牙低功耗 (BLE) 设备和串行设备通信。尽管许多 Web 开发者已经在使用这些 API 取得了巨大成功,但对经典蓝牙设备的支持需求也在不断增长。

现在,Web Serial API 支持在配对的传统版蓝牙设备上与 RFCOMM 服务通信,包括桌面版 Chrome 117 中的串行端口配置文件 (SPP)。这为 Web 开发者和用户等带来了新的可能性。以下是一些可以受益于此功能的实际设备:

  • Pixel Buds Pro 和其他无线入耳式耳机使用 RFCOMM 管理音频设置和固件更新。
  • 移动销售终端系统使用蓝牙 SPP 与收据打印机进行通信。
  • 牲畜 RFID 标签读取器使用蓝牙 SPP 记录动物的移动情况。

蓝牙 RFCOMM 协议

重回 90 年代后期。您只需将 Palm Pilot 放入充电座,即可同步第二天的日历。如果能改为通过无线方式完成这项工作,那不是很棒吗?借助这项全新的“蓝牙”技术,您消除了那些杂乱的线缆。无线网络是未来趋势!只有一个问题,现有的一切工具均设计为与 RS-232 数据线连接。因此,蓝牙使用射频通信 (RFCOMM) 协议向所有现有软件和硬件提供该接口。

即使在今天,RFCOMM 服务也广泛用于新硬件和现有硬件。它能够满足特定的延迟时间和带宽要求,目前蓝牙低功耗无法满足这些要求。正因如此,我们开发了 Web Serial(用于连接到串行设备的 API)和蓝牙之间的集成,以便在制造商最终迁移到蓝牙低功耗以及开发者可以使用 Web Bluetooth API 之前,支持访问这些旧版 RFCOMM 服务。

Web Serial API 变更

从桌面版 Chrome 117 开始,Web 开发者现在可以使用 Web Serial API 通过 RFCOMM 服务与配对的传统版蓝牙设备可靠地通信。这是通过对 Web Serial API 进行以下更新实现的:

  • Chrome 现在会枚举使用标准化蓝牙经典串行端口配置文件公开串行接口的配对蓝牙设备。
  • 现在,即使操作系统尚未专门通过模拟的串行端口创建设备节点,Chrome 也可以与串行接口进行通信。
  • Chrome 现在可以与提供 RFCOMM 串行接口的非串行端口服务进行通信(请参阅非标准服务类 ID)。

如需了解如何使用 Web Serial API,请参阅从串行端口读取数据和向串行端口写入数据一文。本文假定您对蓝牙有基本的了解,并重点介绍蓝牙串行更改。

在不指定任何过滤器的情况下,调用 navigator.serial.requestPort() 可让用户选择非蓝牙串行端口、已映射的蓝牙串行端口,以及标准化的蓝牙传统串行端口配置文件提供的任何未映射的串行端口。

// Prompt user to select any serial port.
const port = await navigator.serial.requestPort();

虽然大多数设备都通过标准化蓝牙经典串行端口配置文件公开基于 SPP 的通信,但有些设备使用的是基于 RFCOMM 的自定义服务。这些设备的服务类 ID 不在标准蓝牙 UUID 范围内。

您需要将 allowedBluetoothServiceClassIds 列表传递给 navigator.serial.requestPort(),才能访问这些基于 RFCOMM 的自定义服务,如以下示例所示。

const myBluetoothServiceUuid = "01234567-89ab-cdef-0123-456789abcdef";

// Prompt user to select any serial port.
// Access to the custom Bluetooth RFCOMM service above will be allowed.
const port = await navigator.serial.requestPort({
  allowedBluetoothServiceClassIds: [myBluetoothServiceUuid],
});

请注意,除了串行端口配置文件 ID 之外,所有使用蓝牙 SIG 基本 UUID 的服务类 ID(即以“-0000-1000-8000-8000-00805f9b34fb”结尾的所有 UUID)均被屏蔽,因为 Chrome 不支持音频和视频等传统蓝牙服务。

您还可以在调用 navigator.serial.requestPort() 时使用 bluetoothServiceClassId 过滤键,以提示用户使用由服务类 ID 标识的已过滤蓝牙串行端口列表。请参见下面的示例。

const myBluetoothServiceUuid = "01234567-89ab-cdef-0123-456789abcdef";

// Prompt the user to select Bluetooth serial ports with
// the custom Bluetooth RFCOMM service above.
const port = await navigator.serial.requestPort({
  allowedBluetoothServiceClassIds: [myBluetoothServiceUuid],
  filters: [{ bluetoothServiceClassId: myBluetoothServiceUuid }],
});

如果串行端口是蓝牙设备的一部分,则通过调用 port.getInfo() 返回的串行端口信息中会提供一个新的 bluetoothServiceClassId 密钥,其中包含与该端口所连接的 RFCOMM 通道相关联的服务类 ID。如果串行端口已映射,则会以简写形式返回“00001101-0000-1000-8000-00805f9b34fb”或 0x1101。

const { bluetoothServiceClassId } = port.getInfo();

用例示例:控制 Pixel Buds Pro

Pixel Buds Pro Web Companion 应用是一款全新的 Web 应用,可让用户通过任何装有网络浏览器的设备控制 Pixel Buds Pro。它采用渐进式 Web 应用技术构建而成,可提供即时加载体验,并且可以选择与其他操作系统应用一起安装。

该应用使用 Web Serial API 与 Pixel Buds Pro 通信。让用户能够控制 Pixel Buds Pro 的各种设置,例如主动降噪、均衡器、入耳检测和固件更新。

如要试用 Pixel Buds Pro Web Companion 应用,请在 ChromeOS 设备上访问 mypixelbuds.google.com(其他平台即将推出)。

Pixel Buds Pro Web 配套应用的屏幕截图。
Pixel Buds Pro Web 配套应用。

资源

确认

感谢 Reilly Grant、Thomas Steiner、Ben Morss 和 Vincent Scheib 的评价。 主打图片:Unsplash 用户 Mika Baumeister