/miniprogram-bluetoothprinter

微信小程序蓝牙打印

Primary LanguageJavaScript

小程序蓝牙打印

微信小程序蓝牙打印示例,代码参考微信小程序示例。官方Demo总比网上随便找的强吧。

效果图

流程

  • 初始化蓝牙模块 wx.openBluetoothAdapter()
  • 搜寻附近的蓝牙外围设备 wx.startBluetoothDevicesDiscovery()
  • 监听寻找到新设备的事件 wx.onBluetoothDeviceFound()
  • 连接低功耗蓝牙设备 wx.createBLEConnection()
  • 获取蓝牙设备服务 wx.getBLEDeviceServices()
  • 获取蓝牙设备服务的特征值 wx.getBLEDeviceCharacteristics()
  • 向低功耗蓝牙设备特征值中写入二进制数据 wx.writeBLECharacteristicValue()
  • 关闭蓝牙模块 wx.closeBluetoothAdapter()

注意点

1.与蓝牙设备通信很重要的就是找到对应的Characteristic。如何找到这个Characteristic?
目前只能一个个去试!!!如果有更好的做法请告诉我。

2.遇到过Characteristic是支持write的,且写入成功,但是没有任何响应的情况。
原因未知。试试下一个特征值。

3.写入数据包过大时,存在写入失败,但是却成功打印的情况。
根据小程序文档

并行调用多次会存在写失败的可能性。
小程序不会对写入数据包大小做限制,但系统与蓝牙设备会限制蓝牙4.0单次传输的数据大小,超过最大字节数后会发生写入错误,建议每次写入不超过20字节。
若单次写入数据过长,iOS 上存在系统不会有任何回调的情况(包括错误回调)。

所以我们需要对写入数据做分包处理,对写入操作做延时调用

let buffer;
const maxChunk = 20;
const delay = 20;
for (let i = 0, j = 0, length = buffer.byteLength; i < length; i += maxChunk, j++) {
    let subPackage = buffer.slice(i, i + maxChunk <= length ? (i + maxChunk) : length);
    setTimeout(this._writeBLECharacteristicValue, j * delay, subPackage);
}

4.如何获取ArrayBuffer?

// 存储需要发送的数据,元素用2位16进制表示
let arr = [];
// 将数组转换为8位无符号整型数组
let bufferView = new Uint8Array(arr);
let buffer = bufferView.buffer;

5.如何驱动打印机?
现在大多数 POS 打印都采用 ESC/POS 指令集,一般情况下使用ESC/POS 指令集即可。

6.如何打印出同一行内,一部分内容居左,另一部分居右的效果?
这个说出来你可能不信,是算出来的,中间用空格填充。一开始我也以为有什么什么指令。后来发现想多了。

7.打印出来的中文乱码?
使用text-encoding中文进行编码。

TODO?

  • 打印图片
  • 打印二维码
  • 打印条码

参考