pinia actions 不直接操作蓝牙硬件,需封装 web bluetooth api 实现搜索与连接:定义异步 action 调用 requestdevice() 搜索设备并处理异常,另设 connecttodevice() 执行 gatt 连接与初始化;通过 isscanning、discovereddevices、connecteddevice、connectionerror 等响应式状态驱动 ui;注意仅限用户手势触发、兼容性限制及连接状态监听与清理。

Pinia Actions 本身不直接处理蓝牙硬件操作,它只是组织和管理状态与业务逻辑的容器。蓝牙搜索与连接这类异步控制,需要你把原生 Web Bluetooth API(或 Capacitor/Cordova 插件)封装进 Pinia Action 中,用 async/await 驱动流程,并配合状态更新来反映过程(如 loading、devices、error、connectedDevice)。
封装 Web Bluetooth 搜索逻辑到 Action
在 store 中定义一个异步 action,调用 navigator.bluetooth.requestDevice(),并设置过滤条件:
- 使用
acceptAllDevices: false+filters提高兼容性(例如只搜 BLE peripheral) - 捕获
NotFoundError(用户取消)、SecurityError(未在安全上下文运行)、NotAllowedError(权限拒绝)等常见异常 - 成功后保存设备基本信息(id、name、gatt server 是否可用)到 state 的
discoveredDevices数组
在 Action 中实现连接与 GATT 初始化
单独定义一个 connectToDevice(deviceId) action,按顺序执行:
- 从已发现设备列表中查出对应 device(或通过
navigator.bluetooth.getDevices()恢复) - 调用
device.gatt.connect(),等待连接完成 - 连接成功后可缓存
device.gatt实例,或进一步读取 service/characteristic - 连接失败时清空相关状态,并抛出明确错误供 UI 处理(如 toast 提示)
用状态字段驱动 UI 反馈
在 store 的 state 中定义关键响应式字段,让组件自动响应:
-
isScanning: boolean— 控制“搜索中”按钮禁用态与 loading 图标 -
discoveredDevices: BluetoothDevice[]— 列表渲染设备名与 RSSI(需额外监听advertisement) -
connectedDevice: { id: string; name: string } | null— 显示当前连接状态 -
connectionError: string | null— 绑定到 error toast 或 banner
注意事项与边界处理
Web Bluetooth 有严格限制,Action 必须在用户手势触发(如 click)内调用,不能由定时器或异步回调发起;iOS Safari 不支持;部分 Android 浏览器需开启实验性标志。建议:
- 在 action 开头加判断:
if (!navigator.bluetooth) throw new Error('Bluetooth not supported') - 连接成功后监听
device.gatt.onconnect和ondisconnect,并在 disconnect 时自动重置 state - 避免在多个 action 中重复创建 GATT 连接,可用单例缓存或加连接锁防止并发冲突










