作者:全栈笔记来自公众号:全栈笔记
自从微信小程序提供BLE蓝牙api后网上随便一搜便是各种称实现了小程序连接ble 的功能的文章网站优化网上随便一搜便是各种称实现了小程序连接ble 的功能的文章上来就贴代码贴效果图对于我们这种没有与硬件开发打过交道的互联网开发者单单看这些文章与小程序api 离自己真正调通还是有一段距离的。
一、BLE特征1、BLE(Bluetooth Low Energy)蓝牙4.0核心profile主要特点是快速搜索快速连接超低功耗保持连接和数据传输缺点:数据传输速率低由于其具有低功耗特点所以经常用在可穿戴设备之中。
2、关于数据传输:每个设备包含了多个service(可以理解为服务)。每个service 同时又包含了多个characteristic特征值每一个具体的characteristic特征值才是BLE通信的主要通道。BLE主机与从机均是通过characteristic来进行通信。
二、BLE连接操作流程
1、初始化蓝牙适配器
2、全局监听蓝牙适配器状态变化事件
3、扫描展示可连接蓝牙设备
4、停止扫描(扫描比较耗费电量)连接指定蓝牙设备
5、连接成功同时扫描服务扫描特征(在扫描特征值成功后开启监听)
6、启用低功耗蓝牙设备特征值变化时的 notify 功能(wx.notifyBLECharacteristicValueChange)注:监听可notify特征
同时开启监听通知(wx.onBLECharacteristicValueChange)此处可获取通知信息(16进制串)在此处做接收到通知后的逻辑处理
7、写数据
8、断开连接(一个BLE只能同时被一个主机连接。如果不用或换主机连接需要先断开当前连接)
9、关闭蓝牙模块。调用该方法将断开所有已建立的链接并释放系统资源
三、开发中字符转换的问题
因为和BLE蓝牙设备通信的数据是 16进制的 ArrayBuffer。所以写数据前及接收到数据后需要进行相应的格式转换
1、写数据: 数字转16进制
js转16进制还是比较方便的 直接用 int.toString(16) 即可有时候需要转的是字符串需要做一些parseInt处理再转16进制
16进制数据转ArrayBuffer
stringToHexBuffer: function (data) {
//var data = 'AA5504B10000B5'
var typedArray = new Uint8Array(data.match(/[\da-f]{2}/gi).map(function (h) {
return parseInt(h, 16)
}))
return typedArray.buffer
},
2、接收到通知数据
ArrayBuffer解析出16进制
buf2hex: function (buffer) { // buffer is an ArrayBuffer
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
},
js 16进制转10进制
eg:接收数据fe1105090b200e01 可能需要截取字段两位为一个解析 解析第三、四位 11 为10进制 :
parseInt(detail.substr(2,2),16).toString(10);
四、如何调试
1、正常流程是先出硬件然后开发小程序去连接硬件操作对应接口硬件给出相应反馈硬件操作写数据通知小程序。
2、如果硬件没有出来需要先开发小程序怎么办。我此次开发就遇到了这个问题硬件还没有SEO关键词硬件还没有对方要求我们先用程序实现api 对方再按照api 开发硬件。其实也有解决如下:
a.首先要准备一个串口BLE蓝牙设备(后续操作是基于这个设备有usb 插头可插到电脑上)
b.下载并安装电脑usb 转 串口驱动(eg : windows下 CH340驱动)
c.下载并安装串口调试工具(eg: windows下 sscom) 打开进行简单设置(自行百度:本人测试时只改动了串口号为COM7波特率为12900SEO关键词波特率为12900同时勾选HEX显示小程序写数据就可以在上面展示了)