透過連線/廣播方式實作 BLE網狀網路建構非夢事

2015-12-14
Bluetooth發展到4.0版本後,由原本追求頻寬速度,改成追求低耗電量,這是一個很大的變革,Bluetooth 4.0通訊協定也做了一個大翻修,而為人熟知的Bluetooth 4.0亦稱為Bluetooth Smart抑或是Bluetooth Low Energy,簡稱BLE。
BLE雖然在省電方面比前幾代版本都來得傑出,但它犧牲掉的則是資料傳輸的速度,因此BLE並不合適用來傳輸連續性的大型資料,例如影音及圖像等;相對的,該技術比較適合用來傳輸小量且不連續的資料,坊間的運動手環就是最好的例子,而它們所使用的無線傳輸技術就是BLE。

藍牙網路結構分析

一直以來,Bluetooth都是使用星狀網路(Star Network),如圖1左邊所示,星狀網路正中間是Central,一個Central可連線多個周邊(Peripherals)並與之通訊,但Peripherals彼此之間無法互相連線通訊,Central之間也無法互相通訊,因此這樣的星狀網路其網路規模通常很小,且缺乏擴充性。這樣的網路架構,適合用於簡單的一對一或是一對多裝置的無線通訊控制,例如手機一次可以連接多樣藍牙裝置,但卻不適合用於大量裝置之間互相通訊的環境,例如智慧家庭網路並非是星狀網路就可以架構出來的。

圖1右表示的是網狀網路(Mesh Network),其有多種變形,但簡單來說,就是裝置間可以互相連接並延伸下去,而沒有星狀網路的限制,因此網狀網路所組成的網路架構可大可小,且非常具有彈性,但相較於星狀網路,通訊協定就相對複雜,使用及設定也比較困難。

圖1 左為星狀網路架構,右為網狀網路架構

低耗電量技術BLE的目標,是希望成為物聯網(Internet of Things)的標準通訊協定,而智慧家庭是物聯網中一個很大的項目,目前智慧家庭最常被使用的無線通訊協定是ZigBee,它跟BLE一樣工作在2.4GHz,但使用和BLE全然不同的通訊協定架構,且支援完整的網狀網路。

ZigBee的網狀網路如圖2所示,它把網路中的節點(Node)分成Coordinator(C),Router(R)以及Device(D)。一個網路只能有一個C,而C可以跟R或是D通訊,而R則可以再跟其他D通訊,至於D和D之間彼此則不能通訊,所以布建ZigBee網路時須把角色制定好,然後就可透過Mesh讓整個網路延伸下去,更彈性,且透過這種多跳(Multi-hop)的特性,可以延展無線通訊的距離。

圖2 ZigBee網狀網路架構

雖然Bluetooth已演進至目前最新的4.2版本(表1),但仍未提出網狀網路,但這將是勢在必行的方向,目前BLE因為和智慧型手機相容的優勢,幾乎獨占智慧穿戴裝置及部分無線控制器市場,但是卻無法打入智慧家庭等應用,因為智慧家庭所需的架構及裝置數目,須使用整合性及擴充性夠強的網路,而這是目前BLE的弱勢,所以網狀網路會是BLE邁向物聯網必經之路,相信或許下一個版本,將有可能為Bluetooth帶來全新的網狀網路架構。

表1 藍牙4.0版至4.2版規格特色比較表

雖然BLE規格並沒有納入網狀網路,但它既然是一個無線通訊協定,就還是有辦法透過應用層(Application Layer)實作特定機制,來達到網狀網路預期的功能,也就是所謂的專屬網狀網路(Proprietary Mesh)。

BLE網狀網路實作方法

BLE有兩種做法可達到網狀網路,兩者都得透過在應用層加入Mesh相關的通訊協定,第一種方式是透過連線來達到Mesh,另一種則是透過廣播方式。

第一種方法的優點是通訊之前就會先建立連線,所以裝置間的通訊是很明確由某一個來源節點(Source Node)到另一個目標節點(Destination Node),且會有BLE的通訊協定保證資料正確送達,但缺點是實作比較困難,且若資料傳遞需求是一對多(例如關閉或開啟一個空間內所有的燈),會很沒效率。

第二種透過廣播的方式,則比較容易實作,也很適合做大量裝置的同時控制,但缺點是廣播訊息表示非目標節點也會收到這些訊息,而大量的廣播訊息會讓整個無線環境干擾變大,資料也會有遺失的可能,下面會更詳細的介紹這兩種方式的實作概念。

先談第一種方式,前文提過BLE有Central及Peripheral兩種角色的差異,且兩種角色的功能及能力不同,其中一個限制就是只有Central可以主動發起對Peripheral的連線,所以若要使用BLE架構起如圖3左的網狀網路,且必須透過連線方式的話,則前提是BLE裝置本身有角色切換(Role Switch)的能力,也就是能夠自由的視需求及狀態來切換角色。有了這個功能後,每個裝置必須記錄如圖3右的Routing Table,這個表格用來記錄每個裝置之間的聯通性,此處顯示的是比較簡單的雙向聯通。有了這兩樣要素後,BLE就能夠達到網狀網路的功能。

圖3 透過連線方式實現BLE網狀網路

舉例來說,當使用手機連接D並傳送一關燈指令給F的時候,訊息傳遞的步驟如下:
1. 手機為Central,跟D(Peripheral)做連線,將關燈命令及目標節點F告知D。
2. D必須要把命令送到F,D會去查Routing Table,並找尋將命令傳遞到F最快的傳遞方式,以這個例子來說,就是透過A來傳遞。
3. D會切換成Central跟A(Peripheral)連線並將命令傳遞給A,之後D會切換回Peripheral。
4. A收到命令後,依樣去找和F最近的傳遞路徑,以這個例子來說是直接傳遞。
5. A切換成Central,和F(Peripheral)做連接,將命令送達F,之後A切換回Peripheral。
6. F將電燈關閉。

接下來討論第二種透過廣播方式達到網狀網路的設計。這是目前比較常見的BLE Proprietary Mesh解決方案。BLE通訊協定的特性是廣播者(Broadcaster)使用三個固定的通道(Channel)38、39、40來做為廣播的通道,而接收者(Observer)只要去接收這三個特定的通道,便可收到Broadcaster送來的廣播訊息。

藉由這個特性,BLE要用廣播方式達到網狀網路非常簡單,當有一個資訊要傳遞到網路給特定裝置時,只要由一個起始裝置將資訊廣播出去,並且規定所有收到此廣播資訊的裝置,必須再將此資訊廣播出去,如此一傳十,十傳百,整個網路的裝置都會收到此訊息。而若目標裝置也收到此訊息,它便會去執行此訊息的對應工作。

在此補充一點,如同連線型的BLE Mesh需要Central及Peripheral角色切換功能,若要達到廣播型的BLE Mesh,裝置也必須要有切換Broadcaster及Observer角色的能力才行。

以圖4為例,假設該網路有A到F共六個裝置,當用戶想要以手機透過D關掉F控制的燈,則訊息傳遞步驟如下:
1. D廣播請F關燈的命令給周邊所有的裝置。
2. A(Observer)及E(Observer)收到了廣播,再把此訊息廣播出去。
3. B(Observer)、C(Observer)及F(Observer)收到了廣播,再把訊息廣播出去(Rebroadcast)。
4. F將電燈關閉。

圖4左圖是廣播進行的方式,實體線表示這個訊息第一次(新的訊息)傳遞給接收端的狀況,虛線則表示是這是已經收過的訊息,也就是無用的廣播訊息,因此我們把實體的部分取出,就得到右圖的部分,它是真正訊息的傳遞(Effective Message Flow)方式。

這種廣播訊息傳遞有兩種特性,一是就算起始跟目標裝置沒改變,每次的Effective Message Flow都是不同的,另一個特性就是如圖4左所表示,這方式會讓整個網路上充斥著一堆沒用的資訊,也就是虛線廣播訊息部分,這種垃圾訊息一但太多,將可能癱瘓掉整個網路,所以廣播式的Mesh通常會加入一些機制來避免過量的垃圾訊息,可能做法是如下:
1. 加入版本控制概念,利用版本號碼,可讓裝置知道現在收到的訊息是新的還是舊的,再由版本決定要不要做Rebroadcast,或是縮小Rebroadcast頻率。
2. 加入停止條件,利用一些資訊決定停止Rebroadcast。例如透過計時器,當時間到就停止Rebroadcast;或者透過計數器,當收到N次一樣的廣播訊息就停止Rebroadcast。

圖4 以廣播方式實現BLE網狀網路

BLE Mesh實作案例分析

網路上還有很多種BLE Mesh的實作方式,接下來以一個實際的BLE網狀網路實作案例來做探討,該案例是由Nordic公司所推出的Nordic-Bcast-Mesh,它是一個開源的專案,可以由下列GitHub網址取得:https://github.com/NordicSemiconductor/nRF51-ble-bcast-mesh。

Nordic-Bcast-Mesh顧名思義就是利用廣播來達到網狀網路,由一個裝置廣播送出訊息後,所有收到此廣播訊息的裝置,再把此訊息廣播出去給它的鄰近裝置,這種方式也被稱為「Packet Flooding」;Nordic-Bcast-Mesh主要就是使用這個機制來做網狀網路,其特點如下:
1. 「Connection-less」也就是整個通訊過程中,不會建立BLE連線,都是靠著廣播訊息達到,這其實也表示送出的資料只要有心收廣播的裝置,都可以拿到,包含惡意的裝置。
2. 所有網路中的裝置都可以發出更新訊息,然後再利用這種廣播「感染」的方式讓整個網路都收到。
3. 每個訊息都會有一個版本號碼(Version Number),利用版本號碼,可以判斷裝置目前的訊息版本是不是最新,是否要接受新收到的訊息。
4. 整個網路的實作符合RFC6206 Trickle演算法。

