前言
因為小程序官方是支持接入低能藍牙(BLE)的焰望,所以在一個項目中也嘗試使用如何接入藍牙骚亿,我們從微信的官方網(wǎng)站就可以清楚知道如何使用,但是其中也是有很多坑的熊赖。本著學習的心態(tài)来屠,自己也手把手帶你摸坑,一起處理一些平臺兼容性的問題以及一些邏輯判斷問題
作者在開發(fā)一款共享干衣機小程序震鹉,用的是`uniapp`框架進行開發(fā)的俱笛,開發(fā)期間時遇到了 蘋果(ios) 和 安卓(android)手機 獲取到的 `deviceId(mac)`地址不一致問題;
1、設(shè)備綁定
在共享設(shè)備鋪貨到酒店等場所時传趾,我們會讓工作人員使用小程序碼對共享干衣機設(shè)備進行綁定迎膜,這個目的就是為了解決,用戶打開藍牙連接時會出現(xiàn)N個藍牙浆兰,用戶會不知所措的問題磕仅。
綁定過程需要填寫以下信息:
1、藍牙名稱:自動生成簸呈;
2榕订、設(shè)備編碼:掃描提前生成的小程序碼(里面包含了設(shè)備編碼);
3蜕便、設(shè)備:選擇設(shè)備就是我們選擇藍牙然后拿到`deviceId(mac地址)`劫恒;
4、代理商轿腺;
5兼贸、商戶段直;
?6、網(wǎng)點溶诞;
2鸯檬、用戶使用流程:
我們這個共享項目的用戶使用流程是:
1、用戶掃碼(生成的小程序碼) 里面包含設(shè)備藍牙信息螺垢;
2喧务、彈出連接藍牙給用戶連接 (通過小程序碼里的藍牙信息里的`deviceId(mac地址)`過濾掉其他藍牙,只顯示用戶掃碼設(shè)備的藍牙);
3枉圃、用戶連接成功后 隱藏連接藍牙按鈕顯示 立即使用按鈕功茴;
4、用戶選擇使用時長(默認30分鐘)孽亲;
5坎穿、點擊立即使用調(diào)用支付;
6返劲、支付成功后 (小程序下發(fā)開關(guān)定時指令給干衣機設(shè)備進行使用)玲昧;
3、平臺差異化
因為我們使用的是`uniapp`框架開發(fā)所以沒看到`uniapp`說明這個...(大坑)
后來我們從微信文檔上面看到這樣一段話:
看到這里我就想著篮绿,完犢子了孵延,因為我們的手機平臺有安卓和蘋果,唯一標識藍牙的就是`deviceId`亲配,但是蘋果搜索出來就不是這個了尘应,而是`uuid`的一串字符串。因為蘋果官方認為透露`deviceId(MAC地址)`會有安全問題吼虎,索性直接屏蔽了犬钢。
4、問題分析
開發(fā)安卓和IOS的APP中思灰,在獲取藍牙模塊的MAC地址的時候有區(qū)別娜饵。
安卓系統(tǒng)在藍牙這一塊,給了獲取藍牙模塊MAC地址的接口官辈,所以直接用就行箱舞,包括安卓端的微信小程序或者其他小程序拳亿。
IOS比較嚴謹晴股,不允許獲取藍牙模塊的MAC地址肺魁,沒有給出API,所以必須要在藍牙模塊這一端做一些特別的設(shè)置。
在設(shè)備綁定時工作人員用安卓綁定的設(shè)備是唯一的寂呛,而用戶使用ios搜索藍牙時怎诫,每個用戶搜索到的藍牙設(shè)備都是`uuid`隨機的`deviceId`與我們綁定`deviceId`的不匹配,因此也就無法在用戶使用的時候過濾其他藍牙了幻妓。
5劫拢、解決方案
方法1-特定的UUID去讀取MAC地址
其實這類型的應用并不多肉津,因為他需要建立連接之后,才能獲取到mac地址舱沧,這樣就不實用了
在程序開發(fā)中我們很少有采用這樣的方式的 妹沙。其實實現(xiàn)也很簡單,一說就懂
所以這個方法距糖,暫時不推薦使用牵寺,請詳細了解一下方法二丈咐。
方法2-MAC地址存放在藍牙模塊廣播包里面
在廣播包里面棋枕,查找藍牙的 MAC 地址东亦,一般良心廠商都會存放在廣播包里面,所以可以獲取到典阵。
作者開發(fā)的藍牙線路板廠商沒有寫進去...,然后聯(lián)系廠商重新燒錄進去壮啊。
經(jīng)過了九九八十一天來回郵寄線路板歹啼,廠商終于把 mac 地址寫入進`advertisData`去了。
下面是原始數(shù)據(jù)
這里我們稱之為:`advertisData(當前藍牙設(shè)備的廣播數(shù)據(jù)段中的 ManufacturerData 數(shù)據(jù)段藤树, 類型為:ArrayBuffer)`拓萌。
**做這個的目的,有如下原因:**
1、微信小程序開發(fā):無法直接獲取藍牙芯片的 mac 地址品嚣,沒有相應的API钧大,所以可以通過這個獲取到,具體網(wǎng)上可以搜一下
2拓型、APP 開發(fā)--IOS 端,也沒辦法直接獲取 MAC 地址册养,也是通過這個方式得到藍牙芯片的 MAC 地址
3压固、APP 開發(fā)--安卓端,沒有這個問題帐我,直接通過 API 時可以獲取到藍牙芯片的 mac 地址的。所以用不用這個功能拦键,都無所謂
實現(xiàn)代碼:
```js
// 初始化藍牙模塊
uni.openBluetoothAdapter({
? success(res) {
? ? // 開始搜尋附近的藍牙外圍設(shè)備
? ? uni.startBluetoothDevicesDiscovery({
? ? ? success(res) {
? ? ? ? // 監(jiān)聽尋找到新設(shè)備的事件
? ? ? uni.onBluetoothDeviceFound((devices) =>{
? ? ? ? ? console.log(ab2hex(devices[0].advertisData)) // 獲取到 mac 地址
? ? ? ? })
? ? ? }
? ? })
? }
})
// ArrayBuffer轉(zhuǎn)16進度字符串示例
function ab2hex(buffer) {
? const hexArr = Array.prototype.map.call(
? ? new Uint8Array(buffer),
? ? function (bit) {
? ? ? return ('00' + bit.toString(16)).slice(-2)
? ? }
? )
? return hexArr.reverse().join(':')
}
```
至此成功芬为,我們拿到了藍牙的`mac地址`,然后就可以進行后續(xù)操作了媚朦。