微信小程式如何實現藍牙連線?本篇文章帶給大家的內容是介紹微信小程式實現藍牙連接的方法(步驟)。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。
最近的專案需要使用小程式的藍牙功能與硬體設備進行連接相互傳送資料指令,聯調過程中發現一些問題,於是想著記錄下來,方便以後查看!
1、初始化藍牙設備
一般使用藍牙功能肯定是想連接某一個藍牙設備,所以需要知道這個藍牙設備的名稱,一般來說都是掃描二維碼連接,那麼當你掃描這個設備二維碼的時候,就需要去初始化你手機上的藍牙模組了
/** * 初始化蓝牙设备 */ initBlue:function(){ var that = this; wx.openBluetoothAdapter({//调用微信小程序api 打开蓝牙适配器接口 success: function (res) { // console.log(res) wx.showToast({ title: '初始化成功', icon: 'success', duration: 800 }) that.findBlue();//2.0 }, fail: function (res) {//如果手机上的蓝牙没有打开,可以提醒用户 wx.showToast({ title: '请开启蓝牙', icon: 'fails', duration: 1000 }) } }) },
2、搜尋藍牙裝置
手機藍牙初始化成功之後,就會去搜尋週邊的藍牙裝置
/** *开始搜索蓝牙设备 */ findBlue(){ var that = this wx.startBluetoothDevicesDiscovery({ allowDuplicatesKey: false, interval: 0, success: function (res) { wx.showLoading({ title: '正在搜索设备', }) that.getBlue()//3.0 } }) },
3、取得藍牙裝置資訊
搜尋藍牙設備之後,需要獲取搜尋到的藍牙設備信息,微信小程式提供了兩個方法可以獲取搜尋到的藍牙設備資訊,分別是:
wx.onBluetoothDeviceFound:監聽尋找到新裝置的事件,表示只要找到新的藍牙裝置就會呼叫一次該方法。
wx.getBluetoothDevices:取得在藍牙模組生效期間所有已發現的藍牙設備,包括已經和本機處於連接狀態的設備
看兩個方法的介紹我們知道他們的差別,但是不了解他們的差別會造成什麼樣的問題呢?
第一次我使用的是wx.onBluetoothDeviceFound方法進行聯調,發現一切正常,由於調試的時候就只有一台設備,發現第二次重新掃碼這個藍牙設備的時候,找不到這個設備了,因為對這個方法來說,這不是一個新的設備,以前連接上過;或者當你因為某些原因藍牙傳送數據指令的時候出錯了需要重新連接,再次連接的時候也找不到目前設備,還是同樣的原因,因為目前設備對這個方法來說不是一個新設備
所以後來我就用了wx.getBluetoothDevices方法
/** * 获取搜索到的设备信息 */ getBlue(){ var that = this wx.getBluetoothDevices({ success: function(res) { wx.hideLoading(); for (var i = 0; i < res.devices.length; i++){ /*that.data.inputValue:表示的是需要连接的蓝牙设备ID,简单点来说就是我想要连接这个蓝牙设备,所以我去遍历我搜索到的蓝牙设备中是否有这个ID*/ if (res.devices[i].name == that.data.inputValue || res.devices[i].localName == that.data.inputValue){ that.setData({ deviceId: res.devices[i].deviceId, consoleLog: "设备:" + res.devices[i].deviceId, }) that.connetBlue(res.devices[i].deviceId);//4.0 return; } } }, fail: function(){ console.log("搜索蓝牙设备失败") } }) },
# 4.連接藍牙裝置
透過上一個步驟找到這個藍牙之後,透過藍牙裝置的id進行藍牙連線
/** * 获取到设备之后连接蓝牙设备 */ connetBlue(deviceId){ var that = this; wx.createBLEConnection({ // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 deviceId: deviceId,//设备id success: function (res) { wx.showToast({ title: '连接成功', icon: 'fails', duration: 800 }) console.log("连接蓝牙成功!") wx.stopBluetoothDevicesDiscovery({ success: function (res) { console.log('连接蓝牙成功之后关闭蓝牙搜索'); } }) that.getServiceId()//5.0 } }) },
5、取得在服務uuid
連接上需要的藍牙裝置之後,取得這個藍牙裝置的服務uuid
getServiceId(){ var that = this wx.getBLEDeviceServices({ // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 deviceId: that.data.deviceId, success: function (res) { var model = res.services[0] that.setData({ services: model.uuid }) that.getCharacteId()//6.0 } }) },
6、透過id查看藍牙裝置的特徵值
如果一個藍牙裝置需要進行資料的寫入以及資料傳輸,就必須具有某些特徵值,所以透過上面步驟取得的id可以查看目前藍牙裝置的特徵值
getCharacteId(){ var that = this wx.getBLEDeviceCharacteristics({ // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 deviceId: that.data.deviceId, // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取 serviceId: that.data.services, success: function (res) { for (var i = 0; i < res.characteristics.length; i++) {//2个值 var model = res.characteristics[i] if (model.properties.notify == true) { that.setData({ notifyId: model.uuid//监听的值 }) that.startNotice(model.uuid)//7.0 } if (model.properties.write == true){ that.setData({ writeId: model.uuid//用来写入的值 }) } } } }) },
7、從後台伺服器取得的指令
startNotice(uuid){ var that = this; wx.notifyBLECharacteristicValueChange({ state: true, // 启用 notify 功能 // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 deviceId: that.data.deviceId, // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取 serviceId: that.data.services, // 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取 characteristicId: uuid, //第一步 开启监听 notityid 第二步发送指令 write success: function (res) { // 设备返回的方法 wx.onBLECharacteristicValueChange(function (res) { // 此时可以拿到蓝牙设备返回来的数据是一个ArrayBuffer类型数据,所以需要通过一个方法转换成字符串 var nonceId = that.ab2hex(res.value) //拿到这个值后,肯定要去后台请求服务(当前步骤根据当前需求自己书写),获取下一步操作指令写入到蓝牙设备上去 wx.request({ method: "POST", data: { xx:nonceId }, url: url, success: (res) => { //res.data.data.ciphertext:我这边服务返回来的是16进制的字符串,蓝牙设备是接收不到当前格式的数据的,需要转换成ArrayBuffer that.sendMy(that.string2buffer(res.data.data.ciphertext))//8.0 // 服务器返回一个命令 我们要把这个命令写入蓝牙设备 } }) } }) },
8、將從後台服務取得的指令寫入到藍牙裝置當中
sendMy(buffer){ var that = this wx.writeBLECharacteristicValue({ // 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取 deviceId: that.data.deviceId, // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取 serviceId: that.data.services, // 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取 characteristicId: that.data.writeId,//第二步写入的特征值 // 这里的value是ArrayBuffer类型 value: buffer, success: function (res) { console.log("写入成功") }, fail: function () { console.log('写入失败') }, complete:function(){ console.log("调用结束"); } }) },
註:以下是需要使用到的兩個格式相互轉換的方法
/** * 将字符串转换成ArrayBufer */ string2buffer(str) { let val = "" if(!str) return; let length = str.length; let index = 0; let array = [] while(index < length){ array.push(str.substring(index,index+2)); index = index + 2; } val = array.join(","); // 将16进制转化为ArrayBuffer return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) { return parseInt(h, 16) })).buffer }, /** * 将ArrayBuffer转换成字符串 */ ab2hex(buffer) { var hexArr = Array.prototype.map.call( new Uint8Array(buffer), function (bit) { return ('00' + bit.toString(16)).slice(-2) } ) return hexArr.join(''); },
註:以上是藍牙連接的全部流程,但是我們在實際使用中肯定不會這麼順暢,而且藍牙發送指令的設備都會有一個特性,就是當前藍牙設備有人連接上之後,其他人是搜索不到這個藍牙設備的,所以你需要考慮在某些個特殊情況,代碼裡需要主動斷開藍牙連接把設備釋放出來供其他用戶使用,還有就是將指令寫入藍牙設備的時候很容易出問題,所以要寫個回調去多次寫入,保證成功性!
總結:以上就是這篇文章的全部內容,希望能對大家的學習有所幫助。 。
相關影片教學推薦:
#以上是微信小程式怎麼實現藍牙連線? (程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!