微信小程序> 微信小程序蓝牙应用小结-微信小程序ble-微信小程序ibeacon

微信小程序蓝牙应用小结-微信小程序ble-微信小程序ibeacon

浏览量:3092 时间: 来源:YYmzx
前言1.

经过几个月的时间,断断续续的修改,终于完成了个人的第一个微信蓝牙小程序,仅此做一个小结。

一、知识储备1.微信小程序API2.

蓝牙部分的API可以到微信公众平台去找,都是官方文件。Android从微信6.5.7开始支持蓝牙程序,iOS从微信6.5.6开始支持。

3.

之前自己稍微整理过一个流程。

4.

蓝牙流程

2.BLE4.05.

BLE4.0是现在流行的一种蓝牙传输协议,其中BLE是BluetoothLowEnergy低功耗蓝牙的简写。整个协议我也只是一知半解,就讲点在应用过程中了解的东西。其余大家感兴趣可以直接搜索下。

6.

先明确几个概念:(个人理解,有问题欢迎指出)

7.

MAC地址:(MediaAccessControlAddress)蓝牙设备的物理地址,每个设备只有一个唯一值。

8.

UUID:(UniversallyUniqueIdentifier)通用唯一识别码,一种软件识别码,一个设备中可以有多个UUID,一个UUID对应一个软件服务部分。

9.

服务(service):有关特征值的收集,用来操作特定功能,所以一个服务里可以有多个特征值。例如,“体温计”服务包括一个温度测量值,以及测量的时间间隔。

10.

特征值(characteristic):在蓝牙设备之间传递的数据值,例如当前温度测量值。

11.

服务、特征称为属性(attributes),并以UUID标识。实现者可能会为所用的专有格式挑选一个随机或伪随机UUID,但蓝牙技术联盟已预留一系列UUID(范围xxxxxxxx-0000-1000-8000-00805F9B34FB))供标准属性使用。

12.

所以可以理解为:

13.

MAC地址:一个人的名字。

14.

服务:一个人做了一件事情。

15.

特征性:考核这件事情的几个指标。

16.

UIDD:用一串数字和字母表示事情或指标。

17.

这些理解了,还要了解一下BLE4.0和传统蓝牙的不同,在单模情况下无法通用传统蓝牙的设备。所以开发小程序前,你要了解你的手机和要连接的蓝牙设备是否能满足BLE4.0的要求,否则硬件基础都不支持,谈何软件实现。

3.vConsole18.

这是微信自带一个真机调试工具,因为蓝牙程序部分无法在“微信web开发者工具”中仿真调试,需要大量的真机调试,所以好好应用vConsole,在后续的开发中至关重要。

19.

vConsole简要介绍

二、开发过程中的磕磕碰碰1.console.log先打出错误信息20.

最开始按照蓝牙流程编写完小程序后,总是遇到各种错误,一个头两个大。

21.

后来就在每段程序里加入:

22.

console.log('连接蓝牙:',res.errMsg+res.errCode);

23.

将全部错误信息打印出来和下表对比,就慢慢有了方向。

24.

错误信息部分截图

2.不行就加延迟25.

如果在使用多个蓝牙API且有先后或者参数传递关系,请加入适当延迟。

26.

没有加延迟的后果是前一个API还没执行完成,后一个API就在执行了,这样后一个API缺少了一些必要的准备或参数。

27.

vConsole中表现出两种情况,1中间状态的参数未赋值,2错误提示前一个API操作的结果出错

28.

以wx.getBLEDeviceServices和wx.getBLEDeviceCharacteristics为例,两者之间有参数传递关系,所以需要延长。

