微信小程序蓝牙打印

在下使用:得力DL-886BW

主流打印机以及对应的指令集

  • 打印机:标签打印机、面单打印机、票据打印机等;
  • TSC -> TSPL;
  • 斑马用的ZPL、EPL、CPCL;
  • EPSON ESC/POS;
  • 国内例如:佳博、芯烨、汉印等,有许多TSPL;

有兴趣自己做了解

蓝牙必要前置知识

  • 蓝牙是什么?
  • 蓝牙打印流程涉及到什么?
    • 编程无非就是找准 对象 -> 指针 -> 算法 -> 数据结构
    • 蓝牙公司:
      • 蓝牙公司,就是区别蓝牙的唯一认证
      • 既然需要蓝牙打印,就需要连接蓝牙,蓝牙肯定有唯一标识提供连接
      • (蓝牙设备uuid -> advertisServiceUUIDs或叫做deviceId)
    • 蓝牙部门:
      • 一个蓝牙分成多个部门,叫做蓝牙服务。
      • 他们(员工)会求大同存小异,分类在不同的部门(我测试过一个部门里的员工,完全只有读Read服务)具体如何分类暂时不清楚
      • (蓝牙服务uuid -> services.uuid)
    • 蓝牙员工:
      • 蓝牙特征,就是部门的员工
      • (蓝牙设备特征 -> Characteristic)
    • 蓝牙员工才能:
      • 蓝牙特征的属性,亦叫做蓝牙特征值,这是最后关键的临门一脚
      • 员工才是最后提供服务的对象,知己知彼百战不殆,疑人不用用人不疑
      • 不同员工才能有所差异,对此衍生了有Read(读)、Notify(通知)、Write(写)、WriteWithout Response(只写,不返回写的结果)等服务
      • 蓝牙打印必须要write特征值,最好加上notify,详情后续
      • (蓝牙设备特征值 -> properties)
  • 最好看一下,并且在后面承上启下多做回顾
    • 蓝牙 UUID、服务、特性、属性 解释
    • 根据主服务uuid搜索蓝牙设备失败

小程序蓝牙api流程

  • 初始化蓝牙模块 wx.openBluetoothAdapter()
  • 开始搜寻附近的蓝牙外围设备 wx.startBluetoothDevicesDiscovery()
    • 此操作比较耗费系统资源,请在搜索并 连接到设备后 调用 wx.stopBluetoothDevicesDiscovery 方法停止搜索,网上见过一些Demo无休止的搜索,醉了。
    • 可以通过 services -> 蓝牙设备uuid 参数,过滤掉周边不需要处理的其他蓝牙设备。
       // 以微信硬件平台的蓝牙智能灯为例,主服务的 UUID 是 FEE7。传入这个参数,只搜索主服务 UUID 为 FEE7 的设备
       wx.startBluetoothDevicesDiscovery({
         services: ['FEE7'],
         success (res) {
           console.log(res)
         }
       })
    
蓝牙设备主 service 的 uuid 获取
  • 监听寻找到新设备的事件 wx.onBluetoothDeviceFound()
    • 获取设备的信息,里面包含(蓝牙设备uuid -> advertisServiceUUIDs或叫做deviceId)
  • 连接低功耗蓝牙设备 wx.createBLEConnection()
    • 传入你要连接的(蓝牙设备uuid -> advertisServiceUUIDs或叫做deviceId)
  • 获取蓝牙设备服务 wx.getBLEDeviceServices()
    • 这是获取蓝牙服务List,判断isPrimary == true该服务为主服务,然后选择我们想要的(蓝牙服务uuid -> services.uuid)
  • 获取蓝牙设备服务的特征值 wx.getBLEDeviceCharacteristics()
    • Write:有写的功能,并且通过 Notify(通知)属性 返回数据到手机
    • 判断 write == true,最好加上 notify == true
    • 确认特征,就是确认了(蓝牙设备特征 -> Characteristic)
  • 向低功耗蓝牙设备特征值中写入二进制数据 wx.writeBLECharacteristicValue()
    • 传入 设备id、服务id、特征id、和经过分包的二进制的指令数据,进行打印
  • 断开蓝牙连接、关闭蓝牙模块 wx.closeBLEConnection()、 wx.closeBluetoothAdapter()

蓝牙指令

  • 见文档

数据分包

  • 苹果手机ios可以打印
  • 安卓手机Android不能打印,是因为安卓 Android 底层貌似做了限制只能接受20个字节,所以数据包要拆分成20字节一组,多组多次发送 demo里面有拆分操作可以自己查看

数据编码格式转换

  • 有待了解

注意巨坑

开发请把打印机说明书、微信小程序蓝牙api、指令集说明书仔细浏览

数据异常包括:

  1. 发送指令与设备应接收类型不匹配(如 TSPL指令 对应 TSC标签打印机
  2. 指令错误(要保持绝对规范,包括空格、换行符、单双引号、单位等)
  3. 编码格式:微信官方例子是 gb2312,我使用 gb18030(测试暂时发现无差别)

连接蓝牙异常

  1. 小程序蓝牙只支持BLE低功耗蓝牙
  2. 微信要允许访问蓝牙和位置信息的权限
  3. 确定手机蓝牙、定位打开
  4. 搜索蓝牙设备、连接蓝牙设备、加载设备的服务都需要时间,请在完全加载后,再进行下一步操作,迈妻搓咯叫
  5. 重启蓝牙设备(打印机)
  6. 不行的时候,删掉手机中蓝牙设备(打印机),重新链接

蓝牙发送时异常

  • 这一点参考WX小程序官方文档,向低功耗蓝牙设备特征值中写入二进制数据

蓝牙发送成功后异常

1. 返回uni.writeBLECharacteristicValue:ok,但就是不打印

  • 问题所在
    • 数据发送异常,以上
  • 解决
    • 找到对应的数据异常类型,进行改正

2. 打印数据异常

  • 问题所在
    • 数据发送异常,以上
  • 解决
    • 找到对应的数据异常类型,进行改正
  • 特例
    • 市场上标签打印机品牌和种类很多,可能同一种通讯指令,都会在不同产品中做了变动
    • 如:我使用 GAP指令,可能机器学习后内置了,输入无效,甚至会导致接下的 CLS指令 异常失效,因厂家不提供指令集,填了一个深坑
    • 自己动手控制变量,逐一排查(最好购买的时候就确定了指令)

3. 设备异常(如:无限走纸,控制按钮失效异常等)

  • 问题所在
    • 看看是否存在打印纸,有可能打完了
    • 数据发送异常,以上
  • 解决
    • 重启或者恢复出厂设置(有能力者可以自己发送指令重置)

问题思考

  1. 蓝牙打印机异常故障如何对接?
  2. 蓝牙打印机重启,软件如何同步或者判断是否可以打印?
  3. 若没提供便捷的还原出厂设置,是否可以使用指令解决?

参考

  • 微信小程序蓝牙api
  • 基于微信小程序的打印机-TSPL指令
  • 打印机打印标签
  • vue.js uni-app 跨平台app框架 蓝牙连接打印机 demo , ESC TSPL 协议与打印机交互
  • 小程序蓝牙打印
  • 蓝牙打印机示例DEMO

你可能感兴趣的:(微信小程序蓝牙打印)