借助藍牙 5 的網(wǎng)狀網(wǎng)絡功能,開發(fā)人員可以增強無線連接系統(tǒng)(如物聯(lián)網(wǎng)設備)的通信范圍和網(wǎng)絡可用性。但是,網(wǎng)狀網(wǎng)絡的低功耗無線硬件設計與網(wǎng)狀網(wǎng)絡軟件開發(fā)之間存在著復雜的層次,這可能會使開發(fā)人員迅速陷入混亂并危及項目進度。
隨著支持藍牙 5 的智能手機和其他移動平臺的出現(xiàn),時間成為一個關鍵因素,因為幾乎所有行業(yè)領域和應用對藍牙網(wǎng)狀網(wǎng)絡能力都有需求,而且預計需求會爆炸式增長,開發(fā)人員需要快速響應。作為回應,硅片和軟件供應商正在推出簡化和加速開發(fā)流程的解決方案。
本文將概述藍牙網(wǎng)狀網(wǎng)絡的基本原理,然后使用 Silicon Labs 支持網(wǎng)狀網(wǎng)絡的藍牙 5 模塊系列中的特定設備逐步介紹開發(fā)流程。利用這種集成式藍牙 5 解決方案,開發(fā)人員可以快速部署聯(lián)網(wǎng)設備和應用,從而充分利用藍牙網(wǎng)狀網(wǎng)絡。
本文最后介紹 Silicon Labs 藍牙網(wǎng)狀網(wǎng)絡軟件開發(fā)包,其中詳細說明了使用樣例網(wǎng)狀網(wǎng)絡應用代碼演示的事件驅動模型。
藍牙網(wǎng)狀網(wǎng)絡需求
藍牙網(wǎng)狀網(wǎng)絡超越了傳統(tǒng)藍牙技術的點對點連接能力。通過相鄰聯(lián)網(wǎng)設備中繼消息,藍牙網(wǎng)狀網(wǎng)絡將低功耗設備的有效覆蓋范圍擴展到其發(fā)射器功率輸出和接收器靈敏度所能支持的實際范圍以外。最重要的是,智能手機和其他移動設備的普及使得大家對藍牙應用非常熟悉,藍牙網(wǎng)狀網(wǎng)絡藉由這一事實,為更復雜的網(wǎng)狀網(wǎng)絡連接應用提供自然的演進。
在網(wǎng)狀網(wǎng)絡支持下,使用藍牙的開發(fā)人員現(xiàn)在能夠輕松連接家庭自動化、樓宇管理和任意數(shù)量物聯(lián)網(wǎng)應用涉及的大量設備。
藍牙網(wǎng)狀網(wǎng)絡工作原理
藍牙網(wǎng)狀網(wǎng)絡使用概念上很簡單的網(wǎng)絡節(jié)點交互模型(圖 1)。專用節(jié)點類型可提供節(jié)點之間中繼消息所需的附加功能,從而擴展通過代理節(jié)點與支持藍牙的移動設備進行交互的網(wǎng)絡的有效范圍。

