欢迎光临,了解微信小程序开发,就上易用通!

跳坑《一百七十六》蓝牙API使用指南

发布:2018-04-20 10:27浏览: 来源:网络 作者:cola

目前蓝牙资料极少,但是为了让大家能够迅速的了解新API及可能遇到的问题,本帖将不断聚合跟蓝牙相关的内容;以便大家参考;

官方文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/bluetooth.html
基础库版本 1.1.0 开始支持,低版本需做兼容处理
iOS 微信客户端 6.5.6 版本开始支持,Android 客户端目前已经支持
由于系统的问题,目前仅在 mac 版的开发工具上支持蓝牙调试
  • tip: Mac系统可能无法获取advertisData及RSSI,请使用真机调试
  • tip: 开发者工具和 Android 上获取到的deviceId为设备 MAC 地址,iOS 上则为设备 uuid。因此deviceId不能硬编码到代码中
  • 开发者工具和 Android 上获取到的deviceId为设备 MAC 地址,iOS 上则为设备 uuid。因此deviceId不能硬编码到代码中
  • tip: 并行调用多次读写接口存在读写失败的可能性。
  • tip: read接口读取到的信息需要在onBLECharacteristicValueChange方法注册的回调中获取。
     

蓝牙错误码(errCode)列表
错误码 说明 备注
0 ok 正常
10000 not init 未初始化蓝牙适配器
10001 not available 当前蓝牙适配器不可用
10002 no device 没有找到指定设备
10003 connection fail 连接失败
10004 no service 没有找到指定服务
10005 no characteristic 没有找到指定特征值
10006 no connection 当前连接已断开
10007 property not support 当前特征值不支持此操作
10008 system error 其余所有系统上报的异常
10009 system not support Android 系统特有,系统版本低于 4.3 不支持BLE
10010 no descriptor 没有找到指定描述符



推荐贴:
微信小程序蓝牙实现连接的开发总结
【蓝牙】开发相关汇总【长期更新】

相关文章:
微信小程序实现BLE蓝牙连接
【经验总结】小程序有效判断手机蓝牙开/关状态
微信小程序 蓝牙BLE开发实战(附demo)
微信小程序更新--测试API之蓝牙
微信小程序最新更新--api测试一览
微信小程序--Ble蓝牙

相关demo:
微信小程序蓝牙通讯demo
微信小程序学习用demo:蓝牙测试
微信小程序 低耗蓝牙接口封装

相关讨论:
Android环境 wx.writeBLECharacteristicValue写入数据无通知
小程序连接Android 蓝牙ble,只搜到自带的service

相关讨论:

小程序蓝牙设备支持咨询
很鸡冻,在28日小程序放出支持蓝牙设备的接口,使小程序的控制功能更厉害.但细看文档后发现该功能目前仅支持iOS 微信客户端 6.5.6和只能在mac开发工具上进行调试。
存有2个疑问:
1、未来会否支持安卓的蓝牙控制?
2、Windows版的开发工具是否支持蓝牙接口的开发(如电脑没蓝牙的,在安卓机上调试)?
下载最新的Android6.5.7已经支持,Windows由于对蓝牙支持不友好,暂不支持。
假如你的安卓仍未支持,请将安卓升级到6.5.7版及以上,重启一下手机进入微信。就可以进行蓝牙测试了

相关讨论:
微信已是6.5.6版本,但是基础库版本还是旧的,应该怎么办?
需要调试蓝牙接口,很着急
Android还没有更新最新版本的公共库

目前需要使用 mac 版本开发工具或者 iOS 机器来调试


相关讨论:
蓝牙功能 怎么没有发送数据 和 监听数据返回的
新开放的蓝牙功能 没有交互数据的吗 怎么没有发送数据 和 监听数据返回的
wx.readBLECharacteristicValue(OBJECT)
wx.writeBLECharacteristicValue(OBJECT)


相关讨论:
蓝牙写入数据 有个问题没有可以写入的值。  比如 写入  AA5504B10000B5  的16进制字符串  ,改怎么写入。
1.jpg
参数列表里面有写
wx.writeBLECharacteristicValue(OBJECT)
向低功耗蓝牙设备特征值中写入二进制数据。注意:必须设备的特征值支持write才可以成功调用,具体参照 characteristic 的 properties 属性
tips: 并行调用多次读写接口存在读写失败的可能性
OBJECT参数说明:

参数 类型 必填 说明
deviceId string 蓝牙设备 id,参考 device 对象
serviceId string 蓝牙特征值对应服务的 uuid
characteristicId string 蓝牙特征值的 uuid
value ArrayBuffer 蓝牙设备特征值对应的二进制值


相关讨论:
安卓6.5.7版本的微信不支持蓝牙吗?
安卓6.5.7版本的微信不支持蓝牙吗?
提示找不到wx.openBluetoothAdapter函数
兼容处理只是检查有没有该接口。
我想知安卓是不是基础库不支持?
[AppleScript] 纯文本查看 复制代码

if (wx.openBluetoothAdapter) {

  wx.openBluetoothAdapter()

} else {  // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示

  wx.showModal({

    title: '提示',

    content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'

  })

}
基础库还未更新,请参考文档如何做兼容处理



相关讨论:
小程序的蓝牙功能,如何获取蓝牙的major minor 值;发送到设备的指令后,没有返回数据,改怎么处理
此功能属于 ibeacon 功能,需要使用 ibeacon 请等下一版本的相关接口


相关讨论:
蓝牙接口无法获取advertisData
onBluetoothDeviceFound回调返回的设备数据有问题,无法获得蓝牙广播数据(ibeacon设备),advertisData为空。

getBluetoothDevices也一样。
mac 上存在底层接口限制,无法获取 BLE 设备的 advertisData



相关讨论:
蓝牙API在mac上调试问题
用mac测试蓝牙可以搜到设备,但是读到的mac地址不对(跟实际的mac地址不一样),用真机测试,连设备都扫不到,经测试发现wx.onBluetoothDeviceFound(function(devices) 这个回调没有响应,求各位指导下,谢谢
图中是用mac测试,搜索到的mac地址,但是实际的地址不一样,用这个地址去扫描service服务也无响应
  • 确保设备是低功耗蓝牙设备而不是经典蓝牙设备
  • 怀疑设备 mac 地址不正确,可以在 mac 上下一个 lightblue 的 app 尝试连接

     


我在ios上面是可以找到我的设备的, 但是地址不一样了, 设备名称没有变化 例如:安卓自己开发的APP下面设备地址:00:15:83:00:85:0A 但是IOS下面变成这样了:57473C16-BCEC-4BC5-9FD7-68FD484B7CC1 修复地址以后可以正确访问的 你不要指定地址,先扫描设备,应该可以找到你的设备





相关讨论:
小程序蓝牙开发蓝牙相关的API介绍中提到目前只支持MAC系统调试,windows系统环境下写代码然后预览上传到iphone手机上测试是否可行
可行


新增讨论:安卓蓝牙 
今天发现小程序可以支持安卓蓝牙API了,但测试了下wx.getBluetoothDevices这个API报错!
另外向非低功耗蓝牙设备发送数据的场景如何实现?比如我要使用蓝牙便携打印机(非低功耗蓝牙)

答:追梦的人 
要先初始化蓝牙 。

Page({
  onLoad: function () {
    //var that = this;

    wx.openBluetoothAdapter({
      success: function (res) {
        console.log(res)

        wx.getBluetoothAdapterState({
          success: function (res) {
            console.log(res)
          }
        })

        wx.startBluetoothDevicesDiscovery({
          success: function (res) {
            console.log(res)
          }
        })

        wx.getConnectedBluetoothDevices({
          success: function (res) {
            console.log(res)
          }
        })

        wx.getBluetoothDevices({
          //services: ['0019E0A29C02'],
          success: function (res) {
            console.log(res)
            // that.setData({
            //   // BLT_name: res.devices[0].name,
            //   // BLT_deviceId: res.devices[0].deviceId,
            //   // BLT_RSSI: res.devices[0].RSSI
            //   // BLT_advertisData: res.devices[0].advertisData
            // })
          }
        })

      }
    })

  }
})  

控制台输出,就wx.getBluetoothDevices报错,其他四个API正常。
错误代码:cannot read property 'map' of undefined
刚才尝试了安卓和苹果的手机返回来的数据不一样,这样子输出出来看看就知道了,但是这个

1111.jpgwx.onBLECharacteristicValueChange(CALLBACK)
这个接口没有实时的数据返回来

 

新增案例:wx.onBluetoothDeviceFound参数类型不统一 
wx.onBluetoothDeviceFound(function(devices) {
        console.log(devices)
}
打印devices
在Mac中devices=[object]
在iphone中devices={ devices : [object] }
在android中devices=object

答:库从建 
需要这样才能统一操作,希望能统一一下参数

44.jpg


新增案例:关于小程序读取蓝牙特征值问题 
有人成功使用小程序调通BLE的吗?为什么我读取的特征值返回的value都是——proto:null
答:开泰 
function buf2hex(buffer) { // buffer is an ArrayBuffer
  return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}

转换下格式就可以了

新增案例:微信小程序的蓝牙功能支持连接OBD读取车载信息吗?微信小程序的蓝牙功能支持连接OBD读取车载信息吗? 
答:林超
理论上如果是低功耗蓝牙都是可以接入的


新增案例:
手机测试蓝牙API,不走devicefound回调,求指导 上面的代码,在mac上调试都没问题,用手机调试就发现不走回调(苹果和安卓微信版本都是6.5.7)
4.jpg
答:飞
参考一下吧,我这个是苹果真机测试(版本6.5.6)可以执行333.jpg

新增案例:
问题:
蓝牙indication可以用哪个API操作
答:吴清生
搞半天换台苹果手机可以用了,android notify API不支持indication

相关讨论:


读取蓝牙设备发出的数据问题
使用 wx.writeBLECharacteristicValue(OBJECT)  发送数据的时候,发送的数据在设备上可以接收到,并且正常,
但是使用 wx.readBLECharacteristicValue(OBJECT) 接收数据的时候,确一直接收不到,
我用了 使用了 wx.onBLECharacteristicValueChange(CALLBACK) 来监听数据,数据发送来的时候事件确实可以激活,但是
wx.onBLECharacteristicValueChange(function(res) {  
console.log(`characteristic ${res.characteristicId} has changed, now is ${res.value}`)
})
上面代码的res.value确一直是空对象,

请问 是不是在底层这里的二进制转换没有做,导致字符串对象为空,还是说这里有什么其他方法可以处理的。


答:维明 
sendtoequ: function (e) {
        var that = this
        console.log(this.data.services)
        console.log("发送消息到:deviceId" + that.data.connectedDeviceId);
        console.log("serviceId:" + that.data.services[0].uuid);
        console.log("characteristicId:" + that.data.characteristicId);


        //这里是核心,自己编码协议
        let buffer = new ArrayBuffer(1)
        let dataView = new DataView(buffer)
        dataView.setUint8(0, 6)
         //这里是核心,自己编码协议


        wx.writeBLECharacteristicValue({
            // 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
            deviceId: that.data.connectedDeviceId,
            // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
            serviceId: that.data.services[0].uuid,
            // 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取
            characteristicId: that.data.characteristicId,
            // 这里的value是ArrayBuffer类型
            value: buffer,
            success: function (res) {
                console.log(res)
                console.log('writeBLECharacteristicValue success', res.errMsg)
            }
        })
    }


这段是给蓝牙设备发了一个字节
方便大家 我自己回答了 收到的数据是二进制格式的,根据自己的协议来读吧。
举个例子
wx.onBLECharacteristicValueChange(function (characteristic) {
console.log('characteristic value comed:')
let buffer = characteristic.value
let dataView = new DataView(buffer)
console.log(dataView.getUint8(1))
})





免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。