代码转换
⼩程序arraybuffer字符串_⼩程序实战之——蓝⽛功能    近期做了个通过蓝⽛完成⽔电缴费需求;项⽬涉及蓝⽛的部分功能是:通过蓝⽛读⽔表基本信息及写⼊相关的命令来控制⽔表的开关阀、⾦额等;这⾥主要说⼀下⼩程序蓝⽛功能的连接且通过蓝⽛发送命令过程中遇到的坑;希望对各位以后开发此功能有所帮助;
⼤概步骤及蓝⽛指令流程
1、wx.openBluetoothAdapter(Object object)  初始化蓝⽛模块
注:在初始化蓝⽛模块之前:停⽌搜寻附近的蓝⽛外围设备及关闭蓝⽛模块;
防⽌第⼀次操作未完成
断开所有已建⽴的连接并释放系统资源
wx.stopBluetoothDevicesDiscovery(Object object)  停⽌搜寻附近的蓝⽛外围设备
wx.closeBluetoothAdapter(Object object)  关闭蓝⽛模块
2、wx.startBluetoothDevicesDiscovery(Object object)  开始搜寻附近的蓝⽛外围设备
注:同时,监听寻到新设备的事件及监听蓝⽛适配器状态变化事件,得到你需要的蓝⽛设备名称(某些设备可能没有)及⽤于区分设备的id等参数;
3、wx.createBLEConnection(Object object)  连接低功耗蓝⽛设备。
注:连接成功后,获取蓝⽛设备所有服务(service);
然后在获取蓝⽛设备某个服务中所有特征值(characteristic);根据返回的特征值取到对应的uuid(write:必须设备的特征值⽀持 write 才可以成功调⽤;notify:必须设备的特征值⽀持 notify 或者 indicate 才可以成功调⽤);
成功获得notify值之后:启⽤低功耗蓝⽛设备特征值变化时的 notify 功能,订阅特征值
4、wx.writeBLECharacteristicValue(Object object)  向低功耗蓝⽛设备特征值中写⼊⼆进制数据
注:向蓝⽛设备写⼊值必须是⼀个0x00的16进制数据,代码如下:
//字符串转ArrayBuffer
function hexStringToArrayBuffer(str) {
if (!str) {
return new ArrayBuffer(0);
}
var buffer = new ArrayBuffer(str.length);
let dataView = new DataView(buffer)
let ind = 0;
for (var i = 0, len = str.length; i < len; i += 2) {
let code = parseInt(str.substr(i, 2), 16)
dataView.setUint8(ind, code)
ind++
}
return buffer;
}
必须设备的特征值⽀持 write 才可以成功调⽤;
并⾏调⽤多次会存在写失败的可能性。
⼩程序不会对写⼊数据包⼤⼩做限制,但系统与蓝⽛设备会限制蓝⽛4.0单次传输的数据⼤⼩,超过最⼤字节数后会发⽣写⼊错误,建议每次写⼊不超过20字节。
若单次写⼊数据过长,iOS 上存在系统不会有任何回调的情况(包括错误回调)。
安卓平台上,在调⽤ notifyBLECharacteristicValueChange 成功后⽴即调⽤ writeBLECharacteristicValue 接⼝,在部分机型上会发⽣ 10008 系统错误
5、wx.onBLECharacteristicValueChange(function callback)  监听低功耗蓝⽛设备的特征值变化事件
注:低功耗蓝⽛设备的特征值变化事件的回调函数(也就是写⼊蓝⽛设备成功之后返回的值)
返回值为: ArrayBuffer⼜称类型化数组,所以需要转换为字符串,代码如下:
// ArrayBuffer转16进度字符串
function ab2hex(buffer) {
var hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + String(16)).slice(-2)
}
)
return hexArr.join('');
}
特别注意事项:
⼀、获取蓝⽛设备所有服务,成功之后存在多个uuid;获取蓝⽛设备某个服务中所有特征值,设备特征值notify也存在多个;
取数组中下标值为1;
⼆、发送⼤于 20 字节的数据包
BLE 4.0 中发送⼀个数据包只能包含 20 字节的数据,⼤于 20 字节只能分包发送。⼩程序提供的 API 中似乎没有⾃动分包的功能,这就只能⾃⼰⼿动分包了。
在ios调试中写⼊字节如果⼤于20字节,将⽆法接受到设备返回值,安卓暂时没发现此类情况;
往期精选
1. 关于Vue和React技术需要分析
2. vue调试神器:vue-devtools
3. ⼩游戏基础
4. npm和node升级的正确⽅式
长安扫码关注我
Max前端

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。