日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微信小程序 蓝牙的使用

發(fā)布時(shí)間:2023/12/31 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微信小程序 蓝牙的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

1 一般使用藍(lán)牙功能肯定是想連接某一個(gè)藍(lán)牙設(shè)備,所以需要知道這個(gè)藍(lán)牙設(shè)備的名稱,一般來說都是掃描二維碼連接,那么當(dāng)你掃描這個(gè)設(shè)備二維碼的時(shí)候,就需要去初始化你手機(jī)上的藍(lán)牙模塊了

/*** 初始化藍(lán)牙設(shè)備*/initBlue:function(){var that = this;wx.openBluetoothAdapter({//調(diào)用微信小程序api 打開藍(lán)牙適配器接口success: function (res) {// console.log(res)wx.showToast({title: '初始化成功',icon: 'success',duration: 800})that.findBlue();//2.0},fail: function (res) {//如果手機(jī)上的藍(lán)牙沒有打開,可以提醒用戶wx.showToast({title: '請(qǐng)開啟藍(lán)牙',icon: 'fails',duration: 1000})}})},

?

?2 手機(jī)藍(lán)牙初始化成功之后,就會(huì)去搜索周邊的藍(lán)牙設(shè)備

?

/***開始搜索藍(lán)牙設(shè)備 */ findBlue(){var that = thiswx.startBluetoothDevicesDiscovery({allowDuplicatesKey: false,interval: 0,success: function (res) {wx.showLoading({title: '正在搜索設(shè)備',})that.getBlue()//3.0}})},

?

3 搜索藍(lán)牙設(shè)備之后,需要獲取搜索到的藍(lán)牙設(shè)備信息,微信小程序提供了兩個(gè)方法可以獲取搜索到的藍(lán)牙設(shè)備信息,分別是:

? wx.onBluetoothDeviceFound(監(jiān)聽尋找到新設(shè)備的事件 ——表示只要找到一個(gè)新的藍(lán)牙設(shè)備就會(huì)調(diào)用一次該方法)

? wx.getBluetoothDevices(獲取在藍(lán)牙模塊生效期間所有已發(fā)現(xiàn)的藍(lán)牙設(shè)備。包括已經(jīng)和本機(jī)處于連接狀態(tài)的設(shè)備)

看兩個(gè)方法的介紹我們知道他們的區(qū)別,但是不了解他們的區(qū)別會(huì)造成什么樣的問題?

第一次我使用的是wx.onBluetoothDeviceFound方法進(jìn)行聯(lián)調(diào),發(fā)現(xiàn)一切正常,由于調(diào)試的時(shí)候就只有一臺(tái)設(shè)備,發(fā)現(xiàn)第二次重新掃碼這個(gè)藍(lán)牙設(shè)備的時(shí)候,找不到這個(gè)設(shè)備了,因?yàn)閷?duì)這個(gè)方法來說,這不是一個(gè)新的設(shè)備,以前連接上過;或者當(dāng)你因?yàn)槟承┰蛩{(lán)牙傳送數(shù)據(jù)指令的時(shí)候出錯(cuò)了需要重新連接,再次連接的時(shí)候也找不到當(dāng)前設(shè)備,還是同樣的原因,因?yàn)楫?dāng)前設(shè)備對(duì)這個(gè)方法來說不是一個(gè)新設(shè)備

所以后來我就用了wx.getBluetoothDevices方法

/*** 獲取搜索到的設(shè)備信息*/getBlue(){var that = thiswx.getBluetoothDevices({success: function(res) {wx.hideLoading();for (var i = 0; i < res.devices.length; i++){//that.data.inputValue:表示的是需要連接的藍(lán)牙設(shè)備ID,簡(jiǎn)單點(diǎn)來說就是我想要連接這個(gè)藍(lán)牙設(shè)備,所以我去遍歷我搜索到的藍(lán)牙設(shè)備中是否有這個(gè)IDif (res.devices[i].name == that.data.inputValue || res.devices[i].localName == that.data.inputValue){that.setData({deviceId: res.devices[i].deviceId,consoleLog: "設(shè)備:" + res.devices[i].deviceId,})that.connetBlue(res.devices[i].deviceId);//4.0return;}}},fail: function(){console.log("搜索藍(lán)牙設(shè)備失敗")}})},

?

?

4 通過3.0步驟找到這個(gè)藍(lán)牙之后,通過藍(lán)牙設(shè)備的id進(jìn)行藍(lán)牙連接

/*** 獲取到設(shè)備之后連接藍(lán)牙設(shè)備*/connetBlue(deviceId){ var that = this;wx.createBLEConnection({// 這里的 deviceId 需要已經(jīng)通過 createBLEConnection 與對(duì)應(yīng)設(shè)備建立鏈接deviceId: deviceId,//設(shè)備idsuccess: function (res) {wx.showToast({title: '連接成功',icon: 'fails',duration: 800})console.log("連接藍(lán)牙成功!")wx.stopBluetoothDevicesDiscovery({success: function (res) {console.log('連接藍(lán)牙成功之后關(guān)閉藍(lán)牙搜索');}})that.getServiceId()//5.0}})},

?

?

5 連接上需要的藍(lán)牙設(shè)備之后,獲取這個(gè)藍(lán)牙設(shè)備的服務(wù)uuid

getServiceId(){var that = thiswx.getBLEDeviceServices({// 這里的 deviceId 需要已經(jīng)通過 createBLEConnection 與對(duì)應(yīng)設(shè)備建立鏈接deviceId: that.data.deviceId,success: function (res) {var model = res.services[0]that.setData({services: model.uuid})that.getCharacteId()//6.0}})},

?

?

6 如果一個(gè)藍(lán)牙設(shè)備需要進(jìn)行數(shù)據(jù)的寫入以及數(shù)據(jù)傳輸,就必須具有某些特征值,所以通過上面步驟獲取的id可以查看當(dāng)前藍(lán)牙設(shè)備的特征值

getCharacteId(){var that = this wx.getBLEDeviceCharacteristics({// 這里的 deviceId 需要已經(jīng)通過 createBLEConnection 與對(duì)應(yīng)設(shè)備建立鏈接deviceId: that.data.deviceId,// 這里的 serviceId 需要在上面的 getBLEDeviceServices 接口中獲取serviceId: that.data.services,success: function (res) {for (var i = 0; i < res.characteristics.length; i++) {//2個(gè)值var model = res.characteristics[i]if (model.properties.notify == true) {that.setData({notifyId: model.uuid//監(jiān)聽的值})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 需要已經(jīng)通過 createBLEConnection 與對(duì)應(yīng)設(shè)備建立鏈接 deviceId: that.data.deviceId,// 這里的 serviceId 需要在上面的 getBLEDeviceServices 接口中獲取serviceId: that.data.services,// 這里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中獲取characteristicId: uuid, //第一步 開啟監(jiān)聽 notityid 第二步發(fā)送指令 writesuccess: function (res) {// 設(shè)備返回的方法wx.onBLECharacteristicValueChange(function (res) {// 此時(shí)可以拿到藍(lán)牙設(shè)備返回來的數(shù)據(jù)是一個(gè)ArrayBuffer類型數(shù)據(jù),所以需要通過一個(gè)方法轉(zhuǎn)換成字符串var nonceId = that.ab2hex(res.value) //拿到這個(gè)值后,肯定要去后臺(tái)請(qǐng)求服務(wù)(當(dāng)前步驟根據(jù)當(dāng)前需求自己書寫),獲取下一步操作指令寫入到藍(lán)牙設(shè)備上去wx.request({method: "POST",data: {xx:nonceId},url: url,success: (res) => {//res.data.data.ciphertext:我這邊服務(wù)返回來的是16進(jìn)制的字符串,藍(lán)牙設(shè)備是接收不到當(dāng)前格式的數(shù)據(jù)的,需要轉(zhuǎn)換成ArrayBufferthat.sendMy(that.string2buffer(res.data.data.ciphertext))//8.0// 服務(wù)器返回一個(gè)命令 我們要把這個(gè)命令寫入藍(lán)牙設(shè)備}})}})},

?

?

8 將從后臺(tái)服務(wù)獲取的指令寫入到藍(lán)牙設(shè)備當(dāng)中

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("調(diào)用結(jié)束");}})},

?

?

//ps:下面是需要使用到的兩個(gè)格式相互轉(zhuǎn)換的方法

/** * 將字符串轉(zhuǎn)換成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進(jìn)制轉(zhuǎn)化為ArrayBufferreturn new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) {return parseInt(h, 16)})).buffer},/*** 將ArrayBuffer轉(zhuǎn)換成字符串*/ab2hex(buffer) {var hexArr = Array.prototype.map.call(new Uint8Array(buffer),function (bit) {return ('00' + bit.toString(16)).slice(-2)})return hexArr.join('');},

?

?

//PS:以上是藍(lán)牙連接的全部流程,但是我們?cè)趯?shí)際使用中肯定不會(huì)這么順暢,而且藍(lán)牙發(fā)送指令的設(shè)備都會(huì)有一個(gè)特性,就是當(dāng)前藍(lán)牙設(shè)備有人連接上之后,其他人是搜索不到這個(gè)藍(lán)牙設(shè)備的,所以你需要考慮在某些個(gè)特殊情況,代碼里需要主動(dòng)斷開藍(lán)牙連接把設(shè)備釋放出來供其他用戶使用,還有就是將指令寫入藍(lán)牙設(shè)備的時(shí)候很容易出問題,所以要寫個(gè)回調(diào)去多次寫入,保證成功性!

?

?

BLE低功耗藍(lán)牙具有以下要求的應(yīng)用:

1.通信距離長(zhǎng)達(dá)100米左右。很多低功耗藍(lán)牙需要使用紐扣電池運(yùn)行。很多的物聯(lián)網(wǎng)設(shè)備需要使用標(biāo)準(zhǔn)紐扣電池運(yùn)行很多年。BLE低功耗藍(lán)牙可實(shí)現(xiàn)超低的峰值、均衡和空閑模式的功耗。另外,低占空比設(shè)備還能節(jié)省更多電能。

2.多智能廠商互操作性。作為一個(gè)標(biāo)準(zhǔn)協(xié)議,BLE低功耗藍(lán)牙與此前的藍(lán)牙版本一樣,也得到了主設(shè)備制造商的廣泛采用。也有很多的物聯(lián)網(wǎng)從設(shè)備也支持BLE低功耗藍(lán)牙。安卓、iOS、Windows?10、Linux等主流操作系統(tǒng)均原生支持BLE低功耗藍(lán)牙。預(yù)測(cè),到2020年,95%的智能手機(jī)都將支持BLE低功耗藍(lán)牙。而這個(gè)生態(tài)系統(tǒng)將有助于實(shí)現(xiàn)多廠商互操作性。

3.BLE低功耗藍(lán)牙是搭建集體、家庭、個(gè)人網(wǎng)絡(luò)的最佳選擇,可通過無線方式將供電型智能設(shè)備連接至手機(jī)或計(jì)算機(jī)。因此,越來越多的智能穿戴設(shè)備、計(jì)算機(jī)/手機(jī)外設(shè)和醫(yī)療監(jiān)測(cè)設(shè)備將BLE低功耗藍(lán)牙視為了首選通信協(xié)議。在藍(lán)牙技術(shù)聯(lián)盟的網(wǎng)站上也列出了很多不同支持智能藍(lán)牙協(xié)議的產(chǎn)品和藍(lán)牙智能設(shè)備產(chǎn)品。這直接表明了BLE低功耗藍(lán)牙通信協(xié)議在物聯(lián)網(wǎng)應(yīng)用領(lǐng)域的重要性。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的微信小程序 蓝牙的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。