鄭重聲明:如下文章內容適合初學Zigbee的童鞋們,大神請略過……網絡
1 原因:app
工做中據說過Zigbee技術,只是知道是一種無線通信技術,具體技術細節及使用都不是很清楚。不料,一個項目中須要使用Zigbee技術,這下但是要好好看下Zigbee是啥子東東了。這裏寫下我對Zigbee技術的一些理解。函數
2 啥是Zigbee呀?學習
Zigbee是一種無線通信技術。無線,顧名思義,就是經過無線電波(像WIFI,手機)做爲信息載體的一種通信方式。通信,也就是指一個設備和另外一個設備之間須要溝通、交流。人和人之間須要溝通,溝通就須要使用語言,那這個語言可能存在語法,說白了就是雙方都要理解對方說的是啥,要是一個只懂中文,另外一個只懂英文,那他兩個溝通就可能須要一個翻譯。設備之間也同樣,它們之間須要遵循必定的規定。兩個設備都要按照這個規定進行收發信息,那這個規定就是協議。對於Zigbee通信技術來講就是Zigbee協議。其實啊,計算機的技術有兩個大的方面,一個是計算機自己(硬件技術上的進步),一個是不一樣設備之間的溝通。類比咱們人類來講,一個是 人 自己的問題,一個是社會問題。說了這麼多廢話,下面總結一下:Zigbee通信就是設備和設備之間進行溝通的一種方式,這種方式規定了傳輸信息須要什麼物理介質,傳輸的信息格式是什麼樣子的,誰先發送信息,信息傳輸過程當中被幹擾了怎麼辦,對方要是沒收到怎麼辦等等一系列問題。翻譯
算了,仍是看看官方怎麼定義的吧:ZigBee是基於IEEE802.15.4標準的低功耗局域網協議。根據國際標準規定,ZigBee技術是一種短距離、低功耗的無線通訊技術。設計
另外附上Zigbee、WIFI、bluetooth之間的區別和聯繫圖:指針
3 和Zigbee打個招呼(混個臉熟)blog
咱們把Zigbee通信和人之間溝通作個類比,而後以不斷提問的方式來闡述一下Zigbee是怎麼實現不一樣設備之間通信的。前面說啦,Zigbee通常用於局域網通信(有同窗舉手了,「啥是局域網呀?」「那個同窗,你先把手放下,舉着怪累的」「局域網就是局部使用的網絡,也就是說小範圍內的通信,你像你家裏須要不一樣設備通信,就可使用Zigbee技術」 「咱們都使用Internet上網、聊天,它是基於TCP/IP協議的,TCP/IP能夠組成局域網,也能夠組成Internet」),那咱們就以你家裏人之間溝通做爲類比的例子。下面假設如下場景:你家裏有3口人,你、爸爸、媽媽|類比Zigbee網絡裏有3個Zigbee設備。你如今大概知道我會以什麼方式來聊聊這個Zigbee了吧。遊戲
64 bit MAC地址(全球惟一地址)事件
哎呦,咱們的目的是想讓Zigbee設備之間能相互溝通。那首先最早擺在咱們面前的問題是怎麼保證Zigbee設備的惟一性吶?在你家裏,你確定是要認識爸爸、媽媽的,一樣爸爸、媽媽也要認識你。你是怎麼認識爸爸、媽媽的?如今給你1S思考時間,恩,你記住了爸爸、媽媽的身高、長相等特徵。也就是說爸爸、媽媽有必定的外貌特徵,兩我的長的徹底如出一轍還真是很少見。如今醫學說是DNA不同,因此每一個人就不同,對人來講是DNA就是你在地球上的惟一標示。那Zigbee設備是以什麼來肯定其惟一性的吶,這個好說,Zigbee設備都是咱們人類製造的,咱們能夠人爲地給它們分配一個惟一的地址。我是這麼想的,查下資料(稍等5分鐘…………)。惟一標示Zigbee設備的物理地址是64bit的一串數字,好比:000124B00028B679,前面24bit表明公司代碼,後40bit表明地址段。這些地址須要向IEEE委員會申請。
16 bit 網絡地址(用於標示Zigbee網絡內部一個設備)
你可能會想,我在家裏,通常只喊「爸爸」、「媽媽」就能夠區分他們了,不用每次都去看他們的身高、長相等等一系列特徵我就能夠惟一肯定我要找的人。在一個給定的Zigbee網絡內,惟一肯定Zigbee設備有其餘方法嗎?我想應該是有的,Zigbee設備之間組成網絡後,每一個設備會分配一個16bit的短地址,設備之間能夠經過這個短地址進行通信。局域網內,範圍小了,可使用一個更簡短的地址區分不一樣設備。
Zigbee網絡創建、設備加入
在大家的家庭中,你的爸爸、媽媽和你都有着不一樣的角色。有時間找出你家的戶口本,戶口本通常是有編號的(在戶口本的左上角或者右上角)。你的爸爸有多是戶主,你是父母的子女(這不是廢話嗎?我只是讓你知道,在家庭中不一樣的人有不一樣的角色)。那你可能要問了,Zigbee設備中都有哪些角色,不一樣的角色都作哪些工做?Zigbee設備裏分爲Coordinator、Router、Enddevice三種角色。Coordinator負責創建Zigbee網絡,併爲這個Zigbee網絡分配一個惟一的ID(他們都叫這個ID,PANID),Router能夠加入Coordinator創建的網絡,同時它能夠轉發數據,也就是做爲數據中繼,用來延長Zigbee無線通信距離。Enddevice是終端設備,加入Zigbee網絡,只能接收、發送數據。
來張Zigbee家庭圖:
圖二:Zigbee網絡拓撲圖
***,你媽喊你回家吃飯啦!
你和爸爸、媽媽在家裏,你玩遊戲累了,想點東西。你能夠選擇如下方式和你的爸爸、媽媽溝通。
1:直接扯開嗓子大喊:「我餓啦,趕忙給我作點吃的」。這種狀況下,爸爸、媽媽都聽見了,可能出現如下情形:a,爸爸比較忙,回了句:「我忙着,找你媽媽」,媽媽回了句「我給你作個蛋炒飯」。b,爸爸媽媽一塊兒回:「好孩子,咱們這就給你作飯」,而後出現爸爸、媽媽一塊兒作飯的恩愛場景。c,爸爸媽媽都比較忙,回到「熊孩子,成天打遊戲,還有臉說餓,本身作飯去,咱們還要看電視劇吶」,固然這種狀況下,你能夠考慮你本身是否是衝電話費送的。不過,話說回來啦,你扯開嗓子喊,其實有個更專業的通信術語,廣播。對,Zigbee設備之間通信的其中一種方式就是廣播,一個設備廣播,其餘網內的設備都能聽到。
普及一下Zigbee規定的廣播地址小知識:
0xFFFF -這個一個對全網絡中設備進行廣播的廣播地址
0xFFFD -若是在命令中將目標地址設爲這個地址的話那麼只對打開了接收的設備進行廣播
0xFFFC -廣播到協調器和路由器
0xFFFE -若是目的地址爲這個地址的話,那麼應用層將不指定目標設備,而是經過協議棧讀取綁定表來得到相應目標設備的短地址
此外的0x0000到0xFFF8都是有效的目的地址。每個地址就只是了一個目標設備。
2:悄悄滴走到媽媽身邊,單獨跟媽媽說:「媽媽,我餓了」。這種狀況下,極有多是爸爸作的飯菜實在是太難吃了。想這種,在Zigbee裏就是點對點的通信方式。在這種方式下,通信雙方都要指定目標地址。
3:和爸爸約定個暗號,大聲咳嗽三聲。這種方式,你不用考慮什麼原地址、目標地址這些瑣碎的事情。你只要發出這個暗號,老爸就知道你額了,還知道你想吃啥。高明啊,這招,可是這個也要看爸爸當時的心情咋樣啊。這種在Zigbee裏,叫綁定(Bonding)。通信雙方綁定後,雙方通信時就不須要過多的信息,只要發送暗號,就能完成相應的功能。
知識領域 VS Endpoint
經過上面的描述,咱們知道了,設備短地址是用於標示一個Zigbee設備的。就至關於在家裏面你、爸爸、媽媽同樣,不一樣稱謂表示不一樣的人。可是,又一個問題隨之浮出水面,那就是小孩和大人擁有的生活經歷和涉足的知識領域不太同樣啊,你把你兒子(6歲)叫過來,給他說:「兒子,媽媽不在家,今天下午咱們去吃肯德基,好吧?」。「好的」兒子高興地回答。雙方溝通愉快。那下面的場景你想下,「兒子,你知道C語言裏指針變量是一種存儲內存地址的變量嗎?」,兒子一臉茫然,「??????」。剩下的場面腦補下吧。上面的故事告訴咱們雙方可以愉快地溝通,交流的內容須要雙方都要了解。在Zigbee通信裏有一個概念和這相似,叫Endpoit,一個Zigbee設備上能夠存在好多Endpoit。仍是上個圖吧。
在這個例子裏,左邊是兩個開關(可能裝在走廊裏),兩個開關共用一個Zigbee節點「Z1」(至關於開發板上的兩個按鍵,這點應該不難理解吧),他們一塊兒控制右邊的三個燈泡(也是接在同一個節點上的--「Z2」)。Z1的key1控制Z2的lamp1,而key2則控制Z2的lamp2與lamp3。
上圖中有幾個沒見過的概念:cluster ID 、Binding Table,其實還有一個profile、attribute。下面咱們慢慢來講這些都是什麼東東。
Binding Table最好理解,上面說了,爲了溝通方便,咱們能夠創建綁定關係,創建綁定關係的雙方的短地址、Endpoit等信息都存儲在Binding Table中。
Profile ID, 這個是由Zigbee組織來分配的應用ID號,好比無線開關用0x0001,智能電錶用ox0002,萬用遙控器用0x0003等等。在這個例子裏,這個ID號是專門用來作電燈開關的。爲何要這麼作呢?這裏就體現了「標準」的意義,不一樣廠家功能的設備,因爲有了這個ID就能互相間使用了,正泰的開關同樣能夠控制Philips的燈。。。
Endpoint,這個名字看起來容易誤解,覺得是設備的序號了,其實否則。在這個例子中,Z1有key1/key2兩個Endpoint,分別作不一樣的事情。其對應了同一個"application"中的0-240個不一樣的「子應用」,其中0號endpoint是用"ZDO"預留的,不能佔用。若是你熟悉TCP/IP,你可能感受Endpoit和port(端口號)有點類似之處。
Cluster ID,這個怎麼叫呢?叫信息簇ID吧。。。個人理解是,「這是個哪類的信息」,發送端和接收端必定要對應,可是具體這個「類」怎麼分,是咱們能夠本身決定的。好比說這個例子,我能夠這樣定:Cluster ID=1表明開關一次,Cluster ID=2表明連續閃爍。。。或者定義Cluster ID=1表明點對點控制,而Cluster ID=2表明所有控制,等等。。。
attribute,在Zigbee協議棧中,每個標準的profile(例如HA,專門用於智能家居的應用層規範)都定義了不少的Cluster ID,而每個Cluster ID都有一些規定好的attribute及動做。
什麼?太難理解了,好吧,仍是來個生活中的例子吧。
以大學一年級流行的友好寢室爲例:
男宿舍8我的構成開發板A, 女宿舍8我的構成開發板B.
男宿舍8我的就是開發板A上的8個EndPoint。
男宿舍5我的喜歡學習,3個愛玩,分爲具備不一樣行爲愛好的兩個集團,也就是兩個Profile.
女宿舍8我的3個喜歡學習,2個愛玩,剩下4個愛吃,分爲3個集團,也就是三個Profile。
愛學習的Profile = 0x0010; 愛玩的Profile = 0x0011; 愛吃的Profile = 0x0012;
以上定義結束,如今來看綁定過程:
某男同窗(愛玩)打個電話給女宿舍說要出去玩,8個女同窗中的6個由於愛好不一樣(Profile值不一樣),直接拒絕。剩下的2個女生有一個由於討厭該男同窗(腦子中沒有註冊該男同窗的任何示好),也拒絕了,另一個女生暗戀該男生(腦子中已經填滿該男同窗的任何示好,隨時準備...), 因而綁定成功。
這樣之後該男生就會直接撥這位女生的手機了。
假設這位男生排名老3, 那並不必定要求這位女生也排名老3。
4 小結:
我瞎白扯了半天,不知各位看官能不能看到這個地方。上面討論的內容也基本涵蓋了初學者最疑惑,也是最想弄清楚的概念。
5 Zigbee協議棧結構
Zigbee協議棧設計時採用了分層的設計思想。仍是上個圖:
能夠看到,Physical (PHY) Layer和MAC Layer是IEEE 802.15.4定義的。
分層模式下Zigbee通信的示意圖:
在802.15.4和Zigbee協議中,用「原語」的概念來描述相鄰兩個層間的服務,層間調用函數或者傳遞信息,均可以用原語來表示。雖然,在整個系統中,有不少不一樣的層,可是層間的通信方式是很是類似的。好比PHY、MAC與NWK層都爲他們的上一級提供數據服務,其請求數據服務的機制相似:高層經過D-SAP向下級請求傳輸,下級傳輸成功後將狀態返回給上級。
正是因爲這種類似性,才讓「服務原語」這種方式顯得格外重要。每個原語要麼執行一個指令,要麼返回一個以前指令的運行結果。原語也會帶着指令運行須要的參數。
上圖描述了某層爲其上層提供服務的通常方法,如圖所示,有四種類型的原語:請求、指示、響應和確認。換句話說,在802.15.4和Zigbee標準中的全部服務均可以歸類爲上述四種原語之一。原語用下面的格式來描述:
(注:出於本文讀者多數爲如今或者將來的軟件工程師,後面直接用英文名稱來表述四種原語)
<The primitive>.request
<The primitive>.indication
<The primitive>.response
<The primitive>.confirm
首先,由N+1層向N層用request原語申請一個服務,好比說MAC層向PHY層請求一個MPDU傳輸服務,它必需要向PHY層申請一個PD-Data.request的原語。
而N層會向其服務用戶(常常是N+1層)發出一個indication的原語,用來指示一個對N+1層很重要的事件。好比說,PHY層接收到一組數據,須要將此數據傳遞給MAC層,那麼它就向MAC層產生髮出一個PD_Data.indication的原語,用來向其傳遞數據。
若是這個indication原語要求對其作出響應,那麼N+1層就會發出一個response原語。值得注意的是,PHY和NWK層沒有任何response原語,而只有MAC和APL層有。
而confirm原語是由N層發出,用來最終確認最初N+1層申請的request服務已經完成。好比在上例中,數據發送完成後,PHY層會告訴MAC層,傳輸已經成功完成。
注:本文只是用一種淺顯易懂的方式,讓讀者瞭解原語的基本概念,若是讀者須要深刻了解每層提供的原語細節,請直接閱讀802.15.4和Zigbee的協議文檔。
ZigBee設備在工做時,各類不一樣的任務在不一樣的層次上執行,經過層的服務,完成所要執行的任務。每一層的服務主要完成兩種功能:根據它的下層服務要求,爲上層提供相應的服務;另外一則是根據上層的服務要求,對它的下層提供相應的服務。各項服務經過服務原語來實現。能夠把原語看做是API函數 是ZigBee中最基本的操做, 通常協議都有對原語進行程序實現 在本身開發系統時,只須要調用,設定參數就行了 。若是要本身實現底層的細節那就必須在開源的協議棧中,深刻到原語的級別。也就是說,對於原語咱們只須要了解就行,真正開發程序只知道咱們給系統哪些參數就好了。
6 總結
有了上面的基礎,咱們就能夠根據實際的實驗平臺作作實驗。咱們就大體上理解了什麼是Zigbee協議了,固然這只是從應用層瞭解了,若是你只是使用Zigbee技術實現你項目中的用戶需求,那你根據實際的協議棧(好比Z-Stack,TI提供的Zigbee開發平臺)提供的API來進行應用層開發就能夠了。若是你想深刻研究Zigbee協議棧或者想學習Zigbee協議棧設計思想,建議閱讀開源的Zigbee協議棧源代碼(freakz協議棧、TinyOS等)。
記得閱讀 ZIGBEE SPECIFICATION 哦。
官方資料:Zigbee specification