圖 1:除基本邊緣節(jié)點外,藍牙網(wǎng)狀網(wǎng)絡還能使用特殊節(jié)點類型為其他節(jié)點傳遞消息(中繼),充當?shù)凸墓?jié)點的緩存(好友),或者將網(wǎng)絡(代理)連接到支持藍牙的移動設備。(圖片來源:Silicon Labs)
其他專用節(jié)點類型則可應對降低功耗的要求,使用好友節(jié)點緩存消息,以供低功耗節(jié)點在長時間休眠狀態(tài)之間定期輪詢。盡管具有這種附加功能,藍牙網(wǎng)狀網(wǎng)絡設備仍然可以利用通用屬性配置文件 (GATT) 服務來與使用早期藍牙版本的舊設備進行連接。因此,網(wǎng)狀網(wǎng)絡設備可以充分利用現(xiàn)有低功耗藍牙 (BLE) 能力(例如信標),以生成區(qū)域特定消息并發(fā)送給智能手機,或者將自身標識為資產(chǎn)管理應用。
藍牙網(wǎng)狀網(wǎng)絡還能解決日益增長的對樓宇自動化或其他物聯(lián)網(wǎng)應用所需受保護網(wǎng)絡的安全性的關注。與提供可選安全性以保護單個設備的 BLE 不同,藍牙網(wǎng)狀網(wǎng)絡實施的安全性試圖保護整個網(wǎng)狀網(wǎng)絡。
藍牙網(wǎng)狀網(wǎng)絡實現(xiàn)安全的方法特別有意義。其安全方案將“關注點分離”概念引入到網(wǎng)狀網(wǎng)絡中,為每個設備、網(wǎng)絡和整體應用使用單獨的安全措施。與每個設備相關聯(lián)的私有設備密鑰 (DevKey) 為僅涉及該節(jié)點的配置和調配等操作提供安全性。每個設備都需要網(wǎng)絡密鑰 (NetKey),才能與網(wǎng)絡或子網(wǎng)中的其他節(jié)點進行通信。最后,應用級交互(例如發(fā)送消息以開燈)則需要應用密鑰 (AppKey)。其他安全措施可用于防范中間人或重放攻擊等常見威脅。所有措施相互配合,藍牙網(wǎng)狀網(wǎng)絡中的安全機制為更復雜的物聯(lián)網(wǎng)應用所需的信任提供了關鍵基礎。
然而,實現(xiàn)藍牙網(wǎng)狀網(wǎng)絡連接應用給開發(fā)人員帶來了很大困難。大多數(shù)使用網(wǎng)狀網(wǎng)絡的應用是建立在功耗受限的設備之上,依靠網(wǎng)狀網(wǎng)絡來擴展低功耗無線電子系統(tǒng)的有效覆蓋范圍。創(chuàng)建支持網(wǎng)狀網(wǎng)絡的合適低功耗硬件設備所涉及的挑戰(zhàn),甚至能讓最有經(jīng)驗的硬件開發(fā)人員停滯不前。即使在完成其定制藍牙設計之后,為滿足國家認證要求,開發(fā)人員也可能面臨巨大的成本壓力和曠日持久的延遲。軟件開發(fā)人員在尋找兼容的藍牙網(wǎng)狀網(wǎng)絡堆棧并利用其來構建軟件層以便能支持自己的應用時,也會發(fā)生延遲。然而,借助 Silicon Laboratories 的藍牙硬件和軟件,開發(fā)人員可以在低功耗設備中快速部署藍牙網(wǎng)狀網(wǎng)絡功能,以滿足自己的應用需求。
藍牙模塊
Silicon Labs 的藍牙網(wǎng)狀網(wǎng)絡解決方案基于其低功耗藍牙 BGM13P 硬件模塊,該模塊結合了無線處理器和全套藍牙堆棧,以 12.9×15.0×2.2 mm 的封裝提供經(jīng)過認證的完整藍牙系統(tǒng)。該模塊的核心是 EFR32BG13 Blue Gecko 無線片上系統(tǒng) (SoC),可提供核心功能。EFR32BG13 SoC 集成了 32 位 Arm? Cortex?-M4 內(nèi)核、2.4 GHz 無線電子系統(tǒng)、512 KB 閃存、64 KB RAM 以及豐富的模擬和數(shù)字外設。除了片上硬件加密加速器之外,該 SoC 還通過安全管理單元支持不斷增長的更高安全性需求;該安全管理單元為外設提供的細粒度訪問控制與存儲器保護單元為存儲器提供的相同。
EFR32BG13 SoC 可作為定制藍牙硬件設計的基礎。使用 SoC 時,開發(fā)人員不僅要負責滿足 SoC 支持電路等設計要求,還要對完成的設計進行必要的認證。該模塊提供有全面認證的設計,其中的 EFR32BG13 帶有所需的支持電路,包括數(shù)個振蕩器源、兩個晶體和端口驅動器。與此同時,該模塊還提供了一系列省電特性,因此開發(fā)人員能夠響應持續(xù)存在的低功耗設備需求。
該模塊在活動模式下僅消耗 87 μA/MHz,在全 RAM 保持的深度休眠模式下僅消耗 1.4 μA。為了幫助最大限度地延長停留在低功耗深度休眠模式下的時間,工程師可以利用低能耗傳感器接口和低能耗定時器等特性。使用低能耗傳感器接口,工程師可以對模塊的集成有限狀態(tài)機和模擬外設進行編程,以在處理器保持深度休眠模式的同時采集和處理傳感器信號。類似地,通過低能耗定時器,工程師可以輸出簡單波形并監(jiān)控實時時鐘/計數(shù)器,以便在指定時間內(nèi)執(zhí)行操作,而無需處理器參與。
當然,無線設備的功耗一般取決于無線電子系統(tǒng)的效率。本例中,該模塊的 2.4 GHz 無線電子系統(tǒng)在接收模式下僅消耗 9.9 mA,在 0 dBm 輸出功率的發(fā)射模式下僅消耗 8.5 mA。即便如此,該模塊還提供了通過射頻控制節(jié)省功耗的額外特性。開發(fā)人員可以對模塊中的射頻檢測功能進行編程,以在檢測到寬帶射頻能量時喚醒處理器。通過這種方法,開發(fā)人員可以在無活動期間使模塊保持深度休眠而不會喪失通信。但是,如前所述,開發(fā)人員也可以將某個設備配置為藍牙 5 低功耗節(jié)點,其能夠簡單地定期從深度休眠中喚醒以輪詢好友節(jié)點,獲取緩存的消息。
系統(tǒng)開發(fā)
針對其所有特性,該模塊在實現(xiàn)方面幾乎沒有任何困難。開發(fā)人員可以簡單地將該模塊放入一個帶有處理器的設計中,將其用作藍牙網(wǎng)絡協(xié)處理器(圖 2A)?;蛘?,開發(fā)人員可以將該模塊用作完整的系統(tǒng)解決方案(圖 2B)。在這種獨立模式下,開發(fā)人員可以在模塊的 EFR32BG13 處理器上運行應用代碼,并使用 EFR32BG13 集成的模擬和數(shù)字外設在簡單的物聯(lián)網(wǎng)設計中進行信號采集。

