最近应公司要求开发一款小程序,有一个功能是通过低功耗蓝牙进行数据获取。由于本人是Android手机(苹果也有基本不用),所以调试一直用的都是Android端微信调试。产品快发布时,同事就用苹果来测试一下,结果才不忍睹。让我这人称"惊讶经理小王子",顿时颜面扫地。

第一,渲染的蓝牙名字问题

Android端的:

ios 开发 接收蓝牙数据 ios读取蓝牙数据_ios 开发 接收蓝牙数据


Android端中获取到蓝牙信息:name和localName是一致的。所以我就惯用name。

但是ios端:

ios 开发 接收蓝牙数据 ios读取蓝牙数据_小程序_02


ios端的name和localName是不一致的,所以用ios小程序显示的是E04-BT_V1.,当时都懵了。

第二,数据写入问题:

名字错了,发送总该行吧。结果大跌眼睛,一直提示发送错误。因为与小程序连的产品为了统一方便uuid默认0000FFF0-0000-1000-8000-00805F9B34FB,所以我直接把
serviceId: “0000FFF0-0000-1000-8000-00805F9B34FB”,
characteristicId: “0000FFF2-0000-1000-8000-00805F9B34FB”,写死了。
然后就一直报错,当时又懵逼了。于是看了度娘,微信开放社区都没解决。通过自己结合文档摸索,终于找到问题了。
如果手机是ios系统就必须将下两个方法写在wx.writeBLECharacteristicValue({})前面

wx.getBLEDeviceServices({
          deviceId:devv,//devv蓝牙的deviceId就是上面图片中的"532B......."
          success (res) {
                  wx.getBLEDeviceCharacteristics({
	                deviceId:devv,
	                // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
	                serviceId:res.services[1].uuid,//
	                success (res) {
	                  // console.log( res.characteristics)
	                },
	                fail(res) {
	                  console.error('getBLEDeviceCharacteristics===', res)
	                }
              })
                 
                },
                fail (e){
                  console.log('fail services:', res)
                }
              })

IOS写入数据时serviceId(服务)和characteristicId(特征)一定要大写
wx.writeBLECharacteristicValue({
deviceId: devv,
serviceId: “0000FFF0-0000-1000-8000-00805F9B34FB”,
characteristicId: “0000FFF2-0000-1000-8000-00805F9B34FB”,

第三,数据读取问题:

Android系统中wx.writeBLECharacteristicValue({})里直接放wx.notifyBLECharacteristicValueChange({})再放 wx.onBLECharacteristicValueChange(function (res) {})是可以将另一端发送的数据读出来的如下:

wx.writeBLECharacteristicValue({
 	deviceId: devv,
     serviceId: "0000FFF0-0000-1000-8000-00805F9B34FB",
      characteristicId: "0000FFF2-0000-1000-8000-00805F9B34FB",
      value:that.data.buffer,
        success: function (res) {
       			wx.notifyBLECharacteristicValueChange({
                 state: true, 
                  deviceId:devv,
               	  serviceId:"0000FFF0-0000-1000-8000-00805F9B34FB",
                   characteristicId: "0000FFF1-0000-1000-8000-00805F9B34FB", 
                     success: function (res) {
                      wx.onBLECharacteristicValueChange(function (res) {
						 console.log( res)
					})
                          }
                        })
                       }
 })

IOS系统中就必须加上 wx.readBLECharacteristicValue({})不然数据是不更新的。(代码就不上了,跟上面差不多加上wx.readBLECharacteristicValue({}))就行。

下面说一下IOS中的uuid:

ios 开发 接收蓝牙数据 ios读取蓝牙数据_ios_03


这是三种通过wx.getBLEDeviceServices({})获取的。

获取其特征值wx.notifyBLECharacteristicValueChange({})具体看问题二中的代码:

ios 开发 接收蓝牙数据 ios读取蓝牙数据_ios 开发 接收蓝牙数据_04


每一个uuid又有什么权限呢,看下图:

上面properties是权限,下面是对应的uuid

ios 开发 接收蓝牙数据 ios读取蓝牙数据_ios 开发 接收蓝牙数据_05

ios 开发 接收蓝牙数据 ios读取蓝牙数据_Android_06

ios 开发 接收蓝牙数据 ios读取蓝牙数据_ios_07

0000FFF3一般就要用于写操作(wx.writeBLECharacteristicValue({}))的特征值中,因为接收端一般不用0000FFF3特征值。

到这里就结束了,希望帮助你顺利脱坑,以上代码均是我举例说明,请结合自己实际代码进行调试。
希望能够帮到大家哦!IT需要爱与和平😊,最后请大家关注我,以及我的一分钟系列(Android篇和小程序篇)让你一分钟实现相应的功能,成功引起产品经理的注意袄。