如何用蓝牙和 WiFi链接打印机打印标签?(含 ZPL 指令详解) ️✨

📄 如何用蓝牙和 WiFi链接打印机打印标签?(含 ZPL 指令详解) 🖨️✨

嘿!今天我们来聊聊蓝牙和 WiFi 打印机的使用,包括如何通过代码发送打印指令(比如 ZPL 指令)到打印机完成条码或标签打印!🎉 结合网上参考的示例(比如这篇文章),让你清楚掌握打印机连接的流程和核心原理。🔥


蓝牙打印:连接设备并发送指令 🔵

蓝牙打印主要分两步走:

  1. 获取蓝牙设备列表。
  2. 选择设备并发送 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); // 保存设备到列表
}
通俗解释:蓝牙设备列表的获取
  1. 蓝牙服务:通过 BManager 获取蓝牙服务。
  2. 蓝牙适配器:使用 BAdapter 操作蓝牙,比如获取已绑定的设备。
  3. 已绑定设备:调用 getBondedDevices() 获取已经和手机配对的蓝牙设备列表。
  4. 保存设备信息:将设备名称、地址等保存到 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('设备连接失败');
    }
}
通俗解释:蓝牙打印的流程
  1. 选择设备:从设备列表中选取一个蓝牙设备(通过地址)。
  2. 创建 Socket:通过 createInsecureRfcommSocketToServiceRecord 创建连接。
  3. 连接设备:调用 connect() 方法建立连接。
  4. 发送 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 打印的流程
  1. 连接打印机:通过 IP 和端口(一般是 9100)创建一个 Socket 连接。
  2. 发送 ZPL 指令:使用 outputStream 将 ZPL 指令发送给打印机。
  3. 打印完成:打印机会根据 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 插件市场
💪 先调个打印机试试吧!


🌟 功能概览

这个插件主要完成了两种打印方式:

  1. WiFi 打印:通过 IP 和端口直接连接打印机。
  2. 蓝牙打印:获取蓝牙设备列表,选择设备后打印。

💻 插件文件结构

首先要确认,你已经有以下结构:

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 打印和蓝牙打印的差别

蓝牙打印

  1. 通过蓝牙配对,设备之间直接通信。
  2. 不需要网络,只需两台设备有蓝牙模块。
  3. 适用于小范围内的点对点连接

WiFi 打印

  1. 通过 IP 和端口连接打印机。
  2. 打印机和设备必须在同一个网络(局域网)。
  3. 更适合企业场景,可以远程打印。

🌟 总结

  1. 打印插件的使用步骤:引入插件 → 配置 IP 和端口(或蓝牙) → 调用打印方法。
  2. 蓝牙和 WiFi 打印的选择
    • 小范围打印:用蓝牙。
    • 局域网打印:用 WiFi。
  3. 注意问题:检查设备支持,确保打印机与设备在同一个网络。

用 uniapp 结合打印插件,轻松实现移动端打印,再也不用为复杂的打印问题烦恼啦!🎉

📎 参考文档

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值