📄 如何用蓝牙和 WiFi链接打印机打印标签?(含 ZPL 指令详解) 🖨️✨
嘿!今天我们来聊聊蓝牙和 WiFi 打印机的使用,包括如何通过代码发送打印指令(比如 ZPL 指令)到打印机完成条码或标签打印!🎉 结合网上参考的示例(比如这篇文章),让你清楚掌握打印机连接的流程和核心原理。🔥
蓝牙打印:连接设备并发送指令 🔵
蓝牙打印主要分两步走:
- 获取蓝牙设备列表。
- 选择设备并发送 ZPL 指令。
Step 1: 获取蓝牙设备列表
先来看看我们是怎么获取蓝牙设备列表的吧!💡
var that = this;
that.deviceList = [];
var main = plus.android.runtimeMainActivity();
var Context = plus.android.importClass('android.content.Context');
var BManager = main.getSystemService(Context.BLUETOOTH_SERVICE); // 获取蓝牙服务
plus.android.importClass(BManager);
var BAdapter = BManager.getAdapter(); // 获取蓝牙适配器
plus.android.importClass(BAdapter);
var lists = BAdapter.getBondedDevices(); // 获取已绑定设备
plus.android.importClass(lists);
var iterator = lists.iterator(); // 遍历设备列表
plus.android.importClass(iterator);
while (iterator.hasNext()) {
var d = iterator.next();
plus.android.importClass(d);
var temp = {
name: d.getName(), // 蓝牙设备名称
address: d.getAddress(), // 蓝牙设备地址
status: d.getBondState(), // 蓝牙绑定状态
uuids: d.getUuids(), // 蓝牙设备的 UUID
op: d
};
that.deviceList.push(temp); // 保存设备到列表
}
通俗解释:蓝牙设备列表的获取
- 蓝牙服务:通过
BManager
获取蓝牙服务。 - 蓝牙适配器:使用
BAdapter
操作蓝牙,比如获取已绑定的设备。 - 已绑定设备:调用
getBondedDevices()
获取已经和手机配对的蓝牙设备列表。 - 保存设备信息:将设备名称、地址等保存到
deviceList
中,方便后续选择。
🚀 输出结果: 我们会得到一个数组,里面保存了所有蓝牙设备的信息,比如:
[
{ "name": "蓝牙打印机1", "address": "00:11:22:33:44:55", "status": 12 },
{ "name": "蓝牙耳机", "address": "66:77:88:99:AA:BB", "status": 12 }
]
Step 2: 连接蓝牙设备并发送指令
获取设备列表后,就可以选择一个蓝牙设备进行连接了!在这里,我们默认选择第一个设备作为打印机。👇
var that = this;
var main = plus.android.runtimeMainActivity();
var BluetoothAdapter = plus.android.importClass('android.bluetooth.BluetoothAdapter');
var UUID = plus.android.importClass('java.util.UUID');
var uuid = UUID.fromString('00001101-0000-1000-8000-00805F9B34FB'); // 蓝牙通用串口服务 UUID
var BAdapter = BluetoothAdapter.getDefaultAdapter(); // 获取蓝牙适配器
var device = BAdapter.getRemoteDevice(this.deviceList[0].address); // 获取设备
plus.android.importClass(device);
var bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid); // 创建 Socket
plus.android.importClass(bluetoothSocket);
if (!bluetoothSocket.isConnected()) {
bluetoothSocket.connect(); // 连接设备
if (bluetoothSocket.isConnected()) {
var outputStream = bluetoothSocket.getOutputStream(); // 获取输出流
plus.android.importClass(outputStream);
// 发送 ZPL 指令
var arrayBuffer = plus.android.invoke(this.ZPLString, 'getBytes', 'gbk');
outputStream.write(arrayBuffer);
outputStream.flush();
bluetoothSocket.close(); // 关闭连接
console.log('打印成功!');
} else {
console.log('设备连接失败');
}
}
通俗解释:蓝牙打印的流程
- 选择设备:从设备列表中选取一个蓝牙设备(通过地址)。
- 创建 Socket:通过
createInsecureRfcommSocketToServiceRecord
创建连接。 - 连接设备:调用
connect()
方法建立连接。 - 发送 ZPL 指令:通过输出流
outputStream
将指令发送给蓝牙打印机。
WiFi 打印:通过 IP 地址和端口发送指令 🌐
WiFi 打印比蓝牙打印更简单,直接通过 IP 和端口连接到打印机即可。👀
if (plus.os.name == 'Android') {
var Socket = plus.android.importClass('java.net.Socket');
var PrintWriter = plus.android.importClass('java.io.PrintWriter');
var BufferedWriter = plus.android.importClass('java.io.BufferedWriter');
var OutputStreamWriter = plus.android.importClass('java.io.OutputStreamWriter');
var socket = new Socket("192.168.1.100", 9100); // 打印机 IP 和端口
var outputStreamWriter = new OutputStreamWriter(socket.getOutputStream());
var bufferWriter = new BufferedWriter(outputStreamWriter);
var socketWriter = new PrintWriter(bufferWriter, true);
// 发送 ZPL 指令
socketWriter.println(this.ZPLString);
console.log('打印成功!');
}
通俗解释:WiFi 打印的流程
- 连接打印机:通过 IP 和端口(一般是
9100
)创建一个 Socket 连接。 - 发送 ZPL 指令:使用
outputStream
将 ZPL 指令发送给打印机。 - 打印完成:打印机会根据 ZPL 指令输出条码或标签。
💡 WiFi 打印更简单,因为不需要蓝牙适配,只要打印机能连上局域网,IP 和端口就能搞定!
ZPL 指令详解 🖋️
在上述例子中,我们用到了一段 ZPL 指令:
^XA
^MD30
^CWJ,E:SIMSUN.TTF^FS
^BYW3.0,2.0
^A0N,30,50^FO100,40^BCW,130,100,N,N,A^FD123^FS
^XZ
解释这段 ZPL
^XA
:开始打印任务。^MD30
:设置打印的亮度。^CWJ,E:SIMSUN.TTF
:设置字体为SIMSUN
。^BYW3.0,2.0
:设置条码宽度。^FO100,40
:设置打印位置。^BCW,130,100,N,N,A
:生成一个条码,条码高度 130,宽度 100。^FD123
:设置条码的内容为123
。^XZ
:结束打印任务。
这段指令会打印一个简单的条码,内容为 123
。
蓝牙 vs WiFi 打印:如何选择?
- 蓝牙打印:适合短距离使用,比如 PDA 直接连接到随身打印机。
- WiFi 打印:适合固定场景,比如打印机放在仓库,通过局域网共享。
💡 选择建议:
- 如果打印机支持 WiFi,优先使用 WiFi,因为配置更简单。
- 如果场景需要移动打印,使用蓝牙打印机。
参考文献
- 本文部分代码和思路参考自这篇文章,在此感谢作者分享的内容。
- 同时结合实际开发经验和实践整理。
✨ Uniapp 打印插件使用教程 🖨️✨
🎯 前言
今天来聊聊如何用 uniapp 和自定义打印插件实现蓝牙打印和 WiFi 打印,简直是一种神奇的现代代码艺术!
你是否曾因为 打印配置太复杂 而抓狂?
你是否也经历过 PDA 无法打印的痛苦?
今天,让我们用最轻松的方式,一步步攻克这些难关!
wifi打印 蓝牙打印 适配斑马等一系列打印 - DCloud 插件市场
💪 先调个打印机试试吧!
🌟 功能概览
这个插件主要完成了两种打印方式:
- WiFi 打印:通过 IP 和端口直接连接打印机。
- 蓝牙打印:获取蓝牙设备列表,选择设备后打印。
💻 插件文件结构
首先要确认,你已经有以下结构:
common/
├── print.js # 打印插件的核心文件
static/
└── font/ # 需要的字体文件
插件文件就是 print.js
,我们稍后详细讲讲它的使用方法。
🖨️ 快速使用步骤
1️⃣ 引入插件文件
在 script
中导入:
import Print from '@/common/print.js';
这个 @
路径在 uniapp 中指代 src
文件夹,确保 print.js
文件放在 common/
目录下哦~
2️⃣ UI 布局(模板)
定义一个简单的页面布局,包含两个按钮:
- 按钮 1:测试 WiFi 打印。
- 按钮 2:测试蓝牙打印。
<template>
<view>
<view style="text-align: center; padding: 10rpx 0; border: 1rpx solid #ccc; border-radius: 15rpx;">
<button type="primary" plain size="mini" @click="print('192.168.3.254', 6101)">
打印测试 WiFi
</button>
<button type="primary" plain size="mini" @click="print()">打印测试蓝牙</button>
</view>
</view>
</template>
👉 样式说明:
text-align: center
:按钮居中。border-radius: 15rpx
:按钮有点小圆角,提升颜值。
3️⃣ JSON 打印内容
这个插件使用的是 ZPL 指令打印内容(Zebra 打印机语言),如下是一段示例:
data() {
return {
jsons: `^XA
^CW1,E:SIMHEI.FNT
^FO10,10^GB760,1180,3^FS
^BY5,3,140
^FO100,40^BC^FD12345678^FS
^FO50,240^FDChannel Code:^FS
^FO50,370^FDPCS:^FS
^FO50,420^FDBag No:^FS
^FO50,470^FDWeight:^FS
^FO50,520^FDProduct:^FS
^FO50,570^FDProt:^FS
^FO50,670^FDPrint:^FS
^FO50,870^FDprompt:^FS
^XZ`
};
}
- ZPL 是什么?
它是 Zebra 打印机专用的语言,用来定义打印内容的布局、字体、条形码等。
4️⃣ 打印核心逻辑
WiFi 打印逻辑:
print(ip, port) {
let print = new Print(this.jsons); // 实例化 Print 类,传入要打印的 ZPL 指令
print.printIp(ip, port); // WiFi 打印需要传入打印机的 IP 和端口
}
蓝牙打印逻辑:
print() {
let print = new Print(this.jsons); // 实例化 Print 类
print.initPrinterList(); // 初始化打印机蓝牙设备列表
print.printBluetoothAdapter(); // 执行蓝牙打印
}
5️⃣ 点击按钮打印
在 HTML 中绑定方法:
<button @click="print('192.168.3.254', 6101)">打印测试 WiFi</button>
<button @click="print()">打印测试蓝牙</button>
📜 代码解析
print.js 关键功能
1. WiFi 打印
printIp(ip, port) {
// 使用 Socket 连接打印机
var socket = new Socket(ip, port);
socket.setSoTimeout(5000); // 设置超时时间
var outputStream = socket.getOutputStream();
outputStream.write(this.data); // 发送打印内容
outputStream.close(); // 关闭连接
}
ip
:打印机的 IP 地址。port
:打印机的端口(通常是6101
)。
2. 蓝牙打印
initPrinterList() {
// 获取所有蓝牙设备
var BAdapter = BluetoothAdapter.getDefaultAdapter();
var bondedDevices = BAdapter.getBondedDevices();
bondedDevices.forEach(device => {
console.log(device.getName(), device.getAddress());
});
}
printBluetoothAdapter() {
// 连接蓝牙设备并发送指令
var bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(UUID);
bluetoothSocket.connect();
var outputStream = bluetoothSocket.getOutputStream();
outputStream.write(this.data);
outputStream.flush();
bluetoothSocket.close();
}
🤔 运行时的一些问题
1️⃣ 蓝牙和 WiFi 打印能在 PDA 上跑吗?
答:可以跑,但前提是设备支持:
- 蓝牙打印:需要设备有蓝牙模块,并且与打印机配对。
- WiFi 打印:需要设备和打印机在同一个局域网。
2️⃣ 运行失败为什么不报错?
uniapp 的 log 并不总是能捕获失败原因,尤其是原生扩展代码(如 plus.android
):
- 可能的原因:
- 插件方法未触发或返回异常。
- 蓝牙或网络连接失败,未抛出错误。
- 解决方法:
- 在每个关键步骤添加日志。
- 用
try-catch
捕获错误,并打印详细信息。
🧠 通俗理解:WiFi 打印和蓝牙打印的差别
蓝牙打印:
- 通过蓝牙配对,设备之间直接通信。
- 不需要网络,只需两台设备有蓝牙模块。
- 适用于小范围内的点对点连接。
WiFi 打印:
- 通过 IP 和端口连接打印机。
- 打印机和设备必须在同一个网络(局域网)。
- 更适合企业场景,可以远程打印。
🌟 总结
- 打印插件的使用步骤:引入插件 → 配置 IP 和端口(或蓝牙) → 调用打印方法。
- 蓝牙和 WiFi 打印的选择:
- 小范围打印:用蓝牙。
- 局域网打印:用 WiFi。
- 注意问题:检查设备支持,确保打印机与设备在同一个网络。
用 uniapp 结合打印插件,轻松实现移动端打印,再也不用为复杂的打印问题烦恼啦!🎉
📎 参考文档: