Zigbee通訊漫談(初次見面)


鄭重聲明:以下文章內容適合初學Zigbee的童鞋們,大神請略過……


1 緣由:

  工作中聽說過Zigbee技術,只是知道是一種無線通訊技術,具體技術細節及使用都不是很清楚。不料,一個項目中需要使用Zigbee技術,這下可是要好好看下Zigbee是啥子東東了。這裏寫下我對Zigbee技術的一些理解。

2 啥是Zigbee呀?

  Zigbee是一種無線通訊技術。無線,顧名思義,就是通過無線電波(像WIFI,手機)作爲信息載體的一種通訊方式。通訊,也就是指一個設備和另一個設備之間需要溝通、交流。人和人之間需要溝通,溝通就需要使用語言,那這個語言可能存在語法,說白了就是雙方都要理解對方說的是啥,要是一個只懂中文,另一個只懂英文,那他兩個溝通就可能需要一個翻譯。設備之間也一樣,它們之間需要遵循一定的規定。兩個設備都要按照這個規定進行收發信息,那這個規定就是協議。對於Zigbee通訊技術來說就是Zigbee協議。其實啊,計算機的技術有兩個大的方面,一個是計算機本身(硬件技術上的進步),一個是不同設備之間的溝通。類比我們人類來說,一個是 人 本身的問題,一個是社會問題。說了這麼多廢話,下面總結一下:Zigbee通訊就是設備和設備之間進行溝通的一種方式,這種方式規定了傳輸信息需要什麼物理介質,傳輸的信息格式是什麼樣子的,誰先發送信息,信息傳輸過程中被幹擾了怎麼辦,對方要是沒收到怎麼辦等等一系列問題。


  算了,還是看看官方怎麼定義的吧:ZigBee是基於IEEE802.15.4標準的低功耗局域網協議。根據國際標準規定,ZigBee技術是一種短距離、低功耗的無線通信技術。

     另外附上Zigbee、WIFI、bluetooth之間的區別和聯繫圖:

     wKiom1WfNXyTtX3eAAIdd-v2aVA157.jpg

3 和Zigbee打個招呼(混個臉熟)

  我們把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家庭圖:

wKiom1WfZ1XD7KTeAAFk9gxHXiM376.jpg

wKiom1WfcFayKd86AAHMS5N9G9s507.jpg

圖二: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。還是上個圖吧。

wKiom1Wfc6WBJyWcAALP4I6iR3s832.jpg


 在這個例子裏,左邊是兩個開關(可能裝在走廊裏),兩個開關共用一個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協議棧設計時採用了分層的設計思想。還是上個圖:

wKiom1Wfek3CNwzoAAbh0qcZ-_4740.jpg可以看到,Physical (PHY) Layer和MAC  Layer是IEEE 802.15.4定義的。

分層模式下Zigbee通訊的示意圖:

wKioL1WffgPyPfsNAAGp-AcLv6k022.jpg在802.15.4和Zigbee協議中,用“原語”的概念來描述相鄰兩個層間的服務,層間調用函數或者傳遞信息,都可以用原語來表示。雖然,在整個系統中,有很多不同的層,但是層間的通訊方式是非常相似的。比如PHY、MAC與NWK層都爲他們的上一級提供數據服務,其請求數據服務的機制類似:高層通過D-SAP向下級請求傳輸,下級傳輸成功後將狀態返回給上級。

  正是由於這種相似性,才讓“服務原語”這種方式顯得格外重要。每一個原語要麼執行一個指令,要麼返回一個之前指令的運行結果。原語也會帶着指令運行需要的參數。

wKioL1WffjXwMeTYAAEouwS5kUE415.jpg  上圖描述了某層爲其上層提供服務的一般方法,如圖所示,有四種類型的原語:請求、指示、響應和確認。換句話說,在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章