BT Mesh APP開發流程介紹(Android 版)- 上

A. 前言
藍牙技術為一種無線通訊協議,目前已經廣泛應用於數十億台設備上,而BT Mesh為基於BLE (Bluetooth Low Energy) 網路協議下的網路技術。在BT Mesh網路中,與一般低功耗藍牙技術中的“一對一”或“一對多”不同,BT Mesh建立了無線設備之間的多對多關係,而智慧型手機在其中的角色為Provisioner,可以透過手機APP將設備加入BT Mesh網路中。

本篇主要介紹BT Mesh基本必備知識及基於Qualcomm Android SDK配置流程介紹。


B. Mesh
架構介紹

如下圖所示,藍牙低功耗技術中,一般利用「單一向心狀集線器元件進行星狀拓樸聯網,由手機擔任網路主控(Master),連結一個或多個的從屬(Slave)裝置。」而BT Mesh提供無線設備之間的多對多關係,其覆蓋面積廣及監測和控制大量設備的能力與星狀拓樸聯網相比,可以將延遲降低許多。




CBT Mesh Node, Element, Model介紹

下圖為Node, Element及Model之間的關係。

BT Mesh Node架構


每一個節點中,必須擁有一個主元素,或多個次要元素,每個元素都有一個唯一地址,稱為單播地址(Unicast Address),每個元素都擁有一個模型或多個模型,模型為決定某一節點的基本功能及狀態。

藍牙Mesh網路節點特性:

  • 中繼功能(Relay):可中繼訊息,擴展藍牙網狀網路的範圍和規模,屬於選項功能。
  • 低功耗功能(Low Power):休眠和輪詢(poling)朋友節點訊息,輪詢間隔時間可從毫秒到四天。
  • 朋友功能(Friend):可執行消息緩存(cache)的附加功能,以支持低功耗節點。
  • 代理功能(Proxy):可啟用藍牙網狀網路和GATT設備之間的訊息代理功能。(BT Mesh中, 手機APP唯一可連接的端點)

D. BT Mesh Publish, Subscribe
介紹


