蓝牙公司,就是区别蓝牙的唯一认证
既然需要蓝牙打印,就需要连接蓝牙,蓝牙肯定有唯一标识提供连接
(蓝牙设备uuid -> advertisServiceUUIDs或叫做deviceId)
蓝牙部门:
一个蓝牙分成多个部门,叫做蓝牙服务。
他们(员工)会求大同存小异,分类在不同的部门(我测试过一个部门里的员工,完全只有读Read服务)具体如何分类暂时不清楚
(蓝牙服务uuid -> services.uuid)
蓝牙员工:
蓝牙特征,就是部门的员工
(蓝牙设备特征 -> Characteristic)
蓝牙员工才能:
蓝牙特征的属性,亦叫做蓝牙特征值,这是最后关键的临门一脚
员工才是最后提供服务的对象,知己知彼百战不殆,疑人不用用人不疑
不同员工才能有所差异,对此衍生了有Read(读)、Notify(通知)、Write(写)、WriteWithout Response(只写,不返回写的结果)等服务
蓝牙打印必须要write特征值,最好加上notify,详情后续
(蓝牙设备特征值 -> properties)
开始搜寻附近的蓝牙外围设备
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)
获取蓝牙设备服务的特征值 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、指令集说明书仔细浏览
数据异常包括:
发送指令与设备应接收类型不匹配(如 TSPL指令
对应 TSC标签打印机
)
指令错误(要保持绝对规范,包括空格、换行符、单双引号、单位等)
编码格式:微信官方例子是 gb2312
,我使用 gb18030
(测试暂时发现无差别)
连接蓝牙异常
小程序蓝牙只支持BLE低功耗蓝牙
微信要允许访问蓝牙和位置信息的权限
确定手机蓝牙、定位打开
搜索蓝牙设备、连接蓝牙设备、加载设备的服务都需要时间,请在完全加载后,再进行下一步操作,迈妻搓咯叫
重启蓝牙设备(打印机)
不行的时候,删掉手机中蓝牙设备(打印机),重新链接
蓝牙发送时异常
这一点参考WX小程序官方文档,向低功耗蓝牙设备特征值中写入二进制数据
蓝牙发送成功后异常
1. 返回uni.writeBLECharacteristicValue:ok,但就是不打印
数据发送异常,以上
找到对应的数据异常类型,进行改正
2. 打印数据异常
数据发送异常,以上
找到对应的数据异常类型,进行改正
市场上标签打印机品牌和种类很多,可能同一种通讯指令,都会在不同产品中做了变动
如:我使用 GAP指令
,可能机器学习后内置了,输入无效,甚至会导致接下的 CLS指令
异常失效,因厂家不提供指令集,填了一个深坑
自己动手控制变量,逐一排查(最好购买的时候就确定了指令)