packages/device-connect-web 是 Device Platform 内置的独立静态 Web 包。它解决 Device Server 部署在 NAS、Linux 服务器或无蓝牙主机上,而访问管理端的电脑具有蓝牙的场景。
包的使用与通信约束见 包内 README;Docker、HTTPS 入口、Gitea 构建部署和上线验收见 独立部署指南。
Device Connect Web 使用 Web Bluetooth 与 Voicecan 设备的 BLE GATT 服务通信。运行连接页的客户端必须具有支持 BLE 4.0 或更高版本的蓝牙适配器,并开启操作系统蓝牙、浏览器蓝牙权限和站点蓝牙权限。Device Server 所在的 NAS 或远程服务器不需要蓝牙。
| 客户端平台 | Web Bluetooth 上游最低条件 | Device Connect Web 建议环境 |
|---|---|---|
| Windows | Windows 10 1703+;Chrome 70+ 或 Edge 79+ | Windows 10/11,使用最新稳定版 Chrome 或 Edge |
| macOS | OS X 10.10 Yosemite+;Chrome 56+ | 仍受支持的 macOS,使用最新稳定版 Chrome 或 Edge,并允许浏览器访问系统蓝牙 |
| Android | Android 6.0+;Chrome | Android 10+,使用最新稳定版 Chrome;不要使用应用内 WebView |
| ChromeOS | 具有 BLE 硬件的 ChromeOS 设备 | 保持 ChromeOS 和 Chrome 为最新稳定版 |
上表中的上游最低版本只表示浏览器提供基本的设备选择、GATT 连接、Characteristic 读写和 Notification 能力,不表示旧系统仍处于厂商安全支持期。生产使用应以“建议环境”为准,并至少验证当前及前一个 Chromium 稳定版本。
以下环境不属于支持范围:
- iPhone 和 iPad 上的 Safari、Chrome、Edge 及安装到主屏幕的 PWA;iOS/iPadOS 的 WebKit 不提供 Web Bluetooth;
- macOS Safari 和所有平台的 Firefox;
- Android WebView 和应用内置浏览器;
- Linux 上的 Chrome/Chromium。其实现仍依赖 Kernel、BlueZ 和实验功能开关,只适合开发诊断,不作为生产配网入口;
- Bluetooth Classic 设备。连接页只支持 BLE GATT。
除系统和浏览器版本外,页面还必须满足以下条件:
- 连接页运行在受信任的 HTTPS 安全上下文中;只有本地开发的
localhost、127.0.0.1和[::1]可使用 HTTP; - 响应头允许当前来源使用蓝牙,即
Permissions-Policy: bluetooth=(self); - 用户必须通过页面按钮主动打开浏览器设备选择器,浏览器不允许页面静默扫描或自动选择设备;
- 企业浏览器策略、操作系统隐私设置或站点权限不得禁用蓝牙;
- Voicecan 设备处于附近并进入可发现/配对状态。
页面可使用 isSecureContext && 'bluetooth' in navigator 做入口能力检测,但检测通过不代表蓝牙适配器已开启或权限已授予;最终仍以用户选择设备并成功建立 GATT 连接为准。上游兼容性依据见 Chrome Web Bluetooth 文档、Web Bluetooth 实现状态和 Microsoft Edge Web Bluetooth 策略文档。
- 管理员在
/admin?view=provision选择目标用户组,创建 30 分钟设备绑定凭证。 - 管理端检查
isSecureContext和navigator.bluetooth。 - 若当前管理端可直接使用 Web Bluetooth,则在管理页面内完成设备绑定。
- 若不可用,则用户点击“开始绑定”时直接打开配置的公网 HTTPS 连接页。
- 安全会话连接后,用户在连接页点击“选择设备并开始绑定”,由这个用户手势打开浏览器蓝牙设备选择器。连接页只操作当前电脑的 BLE,并严格按 App 顺序执行:连接 GATT、读取设备身份、向 Server 领取绑定 Token、完成 BLE Token 安全握手;只有这四步成功后才读取、展示设备当前网络状态。所有 NAS/本地 Server 请求仍由原管理页面发起。
- 用户选择保留现有网络或填写新的 Wi-Fi 配置;页面持续读取设备状态,只有网络变为可用后才写入服务器地址。
- 连接页等待 Server 确认设备上线;完成后返回管理端,管理端校验一次性
state,再向 Server 查询绑定会话的权威状态。
配网选择的 Wi-Fi 必须让设备与 Voicecan Platform Server 处于同一个网络,否则设备无法完成首次回连与上线确认。
VOICECAN_CONNECT_WEB_URL=https://connect.voice-can.com/修改后重启 Device Server。Server 会把该地址注入 Admin HTML;地址非法时启动失败,避免静默回退到不安全 HTTP。
独立发布连接页:
npm run build --workspace @voicecan/device-connect-web部署目录为 packages/device-connect-web/dist/。上线前至少验证:
- 页面通过受信任的公网 HTTPS 访问;
- Chromium 的站点权限允许蓝牙;
Permissions-Policy包含bluetooth=(self);Cross-Origin-Opener-Policy没有设置为same-origin;- CSP 允许自身脚本、WASM 和
voicecan lit-html sanitizerTrusted Types policy; - 页面没有第三方脚本、外链资源或敏感信息日志。
也可以使用专用 Dockerfile:
docker build -f packages/device-connect-web/Dockerfile -t voicecan/device-connect-web:local .Gitea 中的 device-connect-web-image 工作流在推送到 test 分支时自动执行,也支持手动选择目标集群、命名空间或已有镜像 tag。它只构建 linux/amd64 镜像,推送到内网仓库后通过 SSH 部署独立的 Kubernetes Service 和 Deployment;公网 TLS/Ingress 仍由集群侧管理。