# miniprogram-bluetoothprinter
**Repository Path**: jeteby/miniprogram-bluetoothprinter
## Basic Information
- **Project Name**: miniprogram-bluetoothprinter
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 2
- **Created**: 2021-08-16
- **Last Updated**: 2024-12-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 小程序蓝牙打印
微信小程序蓝牙打印示例,代码参考[微信小程序示例](https://github.com/wechat-miniprogram/miniprogram-demo)。官方Demo总比网上随便找的强吧。
* 测试打印机:[得力DL-581PW热敏票据打印机](https://item.jd.com/4606603.html)
* 测试设备:iPhone 6s
### 效果图
### 流程
* 初始化蓝牙模块 `wx.openBluetoothAdapter()`
* 搜寻附近的蓝牙外围设备 `wx.startBluetoothDevicesDiscovery()`
* 监听寻找到新设备的事件 `wx.onBluetoothDeviceFound()`
* 连接低功耗蓝牙设备 `wx.createBLEConnection()`
* 获取蓝牙设备服务 `wx.getBLEDeviceServices()`
* 获取蓝牙设备服务的特征值 `wx.getBLEDeviceCharacteristics()`
* 向低功耗蓝牙设备特征值中写入二进制数据 `wx.writeBLECharacteristicValue()`
* 关闭蓝牙模块 `wx.closeBluetoothAdapter()`
### 注意点
**1.与蓝牙设备通信很重要的就是找到对应的Characteristic。如何找到这个Characteristic?**
目前只能一个个去试!!!如果有更好的做法请告诉我。
**2.遇到过Characteristic是支持write的,且写入成功,但是没有任何响应的情况。**
原因未知。试试下一个特征值。
**3.写入数据包过大时,存在写入失败,但是却成功打印的情况。**
根据[小程序文档](https://developers.weixin.qq.com/miniprogram/dev/api/wx.writeBLECharacteristicValue.html):
> 并行调用多次会存在写失败的可能性。
小程序不会对写入数据包大小做限制,但系统与蓝牙设备会限制蓝牙4.0单次传输的数据大小,超过最大字节数后会发生写入错误,建议每次写入不超过20字节。
若单次写入数据过长,iOS 上存在系统不会有任何回调的情况(包括错误回调)。
所以我们需要对写入数据做分包处理,对写入操作做延时调用
```javascript
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?**
```javascript
// 存储需要发送的数据,元素用2位16进制表示
let arr = [];
// 将数组转换为8位无符号整型数组
let bufferView = new Uint8Array(arr);
let buffer = bufferView.buffer;
```
**5.如何驱动打印机?**
现在大多数 POS 打印都采用 ESC/POS 指令集,一般情况下使用ESC/POS 指令集即可。
**6.如何打印出同一行内,一部分内容居左,另一部分居右的效果?**
这个说出来你可能不信,是算出来的,中间用空格填充。一开始我也以为有什么什么指令。后来发现想多了。
**7.打印出来的中文乱码?**
使用[text-encoding](https://github.com/inexorabletash/text-encoding)中文进行编码。
### TODO?
* 打印图片
* 打印二维码
* 打印条码
### 参考
* [微信小程序API](https://developers.weixin.qq.com/miniprogram/dev/api/)
* [微信小程序示例](https://github.com/wechat-miniprogram/miniprogram-demo)
* [低功耗蓝牙能力](https://developers.weixin.qq.com/community/develop/doc/0008acd004ccd86b37d649ee55b009?highLine=%25E8%2593%259D%25E7%2589%2599)
* [微信小程序 - 蓝牙接口](https://www.jianshu.com/p/d01dbca67461)
* [ESC(POS)打印控制命令](http://www.xmjjdz.com/downloads/manual/cn/ESC(POS)%E6%89%93%E5%8D%B0%E6%8E%A7%E5%88%B6%E5%91%BD%E4%BB%A4.pdf)
* [ESCPOS](https://github.com/song940/node-escpos)