一、前言:
藍牙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。
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喚醒。
3.模型(Model)和狀態(State) — 主要是記載Mesh Node中的Element位址所提供的服務類型,每個Element內可以多個Model,但是不能重複Model ID編號。而在BT Mesh Profile的規範中定義多種Model ID的應用類別與編碼。每個模型能夠定義並實施節點的功能和行為,而狀態(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」。
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 六個流程:
Provisioning的過程中,OOB驗證是採用No OOB,若需調整請參考程式碼,位置於當案內的Managers-> QmeshDatabase -> QmeshDatabase.m
-(NSDictionary *)chooseCapabilities:(NSDictionary *)capabilities
當全部流程跑完後,跳出Device Name輸入Alert,請輸入裝置名稱,如圖八所示,按下OK後跳回主頁面。
圖八、Provisioning流程
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,如圖十所示。
App key Bind的部分在QmeshDatabase.m內,其中modelsToBind內要放入Node的Model ID分別為:
若要新增其他裝置或不同功能,請更換相應的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資訊如圖十一所示:
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
評論