iOS BT Mesh 環境介紹與架設(上)

一、前言: 

藍牙4.0(BLE)規範推出之後,由於其極低的運行和待機功耗、低成本和跨廠商互操作性,用於計步器、心律監視器、傳感器物聯網等眾多領域,儘管已被廣泛應用於物聯網領域,侷限於點對點的拓撲結構的限制及傳輸距離較短,對於IoT應用已經不太能夠滿足需求,2017年底Bluetooth SIG提出 Mesh架構,且擁有專門驗證連線互通的工具,確保各個晶片廠商的產品符合規定確保設備互通性。網路上關於Mesh 組網的理論解釋非常多,許多人對於Mesh的標記為Bluetooth Mesh、BLE Mesh或BT Mesh,本篇使用BT Mesh做標記,細部資訊可參考「解密藍牙mesh系列」,關於iOS程式碼實現與講解文章較少,本篇文章將基於Qualcomm QCA402X 開發板搭配Qualcomm 提供的iOS Qmesh Demo App的程式碼進行講解,官方版本別Qmesh_iOS_20191123。

 二、基本BT Mesh功能講解

1.Provisioning — 將BT Mesh裝置進行配置入網,透過具有安全規範的機制, 將應用密鑰 (Application Key or AppKey)、網絡密鑰 (Network Key or NetKey)、設備密鑰 (Device Key or DevKey)及Unicast Address進行配置,當完成整個配置流程後,即成為BT Mesh網路中的Node。

a.應用密鑰 (AppKey) — 安全密鑰保護應用層消息,用於保護特定應用(如照明、溫控等)相關數據安全的密鑰。
b.網絡密鑰 (NetKey) — 提供對特定網絡或子網的訪問,節點必須擁有NetKey,才能成為網絡中的成員,讓節點能夠對網絡層的數據進行解密和驗證。
c.設備密鑰 (DevKey) — 用於確保與特定藍牙Mesh設備的直接通信,每個節點都有唯一的DevKey,通常僅在配置設備時使用。


2.元素 (Elements) — Element在Mesh網路中的位址是可經過計算之後產生,BT Mesh網路中的通訊使用Element的Unicast Address與Model ID進行各種應用與通訊,一個節點可以有一個或多個元素組成,而每個節點至少有一個元素稱為主元素 (Primary Element)。一些節點的處理能力會高於其他節點,而這些節點在mesh網絡中可承擔更為複雜的任務,扮演不同的角色,表現出以下四個節點特徵 (Features),示意圖如圖二:

 a.中繼(Relay)特性 — 接收和轉發消息,如圖一。

 

 圖一、Proxy轉發示意圖

b.代理(Proxy)特性 — 實現GATT和藍牙mesh節點之間的mesh消息發送與接收。
c.Friend特性 — 能夠存儲發往低功耗節點(LPN)的消息和安全更新 可提供Low Power特色的節點服務,當低功耗節點醒來跟Friend要資料時,將存儲的全部訊息傳輸至低功耗節點。
d.低功耗(Low-Power)特性 — 省電型節點,設定Poling時間喚醒與Friend Node發送指令取得相關資料,收完訊息並處理結束後就睡著等待下一次Poling喚醒。

 

 
圖二、BT Mesh網絡的拓撲結構示例 


3.模型(Model)和狀態(State) — 主要是記載Mesh Node中的Element位址所提供的服務類型,每個Element內可以多個Model,但是不能重複Model ID編號。而在BT Mesh Profile的規範中定義多種Model ID的應用類別與編碼。每個模型能夠定義並實施節點的功能和行為,而狀態(State)能夠定義元素的條件,如圖三所示。

舉例:
燈泡節點(Node)
 主元素(Primary Element)
        模型(開/關) (Model 1)
                狀態 -> “On” or “Off”
        模型(亮度) (Model 2)
                狀態 -> 0 ~ 100
 
圖三、Element、Model及State示意圖

 

4.認證 — Provisioning選擇的驗證方法,對未經啟動配置設備進行驗證。分為三種可用的驗證方法(OOB, Out-Of-Band):

