Web Serial API 浏览器支持
发布于 更新于
Web Serial API — Web Serial API 允许网页应用通过 navigator.serial.requestPort() 请求访问串口,
并使用该端口的 readable 和 writable 流读写数据。
浏览器与生态支持
Section titled “浏览器与生态支持”- 图例
- 支持
- 部分支持
- 需开启标志
- 不支持
- 未知
| 浏览器 / 平台 | 支持 | 版本 | 置信度 | 来源 | 备注 |
|---|---|---|---|---|---|
| Chrome (Desktop) | 支持 | 89 | 高 | 来源 | — |
| Chrome (Android) | 支持 | 148 | 高 | 来源 | — |
| Edge (Desktop) | 支持 | 89 | 高 | 来源 | 1 |
| Firefox (Desktop) | 支持 | 151 | 高 | 来源 | — |
| Firefox (Android) | 不支持 | — | 高 | 来源 | 2 |
| Safari (macOS) | 不支持 | — | 高 | 来源 | 3 |
| Safari (iOS) | 不支持 | — | 高 | 来源 | 45 |
| Samsung Internet | 部分支持 | 30.0 | 高 | 来源 | 67 |
| WebView (Android) | 不支持 | — | 高 | 来源 | 8 |
- 由 browser-compat-data 镜像自 Chrome 的数据推导。
- browser-compat-data 未记录 Firefox for Android 的支持。
- browser-compat-data 未记录 Safari 的支持。
- browser-compat-data 未记录 iOS 版 Safari 的支持。
- 由 browser-compat-data 镜像自 Safari 的数据推导。
- 仅当串口由蓝牙 RFCOMM 串口仿真提供时才可用。
- 由 browser-compat-data 镜像自 Chrome Android 的数据推导。
- 实现跟踪:https://crbug.com/40740509。
请求端口必须在用户手势内进行,filters 可将选择器限定为匹配指定 USB vendorId 的端口。
用户选择端口后,需要指定波特率打开端口,然后才能读写数据:
async function connectSerialPort() { const port = await navigator.serial.requestPort({ filters: [{ usbVendorId: 0x2341 }], }); await port.open({ baudRate: 9600 }); return port;}如何在运行时检测
Section titled “如何在运行时检测”在提供该功能之前先检测 navigator.serial 是否存在,并为不支持的情况提供回退:
if ('serial' in navigator) { connectButton.hidden = false;} else { connectButton.hidden = true; fallbackNotice.textContent = '此浏览器无法在页面中访问串口。';}- 需要安全上下文——除了
localhost这类被视为可信的来源外,普通 HTTP 源不可用。 requestPort()需要短暂的用户激活(点击或 keydown 处理函数);缺少时返回的 Promise 会以SecurityErrorDOMException拒绝。- 在调用
port.open({ baudRate })之前,port.readable与port.writable均为null;只有在open()完成之后,才能从这两个流上获取 reader/writer。 - 端口选择器只会列出匹配传入
filters的端口,如果没有匹配端口,用户将无从选择, 导致返回的 Promise 被拒绝。 - 各浏览器与平台的支持并不一致:根据 MDN browser-compat-data,Chrome for Android 自 148 版起完整支持;138–146 版仅能访问通过蓝牙 RFCOMM 串口模拟提供的串口,而非 有线连接——依赖该功能前请先查看上方的支持表。
另见 WebUSB API——一种相关但不同的底层设备访问 API, 用于访问未被操作系统驱动占用的 USB 设备。
另见通过 HID 报文实现输入/输出设备访问的 WebHID API。
← 返回兼容性浏览器。