微信小程序> 小程序蓝牙开发官方demo不能发送字符串命令或发送失败10004问题

小程序蓝牙开发官方demo不能发送字符串命令或发送失败10004问题

浏览量:648 时间: 来源:geanwen

这里不做蓝牙流程介绍,因为小程序在前进,官方文档也会变,写一篇博客去介绍API,也许明天API就变了。


这里就记录几个遇到的问题。


这里前提是你已经安装好了微信开发者工具,并且Hello World已经出来了:

小程序


去小程序蓝牙开发官方文档中可以直接从开发者工具中打开蓝牙demo,地址是:

小程序蓝牙开发官方文档


进去之后下图中点击:在开发者工具中预览效果

小程序


就可以直接打开demo项目。


demo中包含了,设备搜索,连接,发送和接收命令的基本代码,遇到的问题也从demo中说起。


遇到的第一个问题:

Demo中发送命令方法中发送了一个随机的16进制语句,我们实际开发中应该是发送设备对应的命令,

命令分为两种,一种Hex格式,一种是字符串转ASCII格式。

它们转换方式不太一样,但是最后的数据传输都是字节流方式传输。

不同之处就是你输入的命令是类似“START”这种明确的字符串还是类似“010102”这种明确的命令。

所以转换字节流的方式是有区别的,demo中提供的hex命令发送。

下面贴一下明确的命令,我这里是“START”、“STOP”等转换发送参数工具方法。

(说白了就是将你要发送的字符串一个一个的转换为对应的ASCII码)


// 字符串转bytefunction 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的时候没有注意。



遇到第三个问题是我们设备定义好的数据格式,这里你可能不会出现,我就是记录下问题。


设备发送回来的数据每一包长21个字节,前四个字节是一个float类型,代表了一个数值,

4-8是一个float,8-12是一个float,12-16是一个无符号的int。

在解析的时候,我直接把传回来的byte[]转成16进制字符串,想16进制字符串在转换为float,最后发现做不到。

做Android使用Java解析没问题。


16进制转int可以,parseInt("参数",16)它提供的第二个参数可以做到,

但是parseFloat不行,直接转之后得到的不是NAN就是整形的一个数字。


最后换了个思路,直接使用byte[]去转float,代码如下:

var xAF = new Float32Array(characteristic.value.slice(0, 4))      var yAF = new Float32Array(characteristic.value.slice(4, 8))      var zAF = new Float32Array(characteristic.value.slice(8, 12))      var itemData = {        accelerationX: xAF[0],        accelerationY: yAF[0],        accelerationZ: zAF[0]      }





版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