a.輸出OOB(Output OOB)
b.輸入OOB(Input OOB)
c.以及靜態OOB(Static OOB)或無OOB(No OOB)。


三、iOS Qmesh使用講解

Qualcomm提供範例程式 Qmesh Demo 是使用Object-C撰寫,當然可以將UI的部分使用Swift的程式語言撰寫,如何在 Swift 專案中使用 Objective-C 的函式庫或檔案呢?底下會有教學,當然你也能全部採用Object-C完成專案。

 

1.Bluetooth權限

點選主專案,右邊“Targets”項目,選擇第一個,看到右邊“Info.plist”,在“Custom iOS Target Properties”新增“Privacy - Bluetooth Always Usage Description”, 否則App在嘗試連接BLE的時會造成Crash問題。

 

2.MTU長度調整

Qmesh Demo預設的MTU為20 bytes,需要調整為512,若不修改在執行Provisioning時,會發生卡住現象無法配置入網,MTU調整位置在QmeshFeatures檔案夾底下QmeshMain.h:

 

[qmeshApi initialiseQmeshLibrary:@(kMaximumNetworksSupported) composition:composition mtu:@(512)];

3.Swift調用Object-C Library

新增一個Swift專案,手動生成 Header File,專案右按鍵,新增,選擇Header File,如圖四。


 圖四、選擇Header File


新增成功後添加import:

 
#import <Qmesh/Qmesh.h>
#import <Qmesh/QmeshApi.h>
#import <Qmesh/QmeshConfigApi.h>
#import <Qmesh/QmeshLibraryApi.h>
#import <Qmesh/QmeshTransportApi.h>
#import "QmeshMain.h"
#import "QTIBTApi.h"
#import "QTIPeripheral.h"
#import "QTIBTManager.h"
#import "QmeshModel.h"
#import "QmeshDevice.h"
#import "QmeshGroup.h"
#import "QmeshDatabase.h"
#import "QmeshLightApi.h"
#import "QmeshConstants.h"
#import "QmeshGenericApi.h"
#import "QmeshErrorCodes.h"


至專案 → TARGETS → Build setting → 搜尋 Objective-C Bridging Header → 雙擊 Objective-C Bridging Header,將剛剛新增的Header File拉入,編譯還是會發生問題,此時需修改Embed,至專案 → TARGETS → General → Frameworks, Lobraries, and Embedded Content → 新增Qmesh.framework 並將 Embed修改為Embed & Sign,這樣編譯才能通過,若沒做修改就會一直卡住無法執行。

 

4.主頁面

圖五所示,Nodes的部分一開始為空白,欲新增裝置點選右邊「Add」按鈕,條轉至Mesh搜尋頁面「QTIAddDeviceViewController」。 

 
 圖五、iOS Qmesh Demo 主頁面

 

5.設備配置流程

圖六為設備配置入網流程圖,一般配置流程在Confirmation階段後進行App key Bind,App key Bind結束之後才算是完成整個配置入網流程,若缺少App key Bind的動作,則無法控制Node的功能,要注意Qmesh Demo內,在App key Bind之前就完成入網,返回主畫面後才檢查是否進行App key Bind的流程也就是圖的右半部分。

 
 圖六、設備配置入網流程圖

 

6.搜尋裝置

如圖七所示,搜尋到一個Mesh裝置,名稱下方為裝置UUID,點選欲新增的裝置,跳轉至「QTIAddTableViewController」操作頁面,進入Provision入網。


 圖七、iOS Qmesh Demo 搜尋裝置頁面


7.Provisioning

「QTIAddTableViewController」操作頁面,進入此畫面後,先取得剛剛選取的provisioningNode進行連線,程式碼如下:


_peripheral = [QTIBTApi sharedInstance].provisioningNode;
if (!_peripheral.isConnected) {
[[QTIBTManager sharedInstance]connectPeripheral:_peripheral];
}​


裝置連線成功後,執行Qmesh provision 六個流程:

