ZigBee,ZStack
http://antkillerfarm.github.io/
ZigBee應用導讀
1.設備類型
Zigbee組網設備分為三類:
1.Coordinator(圖中黑色的節點)。發起網絡,并確定PAN ID的設備。一個網里有且只有一個。組網完成之后退化為Router。
2.Router(圖中紅色的節點)。管理若干子節點,須一直在線。
3.End-device(圖中白色的節點)??梢孕菝?。
從圖中可以看出,zigbee網絡是一個網狀結構,從圖論的角度講,End-device相當于葉子,而Router相當于枝干。Coordinator在組網的時候,相當于根節點,但是組網一旦完成,整個網絡就沒有中心了,數據交換是不必通過Coordinator的。從圖中還可看出,數據從一個節點到另一個節點,中間會經過多次中繼節點的數據交換,因此存在路由算法的問題。
2.棧配置類型
簡單來說,通常只有棧類型相同的設備之間才能組網。也分為三類:
1.Zigbee。
2.Zigbee PRO。
3.自定義。
3.地址
設備地址分為64位的MAC地址和16位的邏輯地址兩種,其中前者全球唯一,而后者全網唯一。其中后者的唯一性,由相關地址分配算法和地址沖突機制保證。
此外對應用而言,還有EndPoint需要指定,它相當于普通TCP/IP的端口號。afRegister函數用于指定EndPoint。
4.數據包類型
按目的地的不同分為三類:
1.Unicast。發給單獨的設備。
2.Multicast。發給一組設備。知識點:Group Addressing
3.Broadcast。全網廣播。
存在以下幾種廣播地址:
0xFFFF -這個一個對全網絡中設備進行廣播的廣播地址
0xFFFD -如果在命令中將目標地址設為這個地址的話那么只對打開了接收的設備進行廣播
0xFFFC -廣播到協調器和路由器
0xFFFE -如果目的地址為這個地址的話,那么應用層將不指定目標設備,而是通過協議棧讀取綁定表來獲得相應目標設備的短地址。
此外的0x0000到0xFFF8都是有效的目的地址。其中協調器為0x0000。
按照目的地指派方式的不同可分為直接和間接兩種。后者通過查找Binding Table的方式找到目的地的邏輯地址。知識點:Binding的含義,以及Binding Table的實現。
5.路由
路由發現、選擇和維護相關的規則。
路由表存儲及維護
6.其他
End-device由于移動導致的父節點的更換。
PAN ID沖突的解決,以及跨PAN通訊的實現。
無線信道的選擇。知識點:偵測環境,確定最小噪聲的信道。
7.Profile ID與Cluster ID
ZigBee聯盟除了定義ZigBee協議的物理層和鏈路層之外,還對應用層做了一些統一的規定。其中Profile ID用于區分設備的應用領域,比如是燈光,還是傳感器。而Cluster ID用于細分同一個Profile下的操作,比如燈光是調亮,還是調暗。
Z-Stack
Z-Stack是德州儀器公司推出的Zigbee協議棧。源代碼不公開,僅有如何使用的接口文檔。
1.消息
Z-Stack的消息分為兩大類:系統消息SYS_EVENT_MSG和自定義消息。其中前者又可分為三大類:
1.硬件消息。例如KEY_CHANGE
2.AF消息。主要是和數據的交換和路由相關的消息。例如AF_DATA_CONFIRM_CMD,AF_INCOMING_MSG_CMD。
3.ZDO消息。和具體設備的應用相關的消息。例如ZDO_STATE_CHANGE,ZDO_CB_MSG。
2.組網
1.可以設定Coordinator組網所用的Channel和Pan ID,否則就是隨機生成Channel和Pan ID。
2.在指定Channel或Pan ID的情況下,如果已經有網絡使用了該Channel或Pan ID,則Coordinator會重新選擇一個Channel或Pan ID。但是與之配套的Router和End Device無法偵測到這個改變,因此會加入已有的網絡,而不是Coordinator新建的網絡。
3.設備可開機自動入網,也可稍后手動入網。入網成功之后,可以保存入網信息。
3.綁定 vs 查找
綁定就是發送方指定接收方。而查找則是接收方注冊可以被接受的發送方。
4.事件處理
設計原則:
1.SYS_EVENT_MSG消息需要一次性全部處理完。
2.而其他消息最好一次只處理一條。
sentTransID可用于標識消息。每發一條消息,自動加1。
5.FLASH驅動
從芯片手冊來看,CC2530采用的是NOR FLASH。其所用的存儲方案實際上和我去年提出的一份專利類似:它的實現更通用一些,但是性能上比我的要差些。
6.處理流程
1)主流程
main—主函數
->osal_init_system
–>osalInitTasks—初始化任務結構,每個任務會分配一個全局的任務ID,發送消息的時候會用到這個ID。
->osal_start_system—任務調度死循環
–>osal_run_system
—>tasksArr—任務處理回調
2)客戶定制的事件處理
Coordinator_ProcessEvent—事件處理入口,可定義為一個任務
->KEY_CHANGE—按鍵處理
–>Coordinator_Net_PermitDeviceToJoinNet
—>ZDApp_NetworkInit—未建網 OR NLME_PermitJoiningRequest—已建網
->AF_INCOMING_MSG_CMD—接收到數據的消息
->AF_DATA_CONFIRM_CMD—返回發送數據的結果(結果包括是否成功發送等)
3)建網和入網
發起方:
ZDOInitDevice
->ZDApp_NetworkInit
–>ZDO_StartDevice
接收方:
ZDO_JoinIndicationCB
4) 退網
NLME_LeaveReq
5)自定義流程
如果ZStack的標準流程無法滿足需要的話,就需要使用ZDO_RegisterForZdoCB函數注冊相應的回調函數,來改變標準的流程。
7.配置文件
source/Tools/CC2530DB/f8wConfig.cfg—可以配置PAN ID等。
8.重要的函數
長短地址轉換:AddrMgrExtAddrLookup和AddrMgrNwkAddrLookup。
獲得長地址:NLME_GetExtAddr。
9.重啟
Zstack的重啟分為以下幾種:
1)SystemReset
這種重啟的機制是關閉中斷,并死循環,然后WatchDog超時,從而導致的重啟。是為“硬重啟”。
2)SystemResetSoft
這種重啟,將PC指針重置為0,也就是上電時代碼啟動的位置。是為“軟重啟”。
3)ZDO_DEVICE_RESET
除了函數調用式的重啟之外,還有消息式的重啟。消息處理最終調用SystemResetSoft實現重啟。
10.首次組網和二次組網
兩者的區別在于,二次組網的時候,由于設備的FLASH上保存有上次啟動時的組網信息。因此就沒有首次組網時的Beacon request握手過程。
程序使用ZDApp_ReadNetworkRestoreState函數判定是否有上次的組網信息。
11.自動組網和手動組網
HOLD_AUTO_START
Packet Sniffer
為了方便對zigbee協議的調試,TI還提供了CC2531 USB Dongle。這個Dongle硬件配合TI的Packet Sniffer軟件,可以對周圍的zigbee網絡通信進行監控和抓包分析。也就是說它監控的不是單個的Zigbee模塊或設備,而是一個區域內的所有Zigbee信號。
使用時,首先需要設定監控的Zigbee Channel。然后即可開啟抓包按鈕。
以下使用Packet Sniffer對Zigbee組網過程中的數據包,做一個簡單的分析。
組網
1.EndDevice不斷發送Beacon request數據包。
2.Coordinator把自己的MAC地址和PAN ID發送給EndDevice。此外信息還有節點深度、最大子節點數等內容。EndDevice會根據這個信息選擇有富余能力的節點,并進行下一步。
3.EndDevice發送Association request到Coordinator,其中包含了EndDevice的MAC地址。
4.Coordinator返回一個應答包。
5.EndDevice發送Data request到Coordinator。
6.Coordinator返回一個應答包。
7.Coordinator將Short addr發送給EndDevice。
8.EndDevice返回一個應答包。
9.EndDevice發送一個應用層的廣播數據包。該包的內容是該設備的長短地址,用于通知網絡,它的長短地址之間的對應關系。這個數據包是應用層的,也就是使用AF_DataRequest發送的,而之前步驟的數據包都是鏈路層的。
普通數據包的結構
應用層所收發的數據包,由3部分組成:
1.MAC層。這一層包括PAN ID,直接的源地址和目標地址。
2.NWK層。這一層包括間接的源地址和目標地址。
3.APS層。這一層包括源EndPoint、目標EndPoint、Cluster ID、Profile ID和普通數據。
下面以多跳情況下的數據交互為例,解釋一下直接地址和間接地址的含義。
假設有三臺設備A、B、C。其中的路由關系是A->B->C?,F在從設備A向設備C發送一個數據包,其步驟如下:
1.Route Request和Route Reply,確定路由。
2.A向B發送一個數據包,該數據包的MAC層地址是A->B,NWK層的地址是A->C。
3.B根據NWK層的地址判定,這個包不是給自己的,而是給C的,于是轉發一個數據包。該數據包的MAC層地址是B->C,NWK層的地址是A->C。
4.C根據NWK層的地址判定,這個包雖然是B發過來的,但是數據的源頭是A。
多跳組網測試
1.條件準備
至少有3臺設備才可以組成一個深度為2的ZigBee網絡。
2.修改配置
默認配置下,Zigbee網絡一個節點可以掛載的總設備為20個,其中路由節點為6個。因此如果不修改配置的話,需要很多的設備才能模擬多跳組網的情況。
修改的步驟如下:
1)
#define STACK_PROFILE_ID NETWORK_SPECIFIC
2)
nwk_globals.c文件中的Cskipchldrn數組和CskipRtrs數組。這些數組的值由MAX_CHILDREN和MAX_ROUTER構成。
MAX_CHILDREN決定了一個路由(Router)或者一個協調器節點可以處理的兒子節點的最大個數。
MAX_ROUTER決定了一個路由(Router)或者一個協調器(Coordinator)節點可以處理的具有路由功能的兒子節點的最大個數。這個參數是MAX_CHILDREN的一個子集,終端節點使用(MAX_CHILDREN – MAX_ROUTER)剩下的地址空間。
參考
TI ZigBee FAQ 常見問題解答
http://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/t/75525.aspx
工程實踐中所遇問題及解答
NLME_PermitJoiningRequest
NLME_PermitJoiningRequest只管本節點是否允許其他設備加入,管不了整個網絡。所以多級組網或者設備很多的時候,不但協調器的Permit需要打開,下面Router的Permit也要打開,否則一旦設備和協調器之間無法直接通信,或者協調器直接掛載的設備數已經達到最大值,都會導致設備無法入網。同樣,設備退網的時候,也需要將整個網絡的Permit都關掉,不然的話,設備一退網,如果發入網請求的話,又會加回來,這就是有人說的設備退不了網的情況。
P2.1和P2.2的使用
P2.1和P2.2是特殊的GPIO,由于它們和JTAG復用,因此在調試模式下無法當做GPIO輸入來使用,但普通模式下,它們的工作是正常的。
Zigbee傳輸速度
ZigBee resides on IEEE 802.15.4 transceivers, which in the 2.4 GHz space communicate at 250 kilobits per second (kbps), but by the time retries, encryption/decryption, and the fully acknowledged mesh protocol is applied, the actual through- put is closer to 25 kbps.
這是TI官方技術支持的說法,轉換成相應的串口波特率大概是38400。也就是說超過這個速度的串口速度對于Zigbee設備來說是處理不過來的。
ICE
我在研究生時代,研究過CORBA、EJB、COM這樣的中間件技術。然而工作以后,再沒有機會使用。平時偶爾關注,也只是曉得CORBA從來沒有流行過,EJB在Struts、Hibernate、Spring等框架的圍攻下,用者寥寥。直到最近,因為項目需要接觸到ZeroC的ICE框架。
ICE框架的官網地址:
https://zeroc.com/downloads/ice
總結
以上是生活随笔為你收集整理的ZigBee,ZStack的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenGL研究, GUI框架分析, 虚
- 下一篇: 有用的网址集合, IT杂谈