發佈(Publish: 設備(開關3)可以將訊息發送至特定位置(Hallway)。

訂閱(Subscribe:設備(燈4, 5)經過配置後,可接收由開關3發送到特定位置(Hallway)的訊息。

當開關3設定為On,燈4, 5就會On,可以透過訂閱跟發佈做狀態控制。


E. BT Mesh App開通裝置及組網流程

Qualcomm Android SDK中提供了Mesh Library,接下來為大家介紹在SDK中配置入網的重點功能。

Mesh Bearer API:當BT Mesh Provisioner(手機)進行掃描時,從Mesh Library中的Mesh Bearer API啟用廣播渠道進行自動掃描Proxy Node。


以下為APP(新增節點)的流程圖:



首先,在APP首頁中按下新增裝置的按鈕後開始搜尋周圍的BT Mesh設備,主要是透過“ScanResultsAdapter.java”執行

掃描功能是透過Library內的“AdvertType.java”中的“PB-GATT_ADVERT_DATA”讓Provisioner能夠接收到Unprovisioned device所發送出來的廣播封包,進而取得該裝置的Name、OOB、Net ID及RSSI

最後再透過設定Convert View將資訊顯示在上方。




裝置配置入網流程依據Qualcomm Android SDK內的定義方式做說明,可以從“NewNodeActivity.java”檔案內找到以下功能,並以“mProcedureStep”去進行判斷配置流程的步驟:

A


下圖為“NewNodeActivity.java”檔案中需要import的功能:


在一開始將裝置配置入網前,需要在“onResume()”的功能內將“mProcedureStep”初始化。

裝置配置入網流程

  1. Connect to the Unprovisioned Device

選擇裝置後,會進入入網配置的介面(如圖A)。

在“public void onCreate(Bundle savedInstanceState)”內透過判斷“mProcedureStep”得知目前進行“CONNECTION_STEP”的步驟,並且停止掃描,開始與裝置進行連線。

  1. Sending Invite

當Provisioner(手機)收到BT Mesh裝置所發送的Broadcast後,邀請裝置入網。

當連線成功後,會發送Provisioning request給裝置,並且透過“MeshDatabaseManager.getInstance().allocatePrimaryElementAddress(netId)”取得裝置的Unicast Address

 

  1. Set Capability

交換必要的設備訊息,像是Device所擁有的Element(元素)數量、使用公鑰或私鑰與OOB(Out of Band)認證相關資訊。

 

3.1 Exchange Public Keys

當交換完必要的訊息時,這時候會依照上一個步驟所取得的資訊針對OOB公鑰進行交換。確認裝置是否支援OOB公鑰交換(這裡使用No OOB),使用公鑰與自身的私鑰經由(ECHD)橢圓曲線產生出對稱金鑰。

 

3.2 Confirmation

進行確認值生成和檢查(Confirmation Provisioner和Confirmation Device)。當確認值生成後,兩台設備會進行交換,並且檢查接受值的完整性。

 

在“public void onProvisionedStepUpdate(int event, final Bundle data)”的功能內會判斷裝置的資訊、OOB、公鑰及私鑰,而專案內是使用“No OOB”驗證,所以在程式碼內對應到“public void onProvisionOobEventUpdate(SelectedDeviceCapability capability)”函式內“AUTH_METHOD_OOB_NONE”的功能內進行交換資訊、OOB Data、公鑰及私鑰的驗證及設定。



  1. Complete:

經過Confirmation步驟的認證後,確保Provisioner與BT Mesh Device之間建立的承載層(Bearer)的安全後,就會啟動配置數據分發(Provisioning data)。Provisioner負責生成啟動配置數據分發,Provisioning data包含Net Key、Dev Key、Net Index、Key Flag、IV Index、Unicast Address。

 

在“public void onProvisionComplete(final int status, final byte[] devKey, final int elementNumber)”的功能內,先判斷是否通過安全認證,通過安全認證後即會執行“MeshDatabaseManager.getInstance().addNewNode(netId, Element Primary Address, devKey, elementNumber)”,再透過“meshDB.add(address, uuid, node)”將Node資料存進Mesh Database中。

 

  1. Connect to node

完成驗證後,Provisioner(手機)會將GATT Service斷開連線,搜尋Proxy Node進行連線。

 

Node資料存進Mesh Database後,使用public void onProvisionComplete(final int status, final byte[] devKey, final int elementNumber)”的功能內MeshLibraryManager.getInstance().clearBridgeAdvDataList”及“MeshLibraryManager.getInstance().disconnectMeshBearer”功能斷開斷線,成為節點。接著重新連線至Proxy,進行Bind Key

 

  1. Get Composition Data

取得節點的資料,包含“Node內擁有幾個Elements”、“Elements內有幾個Models”及“Models內有幾個States”。然而取得Model內State的值必須從其“opcode”進行判斷與設定。

 6.1 Add Application Key

當取得節點內部資料後,進行“Add APP Key”的步驟,這步驟會判斷是否存在APP Key在Mesh的Database內。

 6.2 Application Key Binding

取得APP Key後,會進行Bind Key的步驟。針對Node內Elements的Unicast Address以及Model ID進行Key Binding(networkID、subNetID、primaryAddress、elementAddress、appKeyIdx、modelID)。

函式“onConfigClientResponse(Bundle bundle)”功能內判斷Composition Data是否獲取成功,並且透過“MeshDatabaseManager.getInstance().getAPPKeyListSize()”了解Mesh Database中是否具有APP Key

若具有APP Key,則會進入“MeshConstants.QMESH_CONFIG_APP_KEY_STATUS_EVENT”,執行“private void addAppKeyIndex(int index)”及“private void bindAppKeyIndex()”的功能,將APP Key加入後即可進行Bind Key的步驟,“private void bindAppKeyIndex()”的功能內需驗證“AppKeyBindingQue”是否為空,若有資料則會將networkIDsubNetIDprimaryAddresselementAddressappKeyIdxmodelID放入Node內。

以上即為Bind Key的步驟。

 

Model ID分為以下幾種:

  1. QMESH_MODEL_GENERIC_ON_OFF十進制: 4096
  2. QMESH_MODEL_LIGHT_LIGHTNESS十進制: 4864
  3. QMESH_MODEL_LIGHT_HSL_SERVER十進制: 4871
  4. QMESH_MODEL_LIGHT_LIGHTNESS_CLIENT十進制: 4866
  5. QMESH_MODEL_GENERIC_ON_OFF_CLIENT十進制: 4097

 

在“AppKeyBindingConfiguration.java”專案內可以自行添加不同裝置,能讓開發者自訂相對應的Model ID
 

  1. Set Node Name

執行完Application Key Binding的步驟後,最後進行名稱修改,並更新資料庫配備名稱。

如上圖所示,當BT Mesh裝置成功配置入網後,Provisioner(手機)會自動搜尋並連接BT Mesh網路中的Proxy node,而列表上可以看到裝置的名稱、Unicast Address、Address、Elements、Models及Company資訊。

F. 小結

經過本文的講解,相信大家對於BT Mesh的架構以及Android內的配置流程已經有初步的了解,下一篇會教導大家在專案內的配置流程是運用Qualcomm Mesh Library中的哪些功能,以及Group、Publish和Subscribe的基本程式碼介紹,請大家敬請等候!


資料參考:

  1. Bluetooth Mesh Models: https://www.bluetooth.com/wp-content/uploads/2019/04/1903_Mesh-Models-Overview_FINAL.pdf

 

  1. Learn About Bluetooth: https://www.bluetooth.com/learn-about-bluetooth/bluetooth-technology/topology-options/le-mesh/mesh-glossary/#security_keys

 

  1. BLE結合網狀網路藍牙解開物聯網連結難題:https://www.2cm.com.tw/2cm/zh-tw/tech/C5622D1B222E48F586F35C382AD8D917

 

  1. Qualcomm Android SDK: qualcomm_mesh_demo_application.android.1.0.0_20200106(若有需求,請自行與「詮鼎科技Qualcomm Team」聯繫)

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论