a.Connect to the Unprovisioned Device:與未經啟動配置的設備進行連接
b.Sending Invite: 啟動配置設備將以啟動配置邀請PDU的形式,向要進行啟動配置設備發送邀請。
c.Set Capability: 交換設備訊息,設備的Element數量、使用公鑰或私鑰與OOB(Out of Band)認證相關資訊。
d.Exchange Public Key:啟動配置設備和未經啟動配置設備會創建一個FIPS P-256橢圓曲線算法,因此必須擁有公共密鑰。
e.Confirmation: 無論採用何種驗證方式,皆會進行檢查,確保接收值的資料完整性。
f.Complete: 完成入網配置。


 Provisioning的過程中,OOB驗證是採用No OOB,若需調整請參考程式碼,位置於當案內的Managers-> QmeshDatabase -> QmeshDatabase.m

-(NSDictionary *)chooseCapabilities:(NSDictionary *)capabilities

 

當全部流程跑完後,跳出Device Name輸入Alert,請輸入裝置名稱,如圖八所示,按下OK後跳回主頁面。


 圖八、Provisioning流程

Provisioning流程Log資訊,如圖九所示:


 
圖九、Provisioning流程Log資訊圖 


8.App key Bind

返回主畫面之後,發現Node沒立刻顯示,因為還未做App key Bind的動作,此時,系統會連接Proxy node,當Proxy連接成功後,程式碼QmeshDatabase.m內的程式會判斷是否已完成App key Bind,這裡是透過JSON存取資料,並App key Bind完成會做標記,若無標記就會執行App key Bind流程,完成流程後就即可顯示Node,如圖十所示。

 

 圖十、Provisioning完成後新增的Node


App key Bind的部分在QmeshDatabase.m內,其中modelsToBind內要放入Node的Model ID分別為:

a.GENERIC_OnOff_Server:0x1000 換算10進制為4096
b.LIGHT_Lightness_Server:0x1300 換算10進制為4864
c.LIGHT_HSL_Server:0x1307 換算10進制為4871
d.LIGHT_Lightness_Client:0x1302 換算10進制為4866
e.GENERIC_OnOff_Client:0x1001 換算10進制為4097


若要新增其他裝置或不同功能,請更換相應的Model ID,不然不會按照自己設定的執行功能,App key Bind相關使用到的Function為addElementsForAppKeyBind、findNextElementAndModelToBind和setupNextNodeMessage等,如果需要做調整請去QmeshDatabase.m內搜尋。

App key Bind流程Log,顯示Element位置及Model ID,本篇入網設備提供Model ID為GENERIC_OnOff_Server 4096(0X1000)、LIGHT_Lightness_Server  4864(0x1300)及LIGHT_HSL_Server  4871(0x1307),完成App Key Bind才能正常操作功能,Log資訊如圖十一所示:

 
 圖十一、App key Bind流程Log圖

9.配置入網完成

裝置配置入網完成,如圖十二、十三所示,Node顯示Unicast Address、Elements、Models、Company等資訊,Switch可以控制開關燈。

 
 圖十二、配置入網完成畫面(關)


圖十三、配置入網完成畫面(開)

  

四、小結

透過以上描述相信已經了解一些BT Mesh的基本知識,需要詳細了解可以參考「解密藍牙mesh系列」,本篇介紹一些基本知識及iOS Qmesh Demo的注意事項及對應的檔案位置,若需要程式碼請找「詮鼎科技」 Qualcomm Team的人員,後續篇章會為您做後續iOS Qmesh Demo App的程式介紹

 

五、參考資料

Bluetooth® Technology Website

https://www.bluetooth.com/learn-about-bluetooth/bluetooth-technology/topology-options/

 

解密藍牙mesh系列

https://www.eettaiwan.com/20170822nt41-intro-to-bluetooth-mesh-part1/

 

BLE-Mesh技術揭秘

http://doc.iotxx.com/BLE-Mesh%E6%8A%80%E6%9C%AF%E6%8F%AD%E7%A7%98

 

 

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論