iOS藍芽Mesh開發總結一

懶得起使用者名稱啊發表於2019-12-10

藍芽Mesh

前言

不知不覺間做藍芽開發已經一年時間了,從最開始的系統BLE(低功耗)藍芽到雲端藍芽OTA再到現在的藍芽Mesh。本篇文章主要用來記錄總結藍芽Mesh開發流程及開發中遇到的一些問題,同時也儘可能的給正在開發iOS藍芽Mesh的小夥伴們提供一些幫助。

藍芽Mesh的概念

有關藍芽Mesh概念方面的問題我想你已經在此之前就已經瞭解過了,畢竟百度上有一大堆的CV概念,這裡就不再贅述了。如果沒有了解過的話建議可以看看這裡藍芽Mesh概念

iOS如何開發藍芽Mesh?

使用第三方庫,推薦Nordic公司在GitHub上的iOS-nRF-Mesh-Library開源庫。目前這個庫的第二版已經完成,所以也就不用再關心第一版有多噁心了?。
雖然第二版相對於第一版要好很多,但使用過程中還是可能存在一些問題:

  • 這個庫使用的是swift語言開發的,對於使用OC開發的人來說可能不是很友好,搞過混編或者瞭解過swift語言的應該都知道OC的內容基本上swift都已經能夠支援了,但swift中有些東西OC是無法支援的,比如:結構體、列舉型別。
  • swift語言開發framework時若要支援OC則要在公有類或方法前新增@objc關鍵字,遺憾的是這個庫沒新增。

因此建議開發者如果對swift語言比較熟悉建議使用swift開發藍芽Mesh,使用OC開發則必不可免的要改第三方庫的程式碼了,具體怎麼使用自己斟酌吧。

iOS開發藍芽Mesh要做什麼?怎麼做?

這一點很重要,剛開始要做藍芽Mesh的時候,在百度上搜iOS藍芽Mesh相關的內容根本搜不到,能搜到的都是一群CV大法講解藍芽Mesh是什麼,幹什麼的?也就是上面說的藍芽Mesh概念,看完了還是不知道我們iOS到底要做什麼,怎麼做?
不過不用擔心,看完了這個文章,你就知道iOS在做藍芽Mesh的時候要做哪些功能,要怎麼開始做了。

還是要先說一下概念

  • 節點:所謂節點其實就是藍芽裝置,在配網之前叫裝置,配置到Mesh網路中後就改名叫節點了,至於節點有什麼特性這不是我們做iOS的能決定的,這要看硬體工程師怎麼燒的程式碼了。

  • 四大節點:中繼節點、代理節點、低功耗節點、朋友節點。但作為iOS開發我們不用管那麼多,在意一下代理節點就行,因為我們手機傳送的所有指令基本都是通過代理節點轉發的。

  • 建立網路:所謂建立一個Mesh網路,說的簡單點就是初始化一些網路的配置資訊,如:網路的唯一標識(meshUUID)、訊息傳輸金鑰(AppKeys)等關鍵資訊。至於建立完之後要將資訊儲存在哪就要根據實際情況了,那個第三方庫是預設儲存在本地的,我們在做的時候是將網路資訊儲存在了雲端,這樣方便將使用者和Mesh網路進行繫結。

  • 手機在藍芽Mesh中扮演的角色:手機在Mesh網路中主要的作用是配置器,其次手機也可以算是Mesh中的一個特殊的節點,因為手機可以和網路內的任意一個節點通訊,特殊性就體現在手機只能在連線到代理節點的時候才能和其他節點通訊。

  • 配網:配網是一系列操作的統稱,這一系列操作達到的目的就是將一個支援藍芽Mesh的藍芽裝置新增到手機建立的Mesh網路中。

上面我們知道了配網的概念,接下來說一些配網的具體內容,配網總體上分為5個步驟:

  • 第一步:支援藍芽Mesh的裝置在配置入網前有一個UUID是1827的服務,這個服務下有兩個特徵,一個讀一個寫。藍芽裝置會持續的傳送廣播包供手機搜尋。手機通過iOS系統庫CoreBluetooth裡面提供的藍芽掃描方法掃描擁有1827UUID的藍芽裝置,掃描到之後建立連線,發現服務特徵,訂閱藍芽裝置讀特徵。
  • 第二步:在第一步的基礎上向藍芽裝置傳送邀請資訊、邀請這個裝置加入Mesh網路。裝置收到邀請資訊後會將自身的一些資訊傳送給手機,如:裝置的元素個數,元素種類,公鑰型別、加密演算法等。
  • 第三步:在第二步的基礎上既然郎有情、妾有意,那麼接下來就是要交換定情信物(公鑰)了。
  • 第四步:定情信物都交換了,馬上就要在一起了,還是再測試一下對方是不是真心的比較好,畢竟現在後悔還來得及,於是就有了這一步隨機數認證環節,類似於金鑰確認。
  • 第五步:認證通過之後,總要讓新來的裝置擁有一些名分啊,就需要給裝置分配一些資料,如:裝置單播地址、netKey、keyIndex、ivIndex這些。 哈哈,裝置配網完了才發現Mesh網路內並不只有這一個裝置,可是後悔也晚了,手機實屬是個渣男。

已經說了配網的步驟,那我們iOS在寫程式碼的時候不會要把每一個步驟都自己實現吧?當然不會,那不是有第三方庫嘛。上面那個第三方庫已經幫我們把配網的5個步驟封裝了好多了,第一步掃描裝置這部分的實現是在官方的demo中寫的,第二步使用ProvisioningManager物件呼叫identify方法即可。後面的三步封裝到一個方法裡面了,ProvisioningManager類中provision方法。

說到這裡你應該已經大概知道我們iOS開發在開發藍芽Mesh時應該要做哪些內容了吧?我再總結一下,我們在開發藍芽Mesh時需要做的基本上有以下三點:

  • 建立一個Mesh網路
  • 給這個Mesh網路配置節點
  • 手機給Mesh網路內的節點傳送訊息或指令。

大體上總結下來我們iOS要實現的功能就這三點。是不是要問我怎麼就說了前兩點,發訊息怎麼不說說怎麼做?別急,讓我緩緩,有關訊息這一塊的內容比較多,在下一篇文章中再慢慢道來吧。

相關文章