Nordic-Bcast-Mesh如何在BLE上配合Trickle演算法,實作出網狀網路?首先是每個網路中的BLE裝置都必須是BLE GATT Server,這個GATT Server會有Mesh Service,然後下面會有Mesh Metadata Characteristic及多個Mesh Value Characteristics,其UUID如表2所示。

表2 Nordic-Bcast-Mesh的UUID

Mesh Metadata結構如表3所示,用來儲存網狀網路的設定參數,這些參數可以被網路中的其他裝置讀取,以及透過演算法的機制被修改,其項目簡介如下:
*Access Address:是此裝置在網路中的位址或是ID,每一個裝置都不同,在網路中是獨一無二的。
*Advertisement Interval:是兩次廣播之間的間隔,也就是當裝置廣播訊息後,下次廣播最少要等Advertisement Interval的時間。
*Value Count:表示Value Characteristic的數量,每個Mesh Characteristic是一個28Bytes的資料,可以存放任何此網路裝置之間需要交換的訊息。
*Channel:表示此裝置用來廣播時使用的Channel。

表3 Mesh Metadata結構

Mesh Service下面會有一到多個Mesh Value Characteristics,最多可以到155個,Mesh Value是整個網狀網路共享的狀態資訊,一個Mesh Value最多28Bytes,可被網狀網路的每個裝置做更新。

另外,每個Mesh Value都是獨立的,會搭配一個Handle用來識別跟區分,所以Handle配上Value就成為Mesh Value Pair,每個Value Pair會運作自己獨立的Trickle演算法,也就是Mesh Values之間的Rebroadcasting機制運作完全彼此獨立。Mesh Value除會有對應紀錄的Handle之外,還會記錄如版本(Version Number)、最後的傳送者(Last Sender)等資訊,但這資訊在不同裝置間不一定相同,透過Trickle演算法會做更新。

再來看網狀網路內廣播的訊息,圖5所示為BLE廣播封包的格式,分別是:
*Advertisement Address:代表最先發起此Mesh Value更新的裝置的Access Address。
*Handle:用來識別要更新的是哪一個Mesh Value。
*Version:此Mesh Value的版本,目的是用來跟目前版本做比對。
*Content:即訊息或是命令本身。

圖5 BLE廣播封包格式

舉一個例子,假設要用BLE無線控制一棟建築內所有的電燈開關,要能一起開一起關,所以網狀網路就是由每個BLE電燈控制器組成,而且會需要一個Value Characteristic(假設Handle為0x01),其內容就是電燈的開跟關,例如0及1分別代表關與開,而所有網路中的裝置都有此Characteristic,並會保持一致的內容。

假設目前狀態都是關燈,而當要開燈時,會由某一個裝置發起廣播,其廣播內容會在Advertisement Address帶上此裝置位址,然後Handle 0,版本就直接使用上一版本加一,然後Content帶上0x01是開燈的命令。而這廣播訊息會透過Rebroadcast方式,配合Trickle演算法,讓此開燈命令傳遞到整個網路。

接下來是核心的部分,也就是Trickle演算法的部分,目的是讓裝置自己決定何時要做廣播的動作,而決定的因素是基於網路目前的活動頻繁程度,以及上次收到訊息的時間間隔。 Trickle演算法主要就是操控Interval I,此I值越大,兩次廣播間的時間越長:
*這個I會以指數成長(每次Double),I會介於Imin到Imax之間。
*在I的期間裝置會收下所有資料,如果資料是一致的(Consistent)會做Counter C++,假如收到不一致的資料(Inconsistent),則I會重置回Imin。
*當廣播送出時,會起一個Timer T,T是Random值介於[2/I,I]之間。
*當T Timeout,且C < Redundancy Constant K,那們就做Broadcast訊息的動作,反之則不Broadcast。
*當I的時間到了之後,newI = oldI * 2,假如newI < Imax,C = 0。

演算法很簡單,分析一下它的概念,I用來控制的是多久Broadcast一次:
*資料Consistent表示裝置收到的跟它現有的資訊(Value Pair)一樣,反之則是不同,表示網路有新的資料更新。
*I每次跑完都會加倍,假如整個網路狀態不變(裝置沒收到Inconsistent資料),I就會越來越大,廣播的間隔也越長,這是因為網路狀態其實都沒改變,不須一直更新,但是還是保有Imax的最低限度。
*利用C可以知道Node收到Consistent Data的數量,用來估算網路密度(Network Density),假如C已經大於某個訂好的Constant K就不再幫忙廣播,因為這可能表示周圍的裝置都是最新版本,廣播也沒用。
*至於亂數計時器(Random Timer),則可以避免干擾,假如每個裝置都是I的倍數時間在傳資料,整個網路可能會出現干擾(Collision)現象,透過Random T可以盡量避免干擾,稍微錯開一點時間。

最後回到BLE網狀網路的主題,由這篇文章的討論,可以知道雖然BLE規格目前還沒有制定Bluetooth的網狀網路架構,但是藉由BLE通訊協定的特性,仍可建立出BLE網狀網路,但建議還是必須搭配應用的需求,明確列出針對此網狀網路需要的應用,並針對應用去設計跟建立正確的網路架構,才是最好的方式。

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!