wx.getBLEDeviceServices({deviceId:that.data.connectedDeviceId,success:function(res){for(leti0;ires.services.length;i++){if(res.services[i].uuid.toUpperCase().indexOf("FFE0")!-1){that.setData({serviceUUID:res.services[i].uuid,})console.log("UUID1:"+that.data.serviceUUID);break;}}},fail:function(res){}})setTimeout(function(){wx.getBLEDeviceCharacteristics({deviceId:that.data.connectedDeviceId,serviceId:that.data.serviceUUID,success:function(res){console.log('成功2:',res.errMsg+res.errCode);varnotify_id,write_id,read_id;for(leti0;ires.characteristics.length;i++){if(res.characteristics[i].properties.notify){notify_idres.characteristics[i].uuid;}if(res.characteristics[i].properties.write){write_idres.characteristics[i].uuid;}if(res.characteristics[i].properties.read){read_idres.characteristics[i].uuid;}}that.setData({characteristicId_notify:notify_id,characteristicId_write:write_id,characteristicId_read:read_id,})},fail:function(res){}})},1000)//添加延迟3.为什么iPhone比较难连29.

就一个原因iPhone比较矫情。

30.

使用iPhone时,就算你知道服务的UUID和特征值的UUID,与必须通过wx.getBLEDeviceServices和wx.getBLEDeviceCharacteristics两个API获得。就是上面写道那段代码。

31.

服务的UUID和特征值的UUID,iPhone只识别大写字母,安卓大小写没关系。

32.

安卓和iPhone还有一个不同点:Android上获取到的deviceId为设备MAC地址,iOS上则为设备的UUID。但是在实际应用中仅发现deviceId这个值不同,会影响界面布局,其他倒是没什么感觉。

33.

最后在梳理下安卓和iPhone的连接过程:

34.

安卓:

35.

wx.getBluetoothDevices——获得MAC地址(deviceId)

36.

wx.createBLEConnection——通过MAC地址创建连接

37.

wx.getBLEDeviceServices——获得服务的UUID(ServicesId)如果已知ServicesId,可将ServicesId设置为常量,省略该步骤。

38.

wx.getBLEDeviceCharacteristics——获得特征值的UUID(CharacteristicsId)如果已知CharacteristicsId,可将CharacteristicsId设置为常量,省略该步骤。

39.

wx.notifyBLECharacteristicValueChanged——通过deviceId、ServicesId、CharacteristicsId启动notify模式

40.

iPhone:

41.

wx.getBluetoothDevices——获得设备的UUID(deviceId)

42.

wx.createBLEConnection——通过设备的UUID创建连接

43.

wx.getBLEDeviceServices——获得服务的UUID(ServicesId)不论是否已知ServicesId,都无法省略该步骤。

44.

wx.getBLEDeviceCharacteristics——获得特征值的UUID(CharacteristicsId)不论是否已知CharacteristicsId,都无法省略该步骤。

45.

wx.notifyBLECharacteristicValueChanged——通过deviceId、ServicesId、CharacteristicsId启动notify模式

46.

所以,当你想要两者共用,就乖乖将wx.getBLEDeviceServices和wx.getBLEDeviceCharacteristics两个API都写进去。

4.如何获得可用的服务UUID47.

通过wx.getBLEDeviceServices可以获得所有服务的UUID,但是那个是你需要的?

48.

比如我就筛选了含有“FFE0”的UUID。

49.

if(res.services[i].uuid.toUpperCase().indexOf("FFE0")!-1)

50.

那么怎么获得自己想要的UUID那?

51.

我通过一个APP(在哪下载忘记了,红框是它的logo),尝试了哪些UUID可以使用。

52.

APP界面

5.读数据要用on,不能一口气读写太多53.

比较坑的一点,读取数据建议使用wx.onBLECharacteristicValueChange。

54.

读写操作的buffer是有大小限制,印象中是20个字节大小,如果你没有分段存储,就只能读取到头20个字节。

55.

大于20字节只能分包发送或读取。微信小程序提供的API中没有自动分包的功能,这就只能自己手动分包了。

6.关于波特率56.

暂时微信还没有提供设置蓝牙设备波特率的API,但是通过手机连接测试,波特率在9600-57600之间都可以连接。

后记57.

我已从坑中爬出,写下此文,希望他人能爬的快点,哈哈哈哈!

版权声明

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

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

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