更新记录
1.3.8(2026-09-07)
- 修复 Android:success/fail 回调 ClassCast(扁平 Option 不可强转为 BaseOption;入口去掉 coerce 重建)
- .vue 直接传对象;.uvue 须
as XxxOption;须重打自定义基座并云端传统打包
- 不传参行为与上一版兼容
1.3.7(2026-09-07)
- 优化 uni-app x:入口将对象字面量归一化为 Option,业务页可直接传对象调用 API,无需再写
as XxxOption
- 使用须制作自定义基座,并走云端传统打包(不支持离线打包、安心打包)
- 不传参行为与上一版兼容
1.3.6(2026-09-06)
- 修复协议二维码 storeLen 与 ArrayBuffer 转换:size Number.from
- 修复协议 concat:ByteArray.size 先 Number.from 再拼接
- 修复 App 端成功回调与驱动稳定性:去掉 undefined、可变属性强制解包改为局部拷贝;iOS BLE 状态/特性用 Number.from
- 修复 Android BLE 分片与文本编码:ByteArray.size 先 Number.from 再比较/拷贝
- 修复 Android 运行时 ClassCastException:成功回调结果改为 UTSJSONObject 别名,避免强转为独立 SuccessResult 类型
- 修复 invoke 回调判空调用;可选 number 去掉 undefined 联合;部分 Android 原生返回值改 Number.from、可变属性局部拷贝
- 使用须制作自定义基座,并走云端传统打包(不支持离线打包、安心打包)
- 【务必使用此版本及以上版本打包使用,低版本存在缺陷】
查看更多
平台兼容性
uni-app(4.11)
| Vue2 |
Vue3 |
Vue3插件版本 |
Chrome |
Safari |
app-vue |
app-vue插件版本 |
app-nvue |
app-nvue插件版本 |
Android |
Android插件版本 |
iOS |
iOS插件版本 |
鸿蒙 |
鸿蒙插件版本 |
| × |
√ |
1.3.6 |
× |
× |
√ |
1.3.6 |
√ |
1.3.6 |
5.0 |
1.3.6 |
12 |
1.3.6 |
12 |
1.3.6 |
| 微信小程序 |
微信小程序插件版本 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| 2.22.0 |
1.3.6 |
× |
× |
× |
× |
× |
× |
× |
× |
- |
× |
× |
uni-app x(4.11)
| Chrome |
Safari |
Android |
Android插件版本 |
iOS |
iOS插件版本 |
鸿蒙 |
鸿蒙插件版本 |
微信小程序 |
微信小程序插件版本 |
| × |
× |
5.0 |
1.3.6 |
12 |
1.3.6 |
12 |
1.3.6 |
2.22.0 |
1.3.6 |
breao-escposprint 使用说明
轻量 ESC/POS 热敏打印插件,适用于收银、餐饮小票等通用热敏机场景。
当前版本:1.3.8
- Android:默认经典蓝牙 SPP;init 填写 BLE UUID 时走 GATT BLE;局域网 TCP
- iOS:BLE + 局域网
- 鸿蒙:BLE + 局域网(uni-app / uni-app x)
- 微信小程序:仅 BLE
- 能力:文本/多列、对齐加粗字号、分隔线、条码/二维码/位图、切纸/钱箱/蜂鸣、短打印队列、状态查询、纸宽 58/72/80、原始字节透传
- 不做 H5、USB、品牌官方 SDK 合集、PNG 自动光栅
建议调用顺序:init → 扫描/连接 → 打印指令 → disconnect / destroy。各异步方法均支持 success / fail / complete;fail 含 errCode / errMsg。插件为单例连接语义:再次 init 会销毁上一实例。连续 print* 会进入短队列串行发送;队列执行中 getConnectionState 可能返回 busy。
1. 环境要求
- HBuilderX 4.11 及以上
- uni-app Vue3(App-vue / App-nvue)或 uni-app x(App;微信能力与 uni-app 一致)
- 支持:App-Android、App-iOS、App-鸿蒙、微信小程序
- 不支持:H5 及其它小程序
- Android 最低 API:21;iOS 最低 12;鸿蒙最低 API:12;微信小程序基础库建议 2.22.0 及以上
- App 真机调试须制作自定义基座;正式发版须购买授权后走云端传统打包
- 授权绑定唯一 appid + 包名
2. 安装与引入
将插件目录放入工程的 uni_modules/breao-escposprint,或从插件市场导入后同步。
import {
init,
destroy,
startBluetoothScan,
stopBluetoothScan,
getBondedDevices,
connectBluetooth,
connectLan,
disconnect,
printText,
printColumns,
printBytes,
sendRaw,
printBarcode,
printQrcode,
printImage,
setAlign,
setBold,
setFontSize,
feed,
printDivider,
cut,
cutPaper,
openCashBox,
beep,
getPrinterStatus,
getConnectionState,
buildEscInit,
buildEscAlign,
buildEscCut,
buildEscFontSize,
buildEscDivider,
buildEscOpenCashBox,
buildEscBeep,
buildEscColumnsAscii,
buildEscBarcode,
buildEscQrcode,
} from '@/uni_modules/breao-escposprint'
3. API
3.1 init / destroy
init({
transport: 'lan', // 或 bluetooth;详见 §4
paperWidthMm: 80,
debug: false,
onDisconnected(res) {
console.log('disconnected', res)
},
success() {},
fail(err) {
console.error(err.errCode, err.errMsg)
},
})
destroy({ success() {}, fail() {} })
3.2 蓝牙扫描与连接
startBluetoothScan({
timeout: 10000,
success(res) {
// res.devices: [{ name, address, rssi?, bonded? }]
},
fail(err) {},
})
stopBluetoothScan({ success() {}, fail() {} })
getBondedDevices({ success(res) {}, fail(err) {} }) // Android / 鸿蒙已配对;其它端返回不支持
connectBluetooth({
address: 'XX:XX:XX:XX:XX:XX',
success() {},
fail(err) {},
})
说明:请先扫描再连接(未扫描直接 connect 会返回中文错误);参数默认值见 §4。
3.3 局域网连接
connectLan({
host: '192.168.1.100',
success() {},
fail(err) {},
})
3.4 打印与便捷指令
printText({ content: 'Hello ESC/POS', success() {}, fail() {} })
printColumns({ columns: ['品名', '数量', '金额'], widths: [2, 1, 1], success() {}, fail() {} })
printBytes({ data: arrayBuffer, success() {}, fail() {} })
sendRaw({ data: arrayBuffer, success() {}, fail() {} }) // 等同 printBytes
printBarcode({
content: '123456789012',
type: 'CODE128',
height: 60,
width: 2,
hri: 'below',
success() {},
fail() {},
})
printQrcode({
content: 'https://example.com',
moduleSize: 6,
errorLevel: 'M',
success() {},
fail() {},
})
// base64 / path 均须已是 ESC 光栅或原始打印字节;不做 PNG→光栅
printImage({ base64: escRasterBase64, align: 'center', success() {}, fail() {} })
printImage({ path: '/path/to/esc.bin', success() {}, fail() {} }) // 微信请改传 base64
setAlign({ align: 'center', success() {}, fail() {} })
setBold({ bold: true, success() {}, fail() {} })
setFontSize({ width: 2, height: 2, success() {}, fail() {} })
printDivider({ char: '-', success() {}, fail() {} })
feed({ lines: 3, success() {}, fail() {} })
cut({ mode: 'partial', success() {}, fail() {} })
cutPaper({ mode: 'partial', success() {}, fail() {} }) // 等同 cut
openCashBox({ pin: 0, success() {}, fail() {} })
beep({ times: 1, duration: 3, success() {}, fail() {} })
3.5 状态与断开
getPrinterStatus({
success(res) {
// res.online;res.rawStatus 多数机型为 -1(无可靠 DLE EOT 回读)
},
fail(err) {},
})
getConnectionState({
success(res) {
// res.state: disconnected | connecting | connected | busy
// res.paperWidthMm / res.busy
},
fail(err) {},
})
disconnect({ success() {}, fail() {} })
| 字段 |
说明 |
| state |
连接状态;打印队列执行中可为 busy |
| online |
是否已连接(getPrinterStatus) |
| rawStatus |
原始状态字节;多数机型固定 -1 |
| paperWidthMm |
当前纸宽配置 |
| address |
已连接设备地址或 IP(可能返回) |
| transport |
bluetooth 或 lan(可能返回) |
3.6 协议辅助(同步)
可在业务侧自组报文后 printBytes / sendRaw:
| 函数 |
说明 |
| buildEscInit |
ESC @ 初始化 |
| buildEscAlign |
对齐 left / center / right |
| buildEscBold |
加粗开关 |
| buildEscFontSize |
字号宽高倍率 |
| buildEscFeed |
走纸行数 |
| buildEscDivider |
分隔线 |
| buildEscCut |
切纸 full / partial |
| buildEscTextAscii |
ASCII 文本(中文请自编码) |
| buildEscColumnsAscii |
多列 ASCII |
| buildEscBarcode |
条码 GS k |
| buildEscQrcode |
二维码 GS ( k |
| buildEscOpenCashBox |
开钱箱 |
| buildEscBeep |
蜂鸣 |
| buildEscStatusQuery |
DLE EOT 状态请求 |
| concatEscBytes |
拼接多段 ByteArray |
| paperWidthDots |
纸宽毫米转点数 |
| DEFAULT_LAN_PORT |
常量 9100 |
| DEFAULT_PAPER_WIDTH_MM |
常量 80 |
4. 可配置项
| 字段 |
位置 |
默认 |
说明 |
| transport |
init |
bluetooth |
bluetooth 或 lan;微信仅 bluetooth |
| paperWidthMm |
init |
80 |
纸宽毫米:58 / 72 / 80 |
| debug |
init |
false |
调试日志 |
| bleChunkSize |
init |
端默认 |
BLE 分片字节数;经典蓝牙 SPP 忽略 |
| bleWriteInterval |
init |
端默认 |
BLE 写间隔毫秒;经典蓝牙 SPP 忽略 |
| bleServiceUuid |
init |
空 |
BLE Service UUID;Android 传入任一 BLE UUID 时走 GATT,否则默认 SPP |
| bleCharacteristicUuid |
init |
空 |
BLE Characteristic UUID;空则宽松匹配 |
| lanPort |
init |
9100 |
局域网默认端口;可被 connectLan.port 覆盖 |
| encoding |
init / printText |
gbk |
文本编码提示;端不支持时请用 printBytes |
| onDisconnected |
init |
无 |
被动断开回调 |
| timeout |
startBluetoothScan |
10000 |
扫描超时毫秒 |
| includeBonded |
startBluetoothScan |
true |
是否合并系统已配对设备 |
| nameHints |
startBluetoothScan |
内置关键字 |
名称过滤;默认含 POS、Printer、TP、BT 等 |
| address |
connectBluetooth |
必填 |
设备 MAC 或 BLE deviceId |
| timeout |
connectBluetooth |
15000 |
连接超时毫秒 |
| host |
connectLan |
必填 |
打印机 IP |
| port |
connectLan |
init.lanPort 或 9100 |
TCP 端口 |
| timeout |
connectLan |
10000 |
连接超时毫秒 |
| content |
printText |
必填 |
打印文本 |
| encoding |
printText |
覆盖 init.encoding |
本次打印编码 |
| newline |
printText |
true |
打印后是否追加换行 |
| columns |
printColumns |
必填 |
多列文本字符串数组 |
| widths |
printColumns |
均分 |
各列相对宽度权重 |
| data |
printBytes / sendRaw |
必填 |
原始字节 ArrayBuffer |
| align |
setAlign / printImage |
left |
left / center / right |
| bold |
setBold |
必填 |
是否加粗 |
| width / height |
setFontSize |
1 |
字号宽/高倍率,范围 1~8 |
| lines |
feed |
3 |
走纸行数 |
| char |
printDivider |
- |
分隔线字符 |
| count |
printDivider |
按纸宽估算 |
分隔字符重复次数 |
| type |
printBarcode |
CODE128 |
CODE128 / CODE39 / EAN13 / EAN8 / UPC_A / UPC_E / ITF |
| height |
printBarcode |
60 |
条码高度(点) |
| width |
printBarcode |
2 |
条码模块宽度 2~6 |
| hri |
printBarcode |
below |
none / above / below / both |
| moduleSize |
printQrcode |
6 |
二维码模块大小 1~16 |
| errorLevel |
printQrcode |
M |
L / M / Q / H |
| base64 |
printImage |
空 |
已是 ESC 光栅/原始字节的 base64 |
| path |
printImage |
空 |
本地文件按原始字节读取(须已是 ESC 数据);微信请改传 base64 |
| mode |
cut / cutPaper |
partial |
partial 半切 / full 全切 |
| pin |
openCashBox |
0 |
钱箱针脚 0 或 1 |
| times |
beep |
1 |
蜂鸣次数 |
| duration |
beep |
3 |
蜂鸣时长档位 1~9 |
不传参即用默认值。
4.1 transport 与端能力
| transport |
Android |
iOS |
鸿蒙 |
微信 |
| bluetooth |
SPP 默认;填 BLE UUID 走 GATT |
BLE |
BLE |
BLE |
| lan |
支持 |
支持 |
支持 |
不支持(9060007) |
5. 完整示例
5.1 局域网
import {
init,
connectLan,
printText,
setFontSize,
printDivider,
openCashBox,
cutPaper,
disconnect,
destroy,
} from '@/uni_modules/breao-escposprint'
init({
transport: 'lan',
paperWidthMm: 80,
success() {
connectLan({
host: '192.168.1.100',
success() {
setFontSize({
width: 2,
height: 2,
success() {
printText({
content: 'Store Receipt',
success() {
printDivider({
success() {
openCashBox({
success() {
cutPaper({
mode: 'partial',
success() {
disconnect({ success() { destroy({}) } })
},
})
},
})
},
})
},
})
},
})
},
fail(err) {
console.error(err.errCode, err.errMsg)
},
})
},
})
5.2 蓝牙
import { init, startBluetoothScan, connectBluetooth, printColumns, destroy } from '@/uni_modules/breao-escposprint'
init({
transport: 'bluetooth',
success() {
startBluetoothScan({
success(res) {
const dev = res.devices && res.devices[0]
if (!dev) return
connectBluetooth({
address: dev.address,
success() {
printColumns({ columns: ['品名', '数量', '金额'], widths: [2, 1, 1] })
},
})
},
})
},
})
6. 权限
请在应用 manifest / 隐私弹窗中按需声明,并说明用于连接 ESC/POS 热敏打印机与发送打印数据。插件会申请相关权限,业务仍须引导用户开启蓝牙/网络。
| 平台 |
权限 |
说明 |
| Android |
android.permission.BLUETOOTH、android.permission.BLUETOOTH_ADMIN |
API≤30 蓝牙扫描与连接 |
| Android |
android.permission.BLUETOOTH_SCAN、android.permission.BLUETOOTH_CONNECT |
Android 12+ 蓝牙扫描与连接 |
| Android |
android.permission.ACCESS_FINE_LOCATION、android.permission.ACCESS_COARSE_LOCATION |
蓝牙扫描辅助定位 |
| Android |
android.permission.INTERNET、android.permission.ACCESS_NETWORK_STATE、android.permission.ACCESS_WIFI_STATE |
局域网 TCP 打印 |
| iOS |
NSBluetoothAlwaysUsageDescription、NSBluetoothPeripheralUsageDescription |
蓝牙打印 |
| iOS |
NSLocalNetworkUsageDescription |
局域网打印机发现与连接 |
| 鸿蒙 |
ohos.permission.INTERNET |
局域网 TCP 打印 |
| 鸿蒙 |
ohos.permission.ACCESS_BLUETOOTH、ohos.permission.DISCOVER_BLUETOOTH、ohos.permission.MANAGE_BLUETOOTH |
蓝牙扫描与连接 |
| 微信 |
openBluetoothAdapter、startBluetoothDevicesDiscovery、createBLEConnection、getBLEDeviceServices、getBLEDeviceCharacteristics、writeBLECharacteristicValue |
BLE 扫描、连接与写入;需用户授权蓝牙 |
7. 错误码(906)
| 码 |
含义 |
| 9060001 |
成功 |
| 9060002 |
失败(忙碌、连接失败、打印失败等) |
| 9060003 |
未 init 或配置缺失 |
| 9060004 |
蓝牙未开启或不可用 |
| 9060005 |
未连接打印机 |
| 9060006 |
参数非法 |
| 9060007 |
当前平台不支持 |
| 9060008 |
驱动创建失败或不匹配 |
| 9060009 |
当前端不支持该 transport / 能力 |
| 9060010 |
能力尚未实现 |
8. 平台注意
- uni-app x(
.uvue):须对入参使用 as XxxOption(见官方 error17);.vue 可直接传对象。须使用 1.3.8+ 并重打自定义基座
- 局域网热敏多数默认端口 9100;若厂商不同请改
lanPort / connectLan.port
- 中文小票常见 GBK;若端侧编码不可用,请业务侧转 GBK 后
printBytes
- 连接后不会自动发送 ESC @;需要时可
printBytes(buildEscInit())
- 请先
startBluetoothScan 再 connectBluetooth;未扫描直接连接会返回稳定中文错误
- Android 默认经典 SPP;BLE 打印机请在 init 填写
bleServiceUuid / bleCharacteristicUuid
- Android 12+ 蓝牙扫描通常需要定位权限;请在运行时申请并引导用户开启蓝牙
- BLE UUID 留空时(iOS / 鸿蒙 / 微信 / Android BLE 模式)自动匹配可写特征;特殊机型请填写厂商 UUID
printImage.path 按原始字节读取,须已是 ESC 光栅数据;不做 PNG 自动光栅;微信请业务侧读文件后传 base64
- 切换
transport 或彻底释放资源时,请 destroy 后再重新 init
- 短打印队列深度为 32;
printText / printBytes / printBarcode 等 print* 串行入队
- 队列已满时
fail 返回 9060002,errMsg 为「打印队列已满,请稍后重试」
init(含再次 init)、disconnect、destroy 会清空尚未执行的队列任务