连得稳、写得对、打得准三者缺一不可,关键在适配器状态校验、服务UUID动态获取、特征值精准筛选及Uint8Array格式指令发送。

连得稳、写得对、打得准,三者缺一不可。90% 的失败不是因为“不能连”,而是卡在适配器状态误判、服务 UUID 硬编码错误、或 writeBLECharacteristicValue 传了字符串而非 Uint8Array。
uni.getBluetoothAdapterState 必须先调,且要校验 powered 和 available
很多开发者直接 uni.openBluetoothAdapter 后就立刻 startBluetoothDevicesDiscovery,结果 iOS 卡在授权弹窗、安卓搜不到设备——因为 openBluetoothAdapter 的 success 回调只表示模块加载成功,不代表蓝牙已就绪。
- 必须在
uni.getBluetoothAdapterState的 success 回调里做后续操作 - 检查
res.available === true(模块可用)且res.powered === true(蓝牙已开启),二者缺一不可 - 若
res.discovering === true,先调uni.stopBluetoothDevicesDiscovery()再启动新搜索,否则安卓可能无响应 - iOS 首次调用会弹定位授权框,此时
powered可能为false,需等用户授权后再重试
services 参数不能空,必须填目标打印机的服务 UUID
不传 services 数组,startBluetoothDevicesDiscovery 会扫出大量广播名伪造的“假打印机”(比如叫 “Printer_1234” 的 BLE 信标),连上也发不出指令。
- CPCL 类(芝珂 ZJ-5890、精臣 Q1)常用:
'00001101-0000-1000-8000-00805F9B34FB' - ESC/POS 类(佳博 GP-P3、驰腾 CT-320)常用:
'0000FFE0-0000-1000-8000-00805F9B34FB'或'0000FF00-0000-1000-8000-00805F9B34FB' - 连上设备后,务必再调
uni.getBLEDeviceServices确认该 UUID 真实存在 - 接着用
uni.getBLEDeviceCharacteristics找properties.write === true && properties.notify === false的特征值——纯发送型打印机只认这个
writeBLECharacteristicValue 必须传 Uint8Array,且 CPCL 指令结尾是 \r\n
直接把字符串(如 "PRINT\r\n")传给 uni.writeBLECharacteristicValue 必然失败。Android/iOS 原生 BLE 层只接受 Uint8Array,且对换行符极其敏感。
- 正确做法:用
new TextEncoder().encode("PRINT\r\n")转成Uint8Array - CPCL 指令必须以
\r\n结尾,\n或\r单独出现都会导致不出纸 - ESC/POS 指令同理,例如换行是
[0x1B, 0x64, 0x01](ESC d 1),不能写成字符串"\x1Bd\x01" - 中文内容需先 GBK 编码再转字节数组,JS 原生不支持 GBK,得引入
iconv-lite或用原生插件处理
manifest.json 和权限配置漏一项,真机就直接哑火
App 端打包时没加蓝牙模块、没声明位置权限,或 iOS 没配 NSBluetoothAlwaysUsageDescription,真机调试时连 openBluetoothAdapter 都会静默失败。
- App 必须在
manifest.json的app-plus→distribute下添加bluetooth模块 - Android 需声明
ACCESS_FINE_LOCATION(6.0+ 扫描必需),否则搜不到设备 - iOS 需在
info.plist补充NSBluetoothAlwaysUsageDescription和UIBackgroundModes: ["bluetooth-central"] - 微信小程序暂不支持蓝牙直连,只能走云打印或服务商中转,别白费力气调
uni.openBluetoothAdapter
最易被忽略的是:连上设备 ≠ 能通信。很多“连接成功但不出纸”的问题,根源在于没确认服务 UUID 是否真实存在、没筛选出可写的特征值、或指令数组末尾少了 \r\n。每一步都建议加日志打点,尤其是 getBLEDeviceServices 和 getBLEDeviceCharacteristics 的返回结果,别靠文档硬猜。



















