这里不做蓝牙流程介绍,因为小程序在前进,官方文档也会变,写一篇博客去介绍API,也许明天API就变了。
这里就记录几个遇到的问题。
这里前提是你已经安装好了微信开发者工具,并且Hello World已经出来了:
去小程序蓝牙开发官方文档中可以直接从开发者工具中打开蓝牙demo,地址是:
进去之后下图中点击:在开发者工具中预览效果
就可以直接打开demo项目。
demo中包含了,设备搜索,连接,发送和接收命令的基本代码,遇到的问题也从demo中说起。
遇到的第一个问题:
Demo中发送命令方法中发送了一个随机的16进制语句,我们实际开发中应该是发送设备对应的命令,
命令分为两种,一种Hex格式,一种是字符串转ASCII格式。
它们转换方式不太一样,但是最后的数据传输都是字节流方式传输。
不同之处就是你输入的命令是类似“START”这种明确的字符串还是类似“010102”这种明确的命令。
所以转换字节流的方式是有区别的,demo中提供的hex命令发送。
下面贴一下明确的命令,我这里是“START”、“STOP”等转换发送参数工具方法。
(说白了就是将你要发送的字符串一个一个的转换为对应的ASCII码)
// 字符串转byte function stringToBytes(str) { var array = new Uint8Array(str.length); for (var i = 0, l = str.length; i < l; i++) { array[i] = str.charCodeAt(i); } console.log(array); return array.buffer; }
在wx.writeBLECharacteristicValue方法中发送:
writeBLECharacteristicValue() { /* START = [83, 84, 65, 82, 84] STOP = [83, 84, 79, 80] REQDATA = [82, 69, 81, 68, 65, 84, 65] */ var buffer = stringToBytes("START") console.log("发送服务码:" + this._characteristicId) wx.writeBLECharacteristicValue({ deviceId: this._deviceId, serviceId: this._deviceId, characteristicId: this._characteristicId, value: buffer, success: function(res){ console.log("发送成功", res) }, fail(res){ console.log("发送失败", res) } }) },
这里我加了success和fail回调方法,理论上上面的命令已经发送出去了,但是到这里第二个问题接着就来了。
通过上面发送命令方式发送之后demo没有一点反映,
硬件也没有预期的效果(我这里发送START命令之后设备的灯从绿色变为蓝色。)
通过回调方法打印,发现代码走入fail中,错误码10004,查找文档说没有找到对应服务。
紧接着我将上面参数全部打印出来,看了半天发现上面传入的参数中,serviceId传的设备的ID,不是对应服务(这里是write服务的uuid)。
将上面的serviceId修改:
writeBLECharacteristicValue() { /* START = [83, 84, 65, 82, 84] STOP = [83, 84, 79, 80] REQDATA = [82, 69, 81, 68, 65, 84, 65] */ var buffer = stringToBytes("START") console.log("发送服务码:" + this._characteristicId) wx.writeBLECharacteristicValue({ deviceId: this._deviceId, serviceId: this.serviceId, characteristicId: this._characteristicId, value: buffer, success: function(res){ console.log("发送成功", res) }, fail(res){ console.log("发送失败", res) } }) },
这样就好了(这点问题分析了一个多小时。。。。)
我以为我修改代码的时候不小心改错了,我又弄了个新的demo,
发现微信小程序蓝牙demo就是这个,应该是开发团队写demo的时候没有注意,我想联系微信客服反映下这个问题,结果找了半天都是机器人。
我在去微信开发者论坛发了个帖子,距离现在已经十分钟过去了,有兴趣的点进去唠十块钱儿的: