微信小程序扫描蓝牙及操作(低功耗)蓝牙数据(全套流程)
文章目录
一、Android与iOS之间的不同(开启蓝牙)
扫描蓝牙首先需要打开手机上的蓝牙。iOS只需打开蓝牙即可开始扫描蓝牙;Android需要打开蓝牙及位置信息才可以开始扫描蓝牙。下面的代码可以在扫描之前使用,用来检查是否已经很打开蓝牙及位置信息
官方地址https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.stopBluetoothDevicesDiscovery.html
代码如下:
wx.getSystemInfo({ success: function (res) { var res = wx.getSystemInfoSync(); if (!res.bluetoothEnabled && !res.locationEnabled) { wx.showModal({ title: '提示', content: '您的蓝牙和GPS未开启,请先开启蓝牙和GPS', showCancel: false, success: function () { wx.navigateBack({ delta: 1, }) } }) } else if (!res.bluetoothEnabled) { wx.showModal({ title: '提示', content: '您的蓝牙未开启,请先开启蓝牙', showCancel: false, success: function () { wx.navigateBack({ delta: 1, }) } }) } else if (!res.locationEnabled) { wx.showModal({ title: '提示', content: '您的GPS未开启,请先开启GPS', showCancel: false, success: function () { wx.navigateBack({ delta: 1, }) } }) } else if (res.bluetoothEnabled && res.locationEnabled) { if (callback) {// 这里是回调方法 callback() // 这里是回调方法 } } }, })12345678910111213141516171819202122232425262728293031323334353637383940414243
二、打开与关闭蓝牙适配器
wx.openBluetoothAdapter与wx.closeBluetoothAdapter配套使用,在开始时调用wx.openBluetoothAdapter,在不需要继续扫描蓝牙的时候调用wx.closeBluetoothAdapter。
代码如下(示例):
//打开蓝牙适配器wx.openBluetoothAdapter({ success (res) { console.log(res) }})//关闭蓝牙适配器wx.closeBluetoothAdapter({ success (res) { console.log(res) }})123456789101112
三、开始与关闭搜寻附近的蓝牙外围设备
代码中的services是一个蓝牙设备中的UUID所包含的字符串。
(iOS的蓝牙ID名叫UUID,Android的蓝牙ID名叫MAC地址)只搜索ID中含有它的蓝牙设备。
代码如下(示例):
//开始搜寻附近的蓝牙外围设备wx.startBluetoothDevicesDiscovery({ services: ['FEE7'], success (res) { console.log(res) }})//关闭搜寻附近的蓝牙外围设备wx.stopBluetoothDevicesDiscovery({ success (res) { console.log(res) }})12345678910111213
四、开启与取消监听搜索到新设备的事件
在开启监听之后你可以陆陆续续扫描到新的蓝牙设备(第一次扫描的不够全面,不能扫到附近所有蓝牙设备)
提示:Android扫描蓝牙能力不如iOS扫描蓝牙能力。大致形容(一共30个蓝牙设备在附近,且各不相同。安卓三次左右扫描到所有蓝牙设备。iOS一次左右扫描到所有蓝牙设备)
代码如下(示例):
// ArrayBuffer转16进度字符串示例function ab2hex(buffer) { var hexArr = Array.prototype.map.call( new Uint8Array(buffer), function(bit) { return ('00' + bit.toString(16)).slice(-2) } ) return hexArr.join('');}//开启监听搜索到新设备的事件wx.onBluetoothDeviceFound(function(res) { console.log(res)})//取消监听搜索到新设备的事件wx.offBluetoothDeviceFound()12345678910111213141516
五、获取蓝牙
获取在蓝牙模块生效期间所有搜索到的蓝牙设备。包括已经和本机处于连接状态的设备。
wx.getBluetoothDevices({ success: function (res) { console.log(res)//蓝牙列表 }})12345
六、连接与断开蓝牙
想要读取、监听、修改(低功耗BLE)蓝牙的数据,也就必须先连接蓝牙。拿到蓝牙广播包并解密广播包。(利用上面的方法将广播包中的数据转16进制-----方法ab2hex()解密)
//开始连接蓝牙 wx.createBLEConnection({ deviceId: deviceId, success: function (res) { console.log(res) } })//断开蓝牙连接wx.closeBLEConnection({ deviceId: deviceId, success (res) { console.log(res) }})1234567891011121314
七、读取、监听、修改(写入)蓝牙
deviceId(这个设备的UUID), serviceId为Time顶上的UUID(这整个服务的UUID), characteristicId下面每个单独的小UUID(功能性UUID—读、监听、写入)。每个单独的模式下的Properties代表的就是可以进行读、监听、写入的功能。
// 读取低功耗蓝牙设备的特征值的二进制数据值。注意:必须设备的特征值支持 read 才可以成功调用 Read: function (deviceId, serviceId, characteristicId, callback) { wx.readBLECharacteristicValue({ deviceId: deviceId, serviceId: serviceId, characteristicId: characteristicId, success: function (res) { wx.onBLECharacteristicValueChange(function (res) { if (callback) { callback(res) } }) }, fail: function (res) { if (callback) { callback(res) } } }) }, //监听 notify: function (deviceId, serviceId, characteristicId, callback) { wx.notifyBLECharacteristicValueChange({ state: true, deviceId: deviceId, serviceId: serviceId, characteristicId: characteristicId, success: function (res) { if (callback) { callback(characteristicId) } }, fail: function (res) { if (callback) { callback(res) } } }) }, //写入 write: function (deviceId, serviceId, characteristicId, callback) { let buffer = new ArrayBuffer(1) let dataView = new DataView(buffer) dataView.setUint8(0, 0x01) wx.writeBLECharacteristicValue({ deviceId: deviceId, serviceId: serviceId, characteristicId: characteristicId, value: buffer, success: function (res) { console.log(res) wx.onBLECharacteristicValueChange(function (res) { // console.log(res) if (callback) { callback(res) } }) }, fail: function (res) { // console.log(res) if (callback) { callback(res) } } }) },<ul cl