圖 2:設計人員可以將 BGM13P 模塊用作主機 CPU 的藍牙協(xié)處理器 (A),或者單獨使用 (B),利用模塊集成的 EFR32BG13 SoC 執(zhí)行應用程序甚至采集傳感器數(shù)據(jù)。(圖片來源:Silicon Labs)
開發(fā)人員可以使用該模塊的一個集成天線的版本 BGM13P22F512GA-V2,以進一步簡化藍牙設計。針對要應對更具挑戰(zhàn)性射頻環(huán)境的設計,開發(fā)人員可以采用 BGM13P22F512GE-V2,這是一個帶有 U.FL 連接器的版本,可以連接藍牙兼容的平貼片天線,例如 Taoglas 的 FXP74.07.0100A。
Silicon Labs 甚至通過 SLWSTK6101C 開發(fā)套件消除了該級別的硬件實現(xiàn)。SLWSTK6101C 設計用于配合其不同藍牙設備的插件板使用,提供代表性的物聯(lián)網(wǎng)設計,包含 Macronix 的 MX25R8035F 8 Mb 閃存、Sharp Microelectronics 的 LS013B7DH03 128 x 128 LCD 和 Silicon Labs 的 Si7021 溫度與濕度傳感器。在這種情況下,開發(fā)人員將包含 BGM13P 模塊的 SLWRB4306A 無線電電路板插入 SLWSTK6101C 板。
除了作為可立即投產(chǎn)的設計之外,全套電路板還提供經(jīng)過驗證的參考設計,工程師可以使用它來檢查與閃存、LCD 和傳感器等設備接口的不同方法。
例如,8 Mb 閃存和 LCD 通過其 SPI 總線連接到模塊,而 Si7021 傳感器的 I2C 接口與開發(fā)板上的外部針座共享總線。Silicon Labs 演示了一種設計簡單接口的方法,它使傳感器在正常情況下保持禁用并與共享總線電氣隔離。當模塊的 PD15 輸入變?yōu)楦唠娖綍r,SENSOR_ENABLE 輸出變?yōu)楦唠娖剑瑢鞲衅鬟B接到 3.3 V VMCU 電源軌和 I2C 總線(圖 3)。

圖 3:除了提供硬件評估平臺之外,Silicon Labs SLWSTK6101C 開發(fā)套件還可充當參考設計,展示與此處所示的 Silicon Labs Si7021 傳感器等外部設備接口的方法。(圖片來源:Silicon Labs)
共享 I2C 總線針座只是設計用來支持該平臺開發(fā)的幾個特性之一(圖 4)。除了板載 J-Link 調試器之外,該板還提供了數(shù)據(jù)包追蹤接口 (PTI),允許工程師詳細分析數(shù)據(jù)包。PTI 建立在 EFR32BG13 SoC 內(nèi)置的數(shù)據(jù)包和狀態(tài)追蹤單元之上,提供對系統(tǒng)發(fā)送和接收的所有數(shù)據(jù)包的非侵入式捕捉。為了分析藍牙網(wǎng)狀網(wǎng)絡等復雜協(xié)議,該數(shù)據(jù)包追蹤功能提供了一個對于優(yōu)化和調整低級網(wǎng)絡通信至關重要的工具。

圖 4:Silicon Labs SLWSTK6101C 套件有多個接口用于數(shù)據(jù)包追蹤、能量監(jiān)測和低級 Arm 嵌入式追蹤宏單元 (ETM) 追蹤,為工程師深入分析設計操作和性能提供了豐富的工具集。(圖片來源:Silicon Labs)
雖然網(wǎng)絡專家需要 PTI 這樣的功能來優(yōu)化網(wǎng)絡,但系統(tǒng)開發(fā)人員需要能幫助其發(fā)現(xiàn)可能導致功耗過大的應用低效問題的工具。對于此類應用級功耗優(yōu)化,Silicon Labs Simplicity Studio 能量分析器可提供代碼級功耗分析。
同數(shù)據(jù)包追蹤工具一樣,能量分析器也是對底層硬件加以利用。在這種情況下,電路板包括一個專用能量監(jiān)測電路,其由電流傳感器電阻、電流檢測放大器和增益級組成,將輸出傳送到電路板的控制器,供開發(fā)主機系統(tǒng)訪問(圖 5)。并聯(lián)增益級允許能量監(jiān)測器以兩個不同的分辨率級別測量 0.1 μA 至 95 mA 的電流:250 μA 以上使用 0.1 mA 分辨率;低于 250 μA 閾值使用 1 μA 分辨率。

圖 5:內(nèi)置于 BGM13P 藍牙模塊的專用能量監(jiān)測電路和處理控制器可提供 0.1 μA 至 95 mA 的非侵入式電流測量。(圖片來源:Silicon Labs)
當能量監(jiān)測電路產(chǎn)生電流測量結果時,EFR32BG13 內(nèi)置的低級追蹤機制可以定期對處理器的程序計數(shù)器進行采樣,并將結果通過設備的串行線輸出引腳輸出。通過將能量監(jiān)測器的結果與此程序追蹤輸出相結合,能量分析器可以實時顯示與設備上運行的代碼相關的能耗(圖 6)

圖 6:Simplicity Studio 能量分析器將能量監(jiān)測器輸出與程序追蹤數(shù)據(jù)相結合,以實時顯示與實際代碼相關的電流消耗。(圖片來源:Silicon Labs)
網(wǎng)狀網(wǎng)絡應用開發(fā)
硬件工程師可以使用開發(fā)套件來優(yōu)化其硬件設計,而軟件開發(fā)人員可以利用 Silicon Labs 的綜合軟件開發(fā)環(huán)境來快速創(chuàng)建網(wǎng)狀網(wǎng)絡應用。Silicon Labs 的藍牙 5 網(wǎng)狀網(wǎng)絡堆棧隨同 Simplicity Studio 提供,其用特定網(wǎng)狀網(wǎng)絡資源擴展了基本藍牙堆棧。因此,開發(fā)人員可以輕松地從較傳統(tǒng)的藍牙協(xié)議(如信標或點對點通信)轉移到全網(wǎng)狀網(wǎng)絡拓撲(圖 7)。

