Skip to content

benioZhang/miniprogram-bluetoothprinter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

52b7760 · Jan 8, 2019

History

12 Commits
Dec 7, 2018
Jan 8, 2019
Dec 3, 2018
Dec 10, 2018
Dec 7, 2018
Nov 30, 2018
Dec 11, 2018
Nov 30, 2018
Nov 30, 2018
Dec 3, 2018
Dec 6, 2018
Dec 3, 2018

Repository files navigation

小程序蓝牙打印

微信小程序蓝牙打印示例,代码参考微信小程序示例。官方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?

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

参考

About

微信小程序蓝牙打印

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published