小程序低功耗蓝牙-基础流程
流程图:
第一步:
注:初始化蓝牙(并判断蓝牙是否已开启)
openBluetoothAdapter() {//可以做开始初始化蓝牙的触发按钮 //开始前建议先关闭蓝牙模块 this.closeBLEConnection();//断开与低功耗蓝牙设备的连接 this.stopBluetoothDevicesDiscovery();//停止搜寻附近的蓝牙外围设备 this.closeBluetoothAdapter();//关闭蓝牙模块 wx.openBluetoothAdapter({ success: (res) => { //成功 =》开始搜寻附近的蓝牙外围设备 this.startBluetoothDevicesDiscovery() }, fail: (res) => { if (res.errCode === 10001) { wx.showToast({ title: '请打开蓝牙定位', icon: 'none', duration: 2500//持续的时间 }); this.jshu(); //监听蓝牙适配器状态变化事件 wx.onBluetoothAdapterStateChange((res) => { //蓝牙适配器可用时 if (res.available) { //再次=》开始搜寻附近的蓝牙外围设备 this.startBluetoothDevicesDiscovery() } }) } } }) }
第二步:
注:监听蓝牙适配器
//获取本机蓝牙适配器状态 getBluetoothAdapterState() { wx.getBluetoothAdapterState({ success: (res) => { if(res.available=="not available"){ wx.showToast({ title: '请打开蓝牙定位', icon: 'none', duration: 2500//持续的时间 }); } //成功=》正在搜索设备 if (res.discovering) { //监听寻找到新设备 this.onBluetoothDeviceFound() //蓝牙适配器可用 } else if (res.available) { //再次=》开始搜寻附近的蓝牙外围设备 this.startBluetoothDevicesDiscovery() } } }) },
第三步:
注:搜索附近的蓝牙外围设备
//开始搜寻附近的蓝牙外围设备 startBluetoothDevicesDiscovery() {
if (this._discoveryStarted) { return } this._discoveryStarted = true wx.startBluetoothDevicesDiscovery({ //是否允许重复上报同一设备 allowDuplicatesKey: false, success: (res) => { //监听寻找到新设备 this.onBluetoothDeviceFound() }, }) },
第四步:
注:监听搜索到的设备
//监听寻找到新设备的事件 -- onBluetoothDeviceFound() { var ths=this; wx.onBluetoothDeviceFound((res) => { //新搜索到的设备列表 res.devices.forEach(device => { if (!device.name && !device.localName) { return } //再次可以对设备进行筛选 //筛选后,调用链接设备方法链接 //链接 this.createBLEConnection(device.deviceId); }) }) },
第五步:
注:链接低功耗蓝牙设备
//连接低功耗蓝牙设备 createBLEConnection(e) { const deviceId = e wx.createBLEConnection({ deviceId, success: (res) => { //获取蓝牙设备所有服务 this.getBLEDeviceServices(deviceId) //已连接 } }) //停止搜寻附近的蓝牙外围设备 this.stopBluetoothDevicesDiscovery() },
第六步:
注:获取已连接的蓝牙所有服务
//获取蓝牙设备所有服务 -- getBLEDeviceServices(deviceId) { wx.getBLEDeviceServices({ deviceId, success: (res) => { console.log('数组长度:'+res.services.length) for (let i = 0; i < res.services.length; i++) { //筛选是否有需要使用的服务 if (res.services[i].uuid.toUpperCase().indexOf("0000FFF0-0000-1000-8000-00805F9B34FB") != -1) { //获取设备特征值 console.log("具有FFF0特性值-------") if (res.services[i].isPrimary) { //获取蓝牙设备某个服务中所有特征值 this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid) } } } } }) },
第七步:
注:获取蓝牙设备某个服务中所有特征值
//获取蓝牙设备某个服务中所有特征值 -- getBLEDeviceCharacteristics(deviceId, serviceId) { var ths=this; wx.getBLEDeviceCharacteristics({ deviceId, serviceId, success: (res) => { // //循环设备特征值列表 for (let i = 0; i < res.characteristics.length; i++) { let item = res.characteristics[i]; //该特征值是否支持 read 操作 if (item.properties.read) { //读取低功耗蓝牙设备的特征值的二进制数据值 wx.readBLECharacteristicValue({ deviceId, serviceId, characteristicId: item.uuid, }) } //该特征值是否支持 write 操作 if (item.properties.write) { this._deviceId = deviceId this._serviceId = serviceId this._characteristicId = item.uuid //向低功耗蓝牙设备特征值中写入二进制数据 //如果想链接上后立刻写入命令,直接在这里调用要写入的命令 ths.writeBLECharacteristicValue() //停止测量 console.log("支持write,执行了写入!!!") } //该特征值是否支持 notify || indicate 操作 if (item.properties.notify || item.properties.indicate) { //启用低功耗蓝牙设备特征值变化时的 notify 功能 wx.notifyBLECharacteristicValueChange({ deviceId, serviceId, characteristicId: item.uuid, state: true, success (res) { console.log('notify开启成功', res.errMsg) } }) } } console.log(deviceId) console.log(this._serviceId ) console.log(this._characteristicId) }, fail(res) { } }) // 操作之前先监听,保证第一时间获取数据 wx.onBLEConnectionStateChange(function(res) { // 该方法回调中可以用于处理连接意外断开等异常情况 // console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`) if(res.connected==false){ console.log('已断开'); ths.openBluetoothAdapter();//重新初始化蓝牙 } }) //接收蓝牙返回的参数 wx.onBLECharacteristicValueChange((res) => { var value = ab2hex(res.value);//ab2hex(值)方法 注:ArrayBuffer转16进度 字符串 if (value.length === 40){ //获取符合条件的返回的参数码 let sys = parseInt(value.slice(28, 30),16); //获取到的返回值sys //停止蓝牙 this.stopBluetoothDevicesDiscovery(); } }) },
第八步:
注:写入命令
//触发按钮 openBluetoothAdapters(){//开始检测 //写入前先判断设备是否链接等,, //写入 this.writeBLECharacteristicValuess(); }, //例 写入 writeBLECharacteristicValuess() { console.log('进入了写入开始!!!'); let buffer = new ArrayBuffer(3) let dataView = new DataView(buffer) dataView.setUint8(0,0x60) dataView.setUint8(1,0x00) dataView.setUint8(2,0x01) console.log(buffer,'buffer') wx.writeBLECharacteristicValue({ deviceId: this._deviceId, serviceId: this._serviceId, characteristicId: this._characteristicId, value: buffer, success: (res) => { console.log("写入成功"+res) } }) },
第九步
注:使用到的方法
- 关闭蓝牙模块
//关闭蓝牙模块 closeBluetoothAdapter() { wx.closeBluetoothAdapter() this._discoveryStarted = false },
- 断开与低功耗蓝牙设备的连接
//断开与低功耗蓝牙设备的连接 closeBLEConnection() { //如果设备还在执行就关闭设备 console.log('deviceId',this.data.deviceId); wx.closeBLEConnection({ deviceId: this.data.deviceId }) },
- 停止搜寻附近的蓝牙外围设备
//停止搜寻附近的蓝牙外围设备 stopBluetoothDevicesDiscovery() { wx.stopBluetoothDevicesDiscovery() },
- 断开连接并停止扫描设备
jshu(){ this.closeBLEConnection();//断开与低功耗蓝牙设备的连接 this.stopBluetoothDevicesDiscovery();//停止搜寻附近的蓝牙外围设备 // this.closeBluetoothAdapter(); },
- ArrayBuffer转16进度
//直接写在page(上方)外 // 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(''); }
总结
- Android需要开起定位和蓝牙,ios需要获取用户定位权限并开启蓝牙;
- ios版本如果链接不上蓝牙,需要增加获取用户定位权限;
- ios版本操控写入时,需要注意该设备服务的特征值不能写死、服务uuid必须大写等。