uniapp 或小程序,通过蓝牙连接设备, 给设备配网
2021/9/8 17:06:18
本文主要是介绍uniapp 或小程序,通过蓝牙连接设备, 给设备配网,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.打开蓝牙适配器
openBluetoothAdapter() { const that = this wx.openBluetoothAdapter({ success(res) { console.log('open blueFi success: ', res) that.onBluetoothDeviceFound() that.onBluetoothAdapterStateChange() that.startBluetoothDevicesDiscovery() }, fail(error) { let errorRes = blueFi.fail(error) console.log(errorRes) } }) },
2.打开蓝牙搜索功能
startBluetoothDevicesDiscovery() { wx.startBluetoothDevicesDiscovery({ services: UUIDS, success(res) { console.log("打开蓝牙搜索功能成功") } }) }
3.监听寻找到新设备的事件
onBluetoothDeviceFound() { const that = this wx.onBluetoothDeviceFound((res) => { var devices = res.devices; that.setData({ devices: devices }) }) },
4.监听本机蓝牙状态变化的事件
onBluetoothAdapterStateChange() { wx.onBluetoothAdapterStateChange(function(res) { console.log('adapterState changed, now is', res) }) }
5.获取已发现的蓝牙设备 包括 已经和本机处于连接状态的设备
getBluetoothDevices(){ uni.getBluetoothDevices({ success(res) { console.log(res) if (res.devices[0]) { console.log(ab2hex(res.devices[0].advertisData)) } } }) }
6.获取特征值
getBLEDeviceCharacteristics(){ uni.getBLEDeviceCharacteristics({ // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 deviceId, // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取 serviceId, success(res) { console.log('device getBLEDeviceCharacteristics:', res.characteristics) } }) }
7.开启订阅值
notifyBLECharacteristicValueChange(){ uni.notifyBLECharacteristicValueChange({ state: true, // 启用 notify 功能 // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 deviceId, // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取 serviceId, // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取 characteristicId, success(res) { var value = that.ab2hex(res.value); // ArrayBuffer转16进度字符串示例 console.log('notifyBLECharacteristicValueChange success', res.errMsg) } }) }
8. 连接设备
createBLEConnection(){ uni.getBLEDeviceServices({ // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 deviceId, success(res) { console.log('device services:', res.services) this.getBLEDeviceCharacteristics() //获取特征值 setTimeout(function() { that.notifyBLECharacteristicValue() // 开启订阅 let wifi = "chenKKK"; let newWifi = stringToUint8Array(wifi ) // string 转化为 unit8array的函数 that.writeBLECharacteristicValue('53',5,newWifi ) //发送写入数据 // 指令, 长度, 值 , 这里根据设备的协议发 }, 2000) } }) }
9.写入数据
writeBLECharacteristicValue(typeNum,subCMD, data) { let that = this; let deviceId = this.bindDeviceMes.deviceId; let serviceId = this.bindDeviceMes.serviceId; let characteristicId = this.bindDeviceMes.writeId; var beffer = new ArrayBuffer(20) var bufView = new Uint8Array(beffer) bufView[0] = typeNum // 指令1 bufView[1] = subCMD ? bufView[1] = subCMD : bufView[1] = data.length // 指令2 for(let i = 0; i < 18; i++){ // 3-18位值(一共20,我这里不满20位补0) let item = data[i] if(!item){ bufView[2+i] = 0 }else{ bufView[2 +i] = data[i] } } console.log('发送写入指令:' + String(bufView)) // plus.bluetooth.writeBLECharacteristicValue({ //12.25更改 uni.writeBLECharacteristicValue({ // 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取 deviceId, // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取1 serviceId, // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取 characteristicId, // 这里的value是ArrayBuffer类型 value: beffer, success(res) { console.log('写入成功' + JSON.stringify(res)) that.testList.push('写入数据成功' + JSON.stringify(res)) //test4 }, fail(res) { that.testList.push('写入数据失败' + JSON.stringify(res)) //test4 console.log("写入数据失败" + res); } }); },
10. 断开蓝牙连接
closeBluetoothAdapter() { let that = this; that.reConnectNum = 0 let deviceId = this.bindDeviceMes.deviceId; uni.closeBLEConnection({ deviceId, success(res) { that.testList.push('断开蓝牙模块连接') //test4 } }) uni.closeBluetoothAdapter({ success: res => { that.testList.push('断开蓝牙模块成功') //test4 console.log('断开蓝牙模块成功'); } }); that.blueHadConnected = false; },
11.ArrayBuffer转16进度字符串示例 (接受蓝牙返回时使用)
function ab2hex(buffer) { const hexArr = Array.prototype.map.call( new Uint8Array(buffer), function (bit) { return ('00' + bit.toString(16)).slice(-2) } ) return hexArr.join('') }
12. 将string 转化为 unit8array的函数
const stringToUint8Array = function(string) { let pos = 0; const len = string.length; const out = []; let at = 0; // output position let tlen = Math.max(32, len + (len >> 1) + 7); // 1.5x size let target = new Uint8Array((tlen >> 3) << 3); // ... but at 8 byte offset while (pos < len) { let value = string.charCodeAt(pos++); if (value >= 0xd800 && value <= 0xdbff) { // high surrogate if (pos < len) { const extra = string.charCodeAt(pos); if ((extra & 0xfc00) === 0xdc00) { ++pos; value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000; } } if (value >= 0xd800 && value <= 0xdbff) { continue; // drop lone surrogate } } // expand the buffer if we couldn't write 4 bytes if (at + 4 > target.length) { tlen += 8; // minimum extra tlen *= (1.0 + (pos / string.length) * 2); // take 2x the remaining tlen = (tlen >> 3) << 3; // 8 byte offset const update = new Uint8Array(tlen); update.set(target); target = update; } if ((value & 0xffffff80) === 0) { // 1-byte target[at++] = value; // ASCII continue; } else if ((value & 0xfffff800) === 0) { // 2-byte target[at++] = ((value >> 6) & 0x1f) | 0xc0; } else if ((value & 0xffff0000) === 0) { // 3-byte target[at++] = ((value >> 12) & 0x0f) | 0xe0; target[at++] = ((value >> 6) & 0x3f) | 0x80; } else if ((value & 0xffe00000) === 0) { // 4-byte target[at++] = ((value >> 18) & 0x07) | 0xf0; target[at++] = ((value >> 12) & 0x3f) | 0x80; target[at++] = ((value >> 6) & 0x3f) | 0x80; } else { // FIXME: do we care continue; } target[at++] = (value & 0x3f) | 0x80; } return target.slice(0, at); }
13. unit8array转化为 string的方法
function Unit8ArrayToStr(array) { var out, i, len, c; var char2, char3; out = ""; len = array.length; i = 0; while (i < len) { c = array[i++]; switch (c >> 4) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: // 0xxxxxxx out += String.fromCharCode(c); break; case 12: case 13: // 110x xxxx 10xx xxxx char2 = array[i++]; out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); break; case 14: // 1110 xxxx 10xx xxxx 10xx xxxx char2 = array[i++]; char3 = array[i++]; out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0)); break; } } return out; }
这篇关于uniapp 或小程序,通过蓝牙连接设备, 给设备配网的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-13微信小程序如何封装接口域名?-icode9专业技术文章分享
- 2024-11-13如何在微信小程序中实现直传功能?-icode9专业技术文章分享
- 2024-11-13如何在小程序的地图组件中添加标记和文字?-icode9专业技术文章分享
- 2024-11-13在微信小程序的地图组件中如何实现自定义标记和气泡?-icode9专业技术文章分享
- 2024-11-01微信小程序教程:零基础入门到实战
- 2024-11-01微信小程序全栈教程:从入门到实践
- 2024-10-31微信小程序怎么实现关注公众号功能-icode9专业技术文章分享
- 2024-10-30微信小程序cover-view,支持bindtap吗-icode9专业技术文章分享
- 2024-10-30微信小程序的cover-image支持bindtap吗-icode9专业技术文章分享
- 2024-10-30微信小程序web-view怎么设置高度?-icode9专业技术文章分享