圖 7:Silicon Labs 藍牙網(wǎng)狀網(wǎng)絡堆棧用網(wǎng)狀網(wǎng)絡層(綠色)擴展了早期藍牙功能(藍色),使得開發(fā)人員能夠充分利用從信標到全網(wǎng)狀網(wǎng)絡配置的全部藍牙特性。(圖片來源:Silicon Labs)
Simplicity Studio 與基于 Silicon Labs BGM13P 的 SLWRB4306A 和 SLWSTK6101C 開發(fā)板一起使用,讓開發(fā)人員能利用適當?shù)能浖_發(fā)套件 (SDK) 配置其環(huán)境。對于藍牙開發(fā),Studio 提供了 Silicon Labs 的藍牙網(wǎng)狀網(wǎng)絡 SDK 以及預先構建的演示二進制文件和源代碼。在此環(huán)境中,開發(fā)人員可以使用實現(xiàn)了完整藍牙網(wǎng)狀網(wǎng)絡應用的樣例代碼。
這些樣例應用程序與開發(fā)板和移動應用配合使用,旨在演示藍牙網(wǎng)狀網(wǎng)絡的操作,讓開發(fā)人員能全面了解典型網(wǎng)狀網(wǎng)絡的操作,包括調配、配置和應用相關的使用。為了部署樣例應用程序,工程師針對一組開發(fā)板運行 Simplicity Studio,這些開發(fā)板分別配置為聯(lián)網(wǎng)照明應用中的燈或開關。通過使用樣例代碼和硬件,工程師可以更好地了解典型網(wǎng)狀網(wǎng)絡應用從設備上電開始的各個操作階段。
借助 Silicon Labs 的軟件架構,藍牙操作可以一系列事件展開,使用預定義的事件 ID 來表示事件的性質。在樣例軟件包中,main() 例程在上電或復位時運行,先調用一系列初始化例程,然后進入主循環(huán),本例中主循環(huán)只包含兩行代碼(列表 1)。
int main()
{
#ifdef FEATURE_SPI_FLASH
/* Put the SPI flash into Deep Power Down mode for those radio boards where it is available */
MX25_init();
MX25_DP();
/* We must disable SPI communication */
USART_Reset(USART1);
#endif /* FEATURE_SPI_FLASH */
enter_DefaultMode_from_RESET();
#if (EMBER_AF_BOARD_TYPE == BRD4304A)
LNA_init();
#endif
gecko_init(&config);
#ifdef FEATURE_PTI_SUPPORT
APP_ConfigEnablePti();
#endif // FEATURE_PTI_SUPPORT
RETARGET_SerialInit();
/* initialize LEDs and buttons.Note: some radio boards share the same GPIO for button & LED.* Initialization is done in this order so that default configuration will be button for those
* radio boards with shared pins.led_init() is called later as needed to (re)initialize the LEDs
* */
led_init();
button_init();
LCD_init();
while (1) {
struct gecko_cmd_packet *evt = gecko_wait_event();
handle_gecko_event(BGLIB_MSG_ID(evt-》header), evt);
}
}
列表 1:Simplicity Studio 提供了一個綜合開發(fā)環(huán)境,其中包括樣例代碼,例如此網(wǎng)狀網(wǎng)絡照明主例程,其演示了初始化和事件處理循環(huán)。(代碼來源:Silicon Labs)
在主循環(huán)的第一行中,函數(shù) gecko_wait_event() 在阻塞流程的同時等待事件出現(xiàn),事件隊列由較低級別填充。雖然開發(fā)人員往往會避免使用阻塞功能,但此方法在這種情況下特別有效,因為藍牙堆棧在此阻斷模式下會自動管理低功耗休眠狀態(tài)。對于不能容許阻塞等待的特定應用要求,SDK 還提供了一個非阻塞函數(shù),如果隊列為空,則返回下一個事件或 NULL。但使用此函數(shù)時,開發(fā)人員需要自行處理低功耗休眠管理。
在主循環(huán)的第二行中,處理函數(shù) handle_gecko_event() 根據(jù)其事件 ID 處理最新事件 (evt)(列表 2)。當設備上電時,堆棧發(fā)出系統(tǒng)引導事件 (gecko_evt_system_boot_id)。事件處理程序進而調用一系列初始化函數(shù),包括 gecko_cmd_mesh_node_init(),其會初始化藍牙網(wǎng)狀網(wǎng)絡堆棧。然后,處理程序調用其他函數(shù)來提供與該事件類型(由其相關事件 ID 表示)相關聯(lián)的功能。
/**
* Handling of stack events.Both Bluetooth LE and Bluetooth mesh events are handled here.*/
static void handle_gecko_event(uint32_t evt_id, struct gecko_cmd_packet *evt)
{
struct gecko_bgapi_mesh_node_cmd_packet *node_evt;
struct gecko_bgapi_mesh_generic_server_cmd_packet *server_evt;
struct gecko_msg_mesh_node_provisioning_failed_evt_t *prov_fail_evt;
if (NULL == evt) {
return;
}
switch (evt_id) {
case gecko_evt_system_boot_id:
// check pushbutton state at startup.If either PB0 or PB1 is held down then do factory reset
if (GPIO_PinInGet(BSP_GPIO_PB0_PORT, BSP_GPIO_PB0_PIN) == 0 || GPIO_PinInGet(BSP_GPIO_PB1_PORT, BSP_GPIO_PB1_PIN) == 0) {
initiate_factory_reset();
} else {
struct gecko_msg_system_get_bt_address_rsp_t *pAddr = gecko_cmd_system_get_bt_address();
set_device_name(&pAddr-》address);
// Initialize Mesh stack in Node operation mode, wait for initialized event
gecko_cmd_mesh_node_init();
// re-initialize LEDs (needed for those radio board that share same GPIO for button/LED)
led_init();
}
break;
。。.case gecko_evt_mesh_node_initialized_id:
printf(node initialized\r\n);
struct gecko_msg_mesh_node_initialized_evt_t *pData = (struct gecko_msg_mesh_node_initialized_evt_t *)&(evt-》data);
if (pData-》provisioned) {
。。.} else {
printf(node is unprovisioned\r\n);
LCD_write(unprovisioned, LCD_ROW_STATUS);
printf(starting unprovisioned beaconing.。。\r\n);
gecko_cmd_mesh_node_start_unprov_beaconing(0x3); // enable ADV and GATT provisioning bearer
}
break;
case gecko_evt_mesh_node_provisioning_started_id:
printf(Started provisioning\r\n);
LCD_write(provisioning.。。, LCD_ROW_STATUS);
// start timer for blinking LEDs to indicate which node is being provisioned
gecko_cmd_hardware_set_soft_timer(32768 / 4, TIMER_ID_PROVISIONING, 0);
break;
case gecko_evt_mesh_node_provisioned_id:
_my_index = 0; // index of primary element hardcoded to zero in this example
lightbulb_state_init();
printf(node provisioned, got index=%x\r\n, _my_index);
// stop LED blinking when provisioning complete
gecko_cmd_hardware_set_soft_timer(0, TIMER_ID_PROVISIONING, 0);
LED_set_state(LED_STATE_OFF);
LCD_write(provisioned, LCD_ROW_STATUS);
break;
case gecko_evt_mesh_node_provisioning_failed_id:
prov_fail_evt = (struct gecko_msg_mesh_node_provisioning_failed_evt_t *)&(evt-》data);
printf(provisioning failed, code %x\r\n, prov_fail_evt-》result);
LCD_write(prov failed, LCD_ROW_STATUS);
/* start a one-shot timer that will trigger soft reset after small delay */
gecko_cmd_hardware_set_soft_timer(2 * 32768, TIMER_ID_RESTART, 1);
break;
。。.}
}
列表 2:開發(fā)人員可以檢查 Silicon Labs 網(wǎng)狀網(wǎng)絡樣例代碼中的關鍵設計模式,例如調配事件處理,相關代碼片段位于網(wǎng)狀網(wǎng)絡燈主程序中調用的 handle_gecko_event() 事件處理程序(參見列表 1)。(代碼來源:Silicon Labs)
藍牙網(wǎng)狀網(wǎng)絡中的關鍵事件系列之一與調配過程有關。設備上電并完成其初始化序列之后,便進入信標模式,向網(wǎng)絡宣告其自身以供調配。當調配完畢(或失?。r,樣例代碼會使用開發(fā)套件 LCD 和 LED 來指示狀態(tài)。通過檢查事件處理程序針對每個調配狀態(tài)的代碼塊,開發(fā)人員可以快速了解該調配序列和選項。
同樣,軟件工程師可以使用樣例處理程序代碼作為創(chuàng)建其應用級功能的指南。例如,藍牙網(wǎng)狀網(wǎng)絡中的一個關鍵概念是使用發(fā)布-訂閱模型將共享某些功能關系的節(jié)點關聯(lián)起來(圖 8)。

圖 8:應用開發(fā)人員使用藍牙的發(fā)布-訂閱模型將設備組合成功能分組,例如由一個或多個開關控制的一組燈。(圖片來源:Silicon Labs)
通過這種方法,數(shù)個智能燈泡可以訂閱一個開關發(fā)布者。當最終用戶激活該開關時,其將發(fā)布 ON/OFF 事件。該事件將通過網(wǎng)狀網(wǎng)絡級聯(lián)到訂閱的智能燈泡,其事件處理程序將采取適當?shù)牟僮?。Silicon Labs 樣例代碼演示了這一過程:首先是網(wǎng)狀網(wǎng)絡中的聯(lián)網(wǎng)開關發(fā)布 ON/OFF 請求(列表 3),然后是聯(lián)網(wǎng)燈的相應響應(列表 4)。
/**
* This function publishes one on/off request to change the state of light(s) in the group.* Global variable switch_pos holds the latest desired light state, possible values are
* switch_pos = 1 -》 PB1 was pressed, turn lights on
* switch_pos = 0 -》 PB0 was pressed, turn lights off
*
* This application sends multiple requests for each button press to improve reliability.* Parameter retrans indicates whether this is the first request or a re-transmission.* The transaction ID is not incremented in case of a re-transmission.*/
void send_onoff_request(int retrans)
{
uint16 resp;
uint16 delay;
struct mesh_generic_request req;
req.kind = mesh_generic_request_on_off;
req.on_off = switch_pos ?MESH_GENERIC_ON_OFF_STATE_ON : MESH_GENERIC_ON_OFF_STATE_OFF;
// increment transaction ID for each request, unless it‘s a retransmission
if (retrans == 0) {
trid++;
}
/* delay for the request is calculated so that the last request will have a zero delay and each
* of the previous request have delay that increases in 50 ms steps.For example, when using three
* on/off requests per button press the delays are set as 100, 50, 0 ms
*/
delay = (request_count - 1) * 50;
resp = gecko_cmd_mesh_generic_client_publish(
MESH_GENERIC_ON_OFF_CLIENT_MODEL_ID,
_my_index,
trid,
0, // transition
delay,
0, // flags
mesh_generic_request_on_off, // type
1, // param len
&req.on_off /// parameters data
?。?》result;
if (resp) {
printf(gecko_cmd_mesh_generic_client_publish failed,code %x\r\n, resp);
} else {
printf(request sent, trid = %u, delay = %d\r\n, trid, delay);
}
}
列表 3:這個來自 Silicon Labs 網(wǎng)狀網(wǎng)絡開關樣例應用程序的代碼片段說明了如何使用藍牙 5 發(fā)布過程 (gecko_cmd_mesh_generic_client_publish) 來請求訂閱該事件流的燈的狀態(tài)改變(開或關)。(代碼來源:Silicon Labs)
static void onoff_request(uint16_t model_id,
uint16_t element_index,
uint16_t client_addr,
uint16_t server_addr,
uint16_t appkey_index,
const struct mesh_generic_request *request,
uint32_t transition_ms,
uint16_t delay_ms,
uint8_t request_flags)
{
printf(ON/OFF request: requested state=《%s》, transition=%u, delay=%u\r\n,
request-》on_off ?ON : OFF, transition_ms, delay_ms);
if (lightbulb_state.onoff_current == request-》on_off) {
printf(Request for current state received; no op\n);
} else {
printf(Turning lightbulb 《%s》\r\n, request-》on_off ?ON : OFF);
if (transition_ms == 0 && delay_ms == 0) { // Immediate change
lightbulb_state.onoff_current = request-》on_off;
lightbulb_state.onoff_target = request-》on_off;
if (lightbulb_state.onoff_current == MESH_GENERIC_ON_OFF_STATE_OFF) {
LED_set_state(LED_STATE_OFF);
} else {
LED_set_state(LED_STATE_ON);
}
} else {
// Current state remains as is for now
lightbulb_state.onoff_target = request-》on_off;
LED_set_state(LED_STATE_TRANS); // set LEDs to transition mode
gecko_cmd_hardware_set_soft_timer(TIMER_MS_2_TIMERTICK(delay_ms + transition_ms), TIMER_ID_TRANSITION, 1);
}
lightbulb_state_store();
}
if (request_flags & MESH_REQUEST_FLAG_RESPONSE_REQUIRED) {
onoff_response(element_index, client_addr, appkey_index);
} else {
onoff_update(element_index);
}
}
列表 4:Silicon Labs 網(wǎng)狀網(wǎng)絡燈樣例包括用于特定應用級事件的例程,例如這個打開或關閉 LED 以響應開關所發(fā)布請求的函數(shù)(參見列表 3)。(代碼來源:Silicon Labs)
除了用于節(jié)點開發(fā)的藍牙堆棧和 SDK 之外,Silicon Labs 還提供了藍牙網(wǎng)狀網(wǎng)絡的最終環(huán)節(jié)——連接移動設備。大多數(shù)移動設備支持藍牙 4,雖然其無線電可以支持藍牙 5 要求,但它們沒有支持藍牙 5 網(wǎng)狀網(wǎng)絡層的堆棧。Silicon Labs 為移動應用開發(fā)人員提供了額外的軟件堆棧來,而該堆棧可提供網(wǎng)狀網(wǎng)絡功能,因此便能克服這一局限性(圖 9)。

圖 9:開發(fā)人員可以將 Silicon Labs 針對移動設備的網(wǎng)狀網(wǎng)絡堆棧添加到其移動應用中,使得藍牙 4 移動設備可以在藍牙 5 網(wǎng)狀網(wǎng)絡中使用。(圖片來源:Silicon Labs)
總結
藍牙 5 網(wǎng)狀網(wǎng)絡為各種各樣已經(jīng)利用智能手機和其他移動設備進行點對點通信的應用提供了一個自然的過渡。然而,藍牙 5 網(wǎng)狀網(wǎng)絡的部署對硬件和軟件設計提出了重大挑戰(zhàn),特別是在物聯(lián)網(wǎng)等功耗受限的應用中。此外,硬件工程師需要滿足最小基底面和低功耗的要求,軟件工程師則需要構建使用最少資源來執(zhí)行復雜通信協(xié)議的軟件。BGM13P 模塊、SLWSTK6101C 開發(fā)板以及節(jié)點和移動設備的藍牙堆棧的結合,使工程師有一個綜合性平臺來快速開發(fā)使用藍牙網(wǎng)狀網(wǎng)絡的應用
評論