一.前言
從今天開始,我們要正式開始進行zigbee相關(guān)的通信實驗了,我所使用的協(xié)議棧是ZStack 是TI ZStack-CC2530-2.3.0-1.4.0版本,大家也可以從TI的官網(wǎng)上直接下載TI公司為cc2530寫的協(xié)議棧代碼,畢竟,我們作為初學者,應該先不要去深究協(xié)議棧是怎么用代碼編寫的,畢竟zigbee已經(jīng)相當成熟了,我們應該先學會使用zigbee協(xié)議棧進行通信,并能應用于實際項目中,比如說智能家具,不知道大家是不是有同感,所以下面我就先給大家介紹一下zigbee通信的原理以及體系架構(gòu)。
二.ZStack 體系架構(gòu)
ZStack 的體系結(jié)構(gòu)由稱為層的各模塊組成。每一層為其上層提供特定的服務:即由數(shù)據(jù)服務實體提供數(shù)據(jù)傳輸服務;管理實體提供所有的其他管理服務。每個服務實體通過相應的服務接入點(SAP) 為其上層提供一個接口,每個服務接入點通過服務原語來完成所對應的功能。
ZStack 根據(jù)IEEE 802.15.4 和ZigBee 標準分為物理層,介質(zhì)接入控制層,網(wǎng)絡層,應用層。物理層提供了基礎(chǔ)的服務,數(shù)據(jù)傳輸和接收,網(wǎng)絡層提供了各個節(jié)點連入的服務,是zigbee網(wǎng)絡通信的關(guān)鍵,應用層是我們關(guān)注的重點,提供了應用的框架和ZDO。大家如果想了解體系結(jié)構(gòu)的具體內(nèi)容,可以自己去看說明文檔,下面我給大家介紹一下zigbee工作原理。
ZStack 采用操作系統(tǒng)的思想來構(gòu)建,采用事件輪循機制,而且有一個專門的Timer2 來負責定時。從CC2530 工作開始,Timer2 周而復始地計時,有采集、發(fā)送、接收、
顯示…等任務要執(zhí)行時就執(zhí)行。當各層初始化之后,系統(tǒng)進入低功耗模式,當事件發(fā)生時,喚醒系統(tǒng),開始進入中斷處理事件,結(jié)束后繼續(xù)進入低功耗模式。如果同時有幾個事件發(fā)生,判斷優(yōu)先級,逐次處理事件。這種軟件構(gòu)架可以極大地降級系統(tǒng)的功耗。
整個ZStack 的主要工作流程,如圖所示,大致分為以下6 步:
(1) 關(guān)閉所有中斷;
(2) 芯片外部(板載外設(shè))初始化;
(3) 芯片內(nèi)部初始化;
(4) 初始化操作系統(tǒng);
(5) 打開所有中斷;
(6) 執(zhí)行操作系統(tǒng)。
這就是zigbee處理任務的大致過程。
三.代碼分析
協(xié)議棧的代碼很多,而且很復雜,上圖就明白了。。。
這還只是一部分,所以我們先不用太過于專注于協(xié)議棧的編寫,而是要學會如何用,我們主要學習和配置的就是圖中SampleApp.c這個文件,它主要就是應用于應用的,我們面對不同的應用,只要修改它和底層的配置文件就行了。它里面有6個非常重要的函數(shù),這6 個函數(shù),有關(guān)于初始化用戶功能
的;有關(guān)于所有事件的 處理的;有按鍵服務功能編寫的;有接收數(shù)據(jù)的處理的;有數(shù)據(jù)發(fā)送函數(shù)的編寫的。下面我們就對這6 個函數(shù)進行分析:
void SampleApp_Init( uint8 task_id )
這是一個用戶用于初始化任務的函數(shù),它是在系統(tǒng)初始化階段被調(diào)用的,而且,在調(diào)用它的時候,它里面應該有相應任務的初始化(也就是說,用戶有什么初始化,都是放在這個函數(shù)里),比如:硬件初始化、數(shù)據(jù)表初始化、電源初始化等等。
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
這是一個事件處理函數(shù)(所有事件都是它管理),當有已登記的事件發(fā)生時,它就被主函數(shù)調(diào)用來對事件進行處理,這些事件包括:定時器、消息、以及用戶定義的事件等
等。
這個函數(shù)的功能包括:按鍵處理,數(shù)據(jù)接收,數(shù)據(jù)發(fā)送。當然,用戶可以自己添加其它事件,我們就在這個函數(shù)添加自己的串口事件。
void SampleApp_HandleKeys( uint8 shift, uint8 keys )
這個函數(shù)是給SampleApp_ProcessEvent( uint8 task_id, uint16 events )調(diào)用的:當按鍵按下后,就會執(zhí)行SampleApp_ProcessEvent 函數(shù)里的case KEY_CHANGE ,這個case 的服務函數(shù)就是SampleApp_HandleKeys( uint8 shift, uint8 keys ),我們可以在這個函數(shù)里添加按鍵判斷,判斷哪個按鍵,然后執(zhí)行相關(guān)任務。
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
這個函數(shù)管理所有接收到的數(shù)據(jù),至于數(shù)據(jù)來自哪個設(shè)備,它是根據(jù)簇ID 來分辨的。
函數(shù)里面就是一個switch 語句,關(guān)鍵是case 及其后面的服務函數(shù)。用戶可以根據(jù)不同的功能,定義不同的簇ID(在SampleApp.h 里進行),然后在這個switch 語句里添加一個以簇ID 來命名的case,并在case 里面編寫自己的應用程序。
void SampleApp_SendPeriodicMessage( void )
這個函數(shù),是一個周期性數(shù)據(jù)發(fā)送函數(shù),它是設(shè)備設(shè)置為周期性廣播的時候調(diào)用的,它是我們設(shè)置發(fā)送數(shù)據(jù)的地方。
void SampleApp_SendFlashMessage( uint16 flashTime )
這個函數(shù)是void SampleApp_HandleKeys( uint8 shift, uint8 keys )函數(shù)的一個服務函數(shù),我們也是極少用到這個函數(shù)的,故不作詳解。
上述就是常用的6個函數(shù),對于初學者,會使用zigbee協(xié)議進行應用就夠了,先對驅(qū)動進行移植,在進行硬件進行初始化,在修改這6個函數(shù),就可以對zigbee進行簡單的應用了,今天就先寫到這里了,協(xié)議棧代碼太多了我就不貼出來了,需要的朋友聯(lián)系我,大家相互學習,這只是我的一點體會。
-
ZigBee技術(shù)
+關(guān)注
關(guān)注
3文章
115瀏覽量
42982
發(fā)布評論請先 登錄
一文讀懂ZigBee技術(shù)的前世今生
一文讀懂zigbee通信技術(shù)的特點和性能
TI_06版Zigbee協(xié)議棧學習_02 - Zigbee技術(shù) -
TI_06版Zigbee協(xié)議棧學習_03 - Zigbee技術(shù)
TI_06版Zigbee協(xié)議棧學習_04 - Zigbee技術(shù)
zigbee技術(shù)_zigbee協(xié)議

評論