更新记录
1.1.8(2026-09-07)
- 修复 Android:success/fail 回调 ClassCast(扁平 Option 不可强转为 BaseOption;入口去掉 coerce 重建)
- .vue 直接传对象;.uvue 须
as XxxOption;须重打自定义基座并云端传统打包
- 不传参行为与上一版兼容
1.1.7(2026-09-07)
- 优化 uni-app x:入口将对象字面量归一化为 Option,业务页可直接传对象调用 API,无需再写
as XxxOption
- 使用须制作自定义基座,并走云端传统打包(不支持离线打包、安心打包)
- 不传参行为与上一版兼容
1.1.6(2026-09-06)
- 修复协议二维码 storeLen 与 ArrayBuffer 转换:size Number.from
- 修复协议 concat:ByteArray.size 先 Number.from 再拼接
- 修复 App 端成功回调与驱动稳定性:去掉 undefined、可变属性强制解包改为局部拷贝;iOS BLE 状态/特性用 Number.from
- 修复 Android 文本编码拷贝:ByteArray.size 先 Number.from 再循环与下标
- 修复 Android 运行时 ClassCastException:成功回调结果改为 UTSJSONObject 别名,避免强转为独立 SuccessResult 类型
- 修复 Android USB bulkTransfer:长度用 Int,返回值 Number.from 后再比较
- 修复 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.1.6 |
× |
× |
√ |
1.1.6 |
√ |
1.1.6 |
5.0 |
1.1.6 |
12 |
1.1.6 |
12 |
1.1.6 |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| × |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
uni-app x(4.11)
| Chrome |
Safari |
Android |
Android插件版本 |
iOS |
iOS插件版本 |
鸿蒙 |
鸿蒙插件版本 |
微信小程序 |
| × |
× |
5.0 |
1.1.6 |
12 |
1.1.6 |
12 |
1.1.6 |
× |
其他
| 多语言 |
暗黑模式 |
宽屏模式 |
蒸汽模式 |
| × |
× |
× |
√ |
breao-xprinter 使用说明
芯烨 XPrinter 票据打印插件,适用于收银、餐饮小票等芯烨热敏机场景。
当前版本:1.1.8
- Android:蓝牙经典 SPP + 局域网 TCP + USB Host
- iOS:BLE/BT + 局域网 TCP
- 鸿蒙:官方 SDK(蓝牙 / 局域网 / USB,har 已内置;uni-app 与 uni-app x)
- 能力:文本/多列、对齐加粗字号、条码/二维码/位图、切纸/钱箱/蜂鸣、状态查询、纸宽 58/72/80、原始字节透传、短打印队列
- 不做微信小程序端(请改用
breao-escposprint)、芯烨云开放 API、全量 TSPL 标签排版引擎
建议调用顺序:init → connectBluetooth / connectLan / connectUsb → 打印指令 → 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-Android / App-iOS / App-鸿蒙)
- 支持:App-Android、App-iOS、App-鸿蒙(uni-app 与 uni-app x)
- 不支持:H5、微信及其它小程序
- 微信小程序请使用
breao-escposprint(轻量 ESC 透传);本插件依赖芯烨官方 SDK(jar / xcframework / 鸿蒙 har),官方包不覆盖微信端,故微信标为不支持
- Android 最低 API:21;iOS 最低 12;鸿蒙最低 API:12
- App 真机调试须制作自定义基座;正式发版须购买授权后走云端传统打包
- 授权绑定唯一 appid + 包名
2. 安装与引入
将插件目录放入工程的 uni_modules/breao-xprinter,或从插件市场导入后同步。官方 SDK 二进制已内置,无需再手动下载 jar / xcframework,也无需执行 ohpm install @xpsdk/printersdk。
import {
init,
destroy,
startBluetoothScan,
stopBluetoothScan,
getBondedDevices,
connectBluetooth,
connectLan,
connectUsb,
disconnect,
getConnectionState,
printText,
printColumns,
printBytes,
sendRaw,
setAlign,
setBold,
setFontSize,
feed,
printDivider,
printBarcode,
printQrcode,
printImage,
cutPaper,
openCashBox,
beep,
getPrinterStatus,
// 协议辅助(可选)
buildEscInit,
buildEscAlign,
buildEscBold,
buildEscFontSize,
buildEscFeed,
buildEscDivider,
buildEscCut,
buildEscTextAscii,
buildEscColumnsAscii,
buildEscBarcode,
buildEscQrcode,
buildEscOpenCashBox,
buildEscBeep,
buildEscStatusQuery,
concatEscBytes,
DEFAULT_LAN_PORT,
DEFAULT_PAPER_WIDTH_MM,
} from '@/uni_modules/breao-xprinter'
3. API
3.1 init / destroy
init({
transport: 'lan',
paperWidthMm: 80,
encoding: 'gbk',
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) {},
})
getBondedDevices({ success(res) {}, fail(err) {} }) // Android 已配对列表
connectBluetooth({ address: 'XX:XX:XX:XX:XX:XX', success() {}, fail(err) {} })
connectLan({ host: '192.168.1.100', success() {}, fail(err) {} })
connectUsb({ success() {}, fail(err) {} }) // 须 init({ transport: 'usb' })
disconnect({ success() {}, fail() {} })
说明:iOS 请先扫描再连接;鸿蒙蓝牙传系统蓝牙设备 id;参数默认值见 §4。
3.3 打印与排版
printText({ content: 'Hello XPrinter', success() {}, fail() {} })
printColumns({ columns: ['品名', '数量', '金额'], widths: [2, 1, 1], success() {}, fail() {} })
setAlign({ align: 'center', success() {}, fail() {} })
setBold({ bold: true, success() {}, fail() {} })
setFontSize({ width: 2, height: 2, success() {}, fail() {} })
printBarcode({ content: '123456789012', type: 'CODE128', success() {}, fail() {} })
printQrcode({ content: 'https://example.com/order/1', success() {}, fail() {} })
printImage({ base64: '...', align: 'center', success() {}, fail() {} })
cutPaper({ mode: 'partial', success() {}, fail() {} })
openCashBox({ pin: 0, success() {}, fail() {} })
beep({ times: 1, duration: 3, success() {}, fail() {} })
feed({ lines: 3, success() {}, fail() {} })
printDivider({ char: '-', success() {}, fail() {} })
printBytes({ data: arrayBuffer, success() {}, fail() {} })
sendRaw({ data: arrayBuffer, success() {}, fail() {} }) // 不经队列直接发送原始字节
3.4 状态查询
getConnectionState({
success(res) {
// res.state: disconnected | connecting | connected | busy
// res.address / res.transport / res.paperWidthMm / res.busy
},
fail(err) {},
})
getPrinterStatus({
success(res) {
// res.online / paperWidthMm / transport / rawStatus(无回读时为 -1)
},
fail(err) {},
})
| 字段 |
说明 |
| state |
连接状态;打印队列执行中可为 busy |
| busy |
短队列执行中为 true |
| online |
是否已连接(getPrinterStatus) |
| paperWidthMm |
当前纸宽配置 |
| transport |
当前传输方式 |
| rawStatus |
机型回读状态字节;不可读时为 -1 |
3.6 协议辅助(同步)
可在业务侧自组 ESC 报文后 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 |
| DEFAULT_LAN_PORT |
常量 9100 |
| DEFAULT_PAPER_WIDTH_MM |
常量 80 |
4. 可配置项
| 字段 |
位置 |
默认 |
说明 |
| transport |
init |
bluetooth |
bluetooth / lan / usb;鸿蒙三通道均走官方 SDK;iOS 不支持 usb |
| paperWidthMm |
init |
80 |
纸宽毫米:58 / 72 / 80 |
| encoding |
init / printText |
gbk |
printText 默认编码;端不支持时请改用 printBytes |
| codePage |
init |
空 |
代码页提示字符串,供对接官方 SDK / 固件时参考 |
| lanPort |
init |
9100 |
局域网默认 TCP 端口,可被 connectLan.port 覆盖 |
| bleChunkSize |
init |
端默认 |
BLE 单次写入字节数;Android 经典 SPP 忽略 |
| bleWriteInterval |
init |
端默认 |
BLE 分片写间隔毫秒;Android 经典 SPP 忽略 |
| bleServiceUuid |
init |
空 |
BLE Service UUID;空则宽松匹配可写特征(iOS) |
| bleCharacteristicUuid |
init |
空 |
BLE Characteristic UUID;空则宽松匹配 |
| debug |
init |
false |
调试日志 |
| onDisconnected |
init |
无 |
被动断开回调 |
| timeout |
startBluetoothScan |
10000 |
扫描超时毫秒 |
| includeBonded |
startBluetoothScan |
true |
是否合并系统已配对设备(Android) |
| nameHints |
startBluetoothScan |
内置关键字 |
名称过滤;默认含 XP-、XPrinter、芯烨、Printer、POS 等 |
| address |
connectBluetooth |
必填 |
Android 多为 MAC;iOS 为扫描结果 address;鸿蒙为系统蓝牙设备 id |
| timeout |
connectBluetooth |
15000 |
连接超时毫秒 |
| host |
connectLan |
必填 |
打印机局域网 IP |
| port |
connectLan |
init.lanPort 或 9100 |
TCP 端口 |
| timeout |
connectLan |
10000 |
连接超时毫秒 |
| deviceName |
connectUsb |
空 |
USB 设备名;空则尝试首个可用打印机类设备(Android / 鸿蒙) |
| content |
printText / printBarcode / printQrcode |
必填 |
文本或码内容 |
| 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(可带 data: 前缀) |
| path |
printImage |
空 |
本地路径;建议业务侧读文件后改传 base64 或 printBytes |
| mode |
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 |
官方 SDK 蓝牙 |
| lan |
TCP |
TCP |
官方 SDK 网口 |
| usb |
USB Host |
不支持(9080009) |
官方 SDK USB |
鸿蒙不支持 getBondedDevices(返回 9080010);请使用系统已配对蓝牙设备的 deviceId 作为 connectBluetooth.address,或通过 startBluetoothScan 获取设备 id。
5. 完整示例
import {
init,
connectLan,
setAlign,
printText,
printQrcode,
cutPaper,
destroy,
} from '@/uni_modules/breao-xprinter'
init({
transport: 'lan',
paperWidthMm: 80,
encoding: 'gbk',
success() {
connectLan({
host: '192.168.1.100',
port: 9100,
success() {
setAlign({ align: 'center' })
printText({ content: '芯烨小票' })
printQrcode({ content: 'https://example.com/order/1' })
cutPaper({
mode: 'partial',
success() {
destroy({})
},
})
},
fail(err) {
console.error(err.errCode, err.errMsg)
},
})
},
fail(err) {
console.error(err.errCode, err.errMsg)
},
})
6. 权限
请在应用 manifest / 隐私弹窗中按需声明,并说明用于连接芯烨打印机与发送打印数据。
| 平台 |
权限 |
说明 |
| 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 |
局域网打印 |
| Android |
系统 USB 权限弹窗 |
USB Host 打印(插件内请求) |
| iOS |
NSBluetoothAlwaysUsageDescription、NSBluetoothPeripheralUsageDescription |
蓝牙打印 |
| iOS |
NSLocalNetworkUsageDescription |
局域网打印 |
| 鸿蒙 |
ohos.permission.INTERNET |
局域网打印 |
| 鸿蒙 |
ohos.permission.ACCESS_BLUETOOTH、ohos.permission.DISCOVER_BLUETOOTH、ohos.permission.MANAGE_BLUETOOTH |
蓝牙打印 |
7. 错误码(908)
| 码 |
含义 |
| 9080001 |
成功 |
| 9080002 |
失败(连接/打印/IO 等) |
| 9080003 |
未调用 init,或 SDK 未就绪 |
| 9080004 |
蓝牙未开启 |
| 9080005 |
未连接打印机 |
| 9080006 |
参数非法 |
| 9080007 |
当前运行平台不支持 |
| 9080008 |
驱动创建失败或不匹配 |
| 9080009 |
当前端不支持该 transport 或接口 |
| 9080010 |
能力未实现(如端侧扫描限制) |
8. 平台注意
- uni-app x(
.uvue):须对入参使用 as XxxOption(见官方 error17);.vue 可直接传对象。须使用 1.1.8+ 并重打自定义基座
- Android 蓝牙为经典 SPP;可用
nameHints 覆盖默认 XP- / XPrinter / 芯烨 等过滤
- iOS 蓝牙为 BLE:须先
startBluetoothScan,再用扫描结果中的 address 连接
- 局域网默认端口 9100;机型不同可用
connectLan.port 覆盖
- USB:Android 与鸿蒙支持;请先
init({ transport: 'usb' }) 再 connectUsb
- 鸿蒙蓝牙 address 为系统蓝牙设备 id;局域网
connectLan 会按 host,port 交给官方 SDK
- 微信小程序:官方 SDK 无微信包,本插件不提供微信 BLE;若仅需 ESC 字节透传打印,请使用
breao-escposprint
- 连续打印走短队列(上限 32);队列满返回 9080002;
disconnect / destroy / 再次 init 会清空队列
- 协议辅助函数见 §3.6;拼装 ESC 字节后可用
printBytes / sendRaw
printImage 推荐传入已光栅化的 ESC 字节 base64;仅传 path 时请先在业务侧读文件再 printBytes
getPrinterStatus 以连接态为主;部分机型无状态回读时 rawStatus 为 -1
- 鸿蒙
getBondedDevices 不可用(9080010);蓝牙连接请传系统 deviceId,勿依赖已配对列表接口
- 切换 transport 或彻底释放资源时,请
destroy 后再重新 init