更新记录
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 时请先在业务侧读文件再printBytesgetPrinterStatus以连接态为主;部分机型无状态回读时rawStatus为 -1- 鸿蒙
getBondedDevices不可用(9080010);蓝牙连接请传系统 deviceId,勿依赖已配对列表接口 - 切换 transport 或彻底释放资源时,请
destroy后再重新init

收藏人数:
购买普通授权版(
试用
赞赏(0)
下载 26
赞赏 0
下载 12594002
赞赏 1949
赞赏
京公网安备:11010802035340号