在下使用:得力
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)
- 编程无非就是找准
- 最好看一下,并且在后面承上启下多做回顾
小程序蓝牙api流程
- 初始化蓝牙模块 wx.openBluetoothAdapter()
- 开始搜寻附近的蓝牙外围设备 wx.startBluetoothDevicesDiscovery()
- 此操作比较耗费系统资源,请在搜索并
连接到设备后
调用 wx.stopBluetoothDevicesDiscovery 方法停止搜索,网上见过一些Demo无休止的搜索,醉了。 - 可以通过
services -> 蓝牙设备uuid
参数,过滤掉周边不需要处理的其他蓝牙设备。
// 以微信硬件平台的蓝牙智能灯为例,主服务的 UUID 是 FEE7。传入这个参数,只搜索主服务 UUID 为 FEE7 的设备 wx.startBluetoothDevicesDiscovery({ services: ['FEE7'], success (res) { console.log(res) } })
- 此操作比较耗费系统资源,请在搜索并
- 监听寻找到新设备的事件 wx.onBluetoothDeviceFound()
- 获取设备的信息,里面包含
(蓝牙设备uuid -> advertisServiceUUIDs或叫做deviceId)
等
- 获取设备的信息,里面包含
- 连接低功耗蓝牙设备 wx.createBLEConnection()
- 传入你要连接的
(蓝牙设备uuid -> advertisServiceUUIDs或叫做deviceId)
- 传入你要连接的
- 获取蓝牙设备服务 wx.getBLEDeviceServices()
- 这是获取蓝牙服务List,判断
isPrimary == true
该服务为主服务,然后选择我们想要的(蓝牙服务uuid -> services.uuid)
- 这是获取蓝牙服务List,判断
- 获取蓝牙设备服务的特征值 wx.getBLEDeviceCharacteristics()
- Write:有写的功能,并且通过
Notify(通知)属性
返回数据到手机 - 判断
write == true
,最好加上notify == true
- 确认特征,就是确认了
(蓝牙设备特征 -> Characteristic)
- Write:有写的功能,并且通过
- 向低功耗蓝牙设备特征值中写入二进制数据 wx.writeBLECharacteristicValue()
- 传入 设备id、服务id、特征id、和经过分包的二进制的指令数据,进行打印
- 断开蓝牙连接、关闭蓝牙模块 wx.closeBLEConnection()、 wx.closeBluetoothAdapter()
蓝牙指令
- 见文档
数据分包
- 苹果手机ios可以打印
- 安卓手机Android不能打印,是因为安卓 Android 底层貌似做了限制只能接受20个字节,所以数据包要拆分成20字节一组,多组多次发送 demo里面有拆分操作可以自己查看
数据编码格式转换
- 有待了解
注意巨坑
开发请把打印机说明书、微信小程序蓝牙api、指令集说明书仔细浏览
数据异常包括:
- 发送指令与设备应接收类型不匹配(如
TSPL指令
对应TSC标签打印机
)- 指令错误(要保持绝对规范,包括空格、换行符、单双引号、单位等)
- 编码格式:微信官方例子是
gb2312
,我使用gb18030
(测试暂时发现无差别)
连接蓝牙异常
- 小程序蓝牙只支持BLE低功耗蓝牙
- 微信要允许访问蓝牙和位置信息的权限
- 确定手机蓝牙、定位打开
- 搜索蓝牙设备、连接蓝牙设备、加载设备的服务都需要时间,请在完全加载后,再进行下一步操作,
迈妻搓咯叫
- 重启蓝牙设备(打印机)
- 不行的时候,删掉手机中蓝牙设备(打印机),重新链接
蓝牙发送时异常
- 这一点参考WX小程序官方文档,向低功耗蓝牙设备特征值中写入二进制数据
蓝牙发送成功后异常
1. 返回uni.writeBLECharacteristicValue:ok,但就是不打印
- 问题所在
- 数据发送异常,以上
- 解决
- 找到对应的数据异常类型,进行改正
2. 打印数据异常
- 问题所在
- 数据发送异常,以上
- 解决
- 找到对应的数据异常类型,进行改正
- 特例
- 市场上标签打印机品牌和种类很多,可能同一种通讯指令,都会在不同产品中做了变动
- 如:我使用
GAP指令
,可能机器学习后内置了,输入无效,甚至会导致接下的CLS指令
异常失效,因厂家不提供指令集,填了一个深坑 - 自己动手控制变量,逐一排查
(最好购买的时候就确定了指令)
3. 设备异常(如:无限走纸,控制按钮失效异常等)
- 问题所在
- 看看是否存在打印纸,有可能打完了
- 数据发送异常,以上
- 解决
- 重启或者恢复出厂设置(有能力者可以自己发送指令重置)
问题思考
- 蓝牙打印机异常故障如何对接?
- 蓝牙打印机重启,软件如何同步或者判断是否可以打印?
- 若没提供便捷的还原出厂设置,是否可以使用指令解决?