zigbee入門 z-stack學習入門
(本帖子針對TI完整協議棧)
最近群內總是有新手不停地問如何入門的方法。今晚有點兒閒暇,就寫一點兒自己的想法,希望能有點兒借鑑。
假設要學這個的同學們具備了基本的硬體基礎和C語言基礎,如果這兩點不具備,我個人認為還是先找普通的51啊,Atmega啊,MSP430這樣的微控制器先玩玩,起碼要對暫存器啊,指令啊這些有認識,還要對定時器啊,串列埠啊,GPIO啊,中斷啊,flash啊,RAM啊這些有清晰的認識才行,否則很難和大家溝通了。在C語言方面,起碼要具備能為51這些處理器寫應用程式,知道如何初始化硬體,如果寫中斷ISR,如何去弄GPIO這些,最好還要寫過起碼千行左右的微控制器應用程式吧,要不然想弄明白協議棧中幾百個檔案之間的關係,並且能夠按照需要改動相關定義和函式是有困難的。
好的,假設大家有了我上面的基礎,並且自我感覺還比較良好的話,那麼入門zigbee應該按照下面步驟進行:
先科普一下zigbee,先搞清楚zigbee網路中的一些名詞
zigbee都有哪些網路拓撲結構?星形網、網狀網、樹形網。
什麼是協調器coordinator? 什麼是路由器router? 什麼是終端裝置end device?
什麼是繫結?什麼是裝置發現?什麼是。。。。。
關於這個入門的文件呢,我個人認為還是看論壇學習資料共享區的
葵花寶典--Newnes.ZigBee.Wireless.Networks.and.Transceivers.Sep.2008.eBook-DDU
http://www.feibit.com/bbs/viewth ... &extra=page%3D1
不過新手同志們要注意的是,這本書前面幾章主要是在講zigbee入門的事情,後面就開始講Transceivers,也就是無線收發器和天線哪些東西,新手目前可以無視之,不看就行了,看完了如果你基礎不好,只能讓你更迷茫,這就跟練習乾坤大挪移心法一樣,沒有九陽神功,就別修煉第四層以後的,否者就要像陽頂天那樣走火入魔了。哈哈。
相信耐著性子看完幾章之後,同學們對zigbee的大致情況有了初步認識,可能想要摩拳擦掌搞程式碼了。這個時候,是你應該下手買一套開發板的時候了,當然了,如果你功底可以,也可以自己做,不過我相信能自己做的同學也不需要看我這個文件了。所以呢,還是買一套吧,買什麼樣的?我的建議是:
一定要有一個模擬器,最好3以上個帶射頻模組的開發板(有的開發板是射頻模組和外擴電路在一起,有的是底板和RF板分離的,具體那種無所謂)。但是要注意,最好還是買有幾個按鈕和LED以及一個串列埠介面的板子,否則會讓你進一步的試驗程式帶來問題。為什麼要3個呢?因為有3個,你將來才有機會做路由器的實驗,呵呵。
好了,開發板有了,還需要什麼?你需要開發環境,2430處理器用iar 7.30B,2530的2.3.1-1.4.0版本協議棧用iar7.51,最新的TI協議棧2.4.0-1.4.0貌似需要用7.60版本了。新手同學們一定切記,TI的zstack協議棧是比較緊密地捆綁iar的,用低版本編譯高版本協議棧肯定不行,反之也不一定行,所以一定要按照推薦的編譯器來進行。還有的同學習慣了keil之類軟體,妄圖不用iar,把zstack弄到非iar編譯器下進行。如果有這個想法,我勸你儘早打消念頭,否則會死的很慘。
安裝了編譯器之後,你還需要協議棧啊,協議棧哪裡有?TI網站有,不過TI這個公司吧,新版本出來老版本就不能下載了,相信大家都會上網,自己想辦法搞吧,還是很容易的。並且如果你買了開發板,對應版本的iar和協議棧都應該有了。安裝協議棧,預設路徑就OK。
準備工作都OK以後,按照你板子光碟例子開啟來一個看看吧。嘿嘿,到這裡,有的同學買的板子,尤其是那種很小的,根本帶的就不是完整協議棧(我第一個板子就是這樣,我估計賣板子的當時也沒整明白,可是我當時更不明白),那你就開啟安裝的完整協議棧的一個例子吧。。。。。
我相信開啟之後新手同學們立馬兒會暈掉。。。。。,這麼多資料夾,這麼多檔案,main在哪裡?相互之間什麼關係?
行了,開啟就打開了,別想著現在就去改程式或者做實驗(做實驗的話,有的開發板帶的例子比較好,按照說明一步一步操作down到板子上就能有效果,不過你也只能是照葫蘆畫葫蘆,根本就啥也不知道呢)。這個時候,你需要到論壇原創區或網上找找關於協議棧結構的文章和帖子,先大體瞭解每一個資料夾是做什麼的,你也可以試著在iar中開啟資料夾裡面的檔案先過過眼癮。這段時間,你可能要花十天半月地去讀論壇原創區帖子,一邊讀一邊照著帖子,開啟iar,去看看帖子寫的那些東西的程式程式碼,先混一個臉熟。看完那麼多帖子了,我想你對協議棧那些個檔案大體上知道個皮毛了,可以找找基本實驗的帖子做實驗了,試著改動一下試驗傳送的資料內容,試著讓你的幾個節點都能和協調器通訊。。。。
如果上面這件事兒你做的挺好,會信心大增的,不過別高興太早了,這個時候其實連入門都算不上。我沒有打擊你,真的不能算入門(我現在都懷疑我還沒入門,因為一直只是再看資料,很少動手做)。
在這個階段,會有的同學試圖去演示一下TI的協議棧例子,結果發現TI的板子和你的板子根本就不一樣(outman的板子儘量靠近TI,除了液晶不太一樣,其餘的基本一致,至於別家的板子,可能就差別大了,不過也可能和TI完全一樣,那麼恭喜你,買到TI正版了,呵呵),down例子程式到板子上,連一個燈都不亮,呵呵,改改程式吧?咋改?這是一個問題。到這裡,你還是要看論壇帖子!等你能改LED了,又是一個進步。但是想用協議棧,還是有很長的路。這時候,碰到問題要多看帖子,尤其是ti協議棧安裝後的documents資料夾裡面的pdf文件,會幫你解決很多問題,有時間多看看那些文件,同時比對程式程式碼,加深認識。
隨著學習的深入,我想你可以改LED了,改KEY了,改UART了,也可以改配置了,改編譯選項了。甚至於可以改協議棧app層程式碼實現自己的一點兒小功能了。到這個時候,我認為可以基本算是入門了吧。
之後可能你還有自己做板子的衝動,畢竟買的開發板是無法滿足實際要求的。那麼這個時候,你就要找些原理圖看看(板圖很難找,呵呵。尤其是天線部分,你可以去TI網站下載一些關於天線的資料來看。如果硬體基礎好,這個基本技能是應該有的。
在之後,做了自己的板子,能自己修改協議棧相關程式碼,能實現自己的難度不大的網路,實現資料交換,入門啦。以後的事情,不用我說了,你比我明白了。
另外,在理解協議棧工作機制的過程中,另外一本書:
Zigbee wirless networking(Drew Gislason)
http://www.feibit.com/bbs/viewth ... &extra=page%3D1
這本書是寫的freescale處理器的,但是zigbee是相通的,很值得一看,作者寫的很好,很清楚。
好了,這些都幹完了,你也該入門了吧?如果你還想提高,這個時候就要去研讀協議棧規範了,數百頁吧。新同學千萬別上來就看協議棧規範,我保證你看不懂,並且能看吐了。
行了,寫這麼多吧,收工了。
補充一下:如果你C基礎不好(如果你說你考過了大學計算機二級C,但是沒具體編過硬體程式,我認為你C基礎幾乎是0),硬體基礎也不好(如果你說你學過MCS51微控制器那門課,但是沒有實際做過應用,開發過軟硬體,我認為你微控制器基礎也是0),那麼最好先別弄協議棧,先把微控制器玩熟悉一種再來吧。
再有就是總有人在群裡要中文資料,毫不客氣的說,如果你不能看英文資料,你不適合學習zigbee。
在這裡鄙視一下國內大多數翻譯TI文件就出書的寫手們,對zigbee毫無認識,就敢出來寫zigbee的書,寫出來的東西狗屁不通,完全就是害人的。所以,還是老老實實看英文文件,那才是一個硬體工程師應該具備的基本技能,什麼都想找中文的,等神馬都是中文的了,你學這個就是浮雲了。
我發現最近群裡很多人已經可以算是大致入門了,能夠在原有例子的基礎上進行一些簡單工作,實現資料傳輸。但是我也發現很多人開始把精力投入到鑽研協議棧程式碼細節上面去了,實際上這種學習方式是有問題的。第一:如果從應用的角度看,協議棧的一些實現細節是沒有必要鑽研的,這就好比是現在的PC機,已經有了Windows系統了,我們在這個系統之上實現自己應用程式的時候其實並不需要對Windows內部實現細節過多地關注,只要能夠自由地在Windows下開發應用程式(其實就是呼叫大量的API函式)就可以了;第二:如果想從協議棧本身入手去做一些深入的工作,Zstack是不適合的,因為它不是完全開源,真想在路由演算法、加密演算法等方面做工作的話,目前TinyOS這樣的開源協議棧才是首選。所以,進一步學習的重點應該是:在什麼時間什麼地點呼叫什麼函式的問題!
那麼如何來提高這方面的技能呢?
1、瀏覽ZDP和ZDO相關程式碼,熟悉一下都有什麼函式,這兩個部分都做了什麼,學習的過程中千萬不要去鑽研程式碼實現的細節,只要瞭解其流程以及都作了什麼就可以了,否則你一定會迷失在那成千上萬行的程式碼之中而不能自拔。ZDP和ZDO的實現檔案裡面有大量的函式在以後具體應用中可以去呼叫。
2、典型例子中的ZDO訊息使用其實只有那麼幾個例子,比如:ZDO_RegisterForZDOMsg(TaskID,End_Device_Bind_rsp)這樣的,這是講底層的一些事件訊息引入到應用層的註冊方法。在深入應用的時候那麼幾個典型的訊息註冊是不夠用的,比如我在一個應用中就註冊了以下:
ZDO_RegisterForZDOMsg( TaskID, End_Device_Bind_rsp ); // 我自己解析End_Device_Bind_rsp
ZDO_RegisterForZDOMsg( TaskID, Match_Desc_rsp ); //我自己解析Match_Desc_rsp
ZDO_RegisterForZDOMsg( TaskID, Device_annce); //我自己解析Device_annce
ZDO_RegisterForZDOMsg( TaskID, Active_EP_rsp); //我自己解析Active_EP_rsp
ZDO_RegisterForZDOMsg( TaskID, Simple_Desc_rsp); //我自己解析Simple_Desc_rsp
ZDO_RegisterForZDOMsg( TaskID, NWK_addr_rsp); //我自己解析NWK_addr_rsp
在具體應用中,你會根據不同的網路需求去呼叫很多協議棧的設定好的req和處理rsp訊息,那麼協議棧都有那些req和rsp是你進一步學習所應該深入認識的。
3、在自己使用系統的req和rsp的時候,如果你不知道該如何處理,你最好去看看MT是如何實現的,在MT功能模組中,對協議棧的絕大多數req和rsp都有呼叫和實現的例子可以參考,雖然我們在自己的應用中很少回去使用MT,但是Mt 的實現程式碼卻是最好的參考資料。
上面幾點是我目前能夠想到的一些事情,以後有想法再補充吧!
最後我舉個例子:比如你想實現節點入網後自動報告自己的長短地址,然後主控節點處理節點的報告,並且向這個節點要求其發回存在於其上的EP資訊,我們應該這樣做:
1、在新節點的ZDO_STATE_CHANGE訊息處理函式中呼叫:
ZDP_DeviceAnnce( NLME_GetShortAddr(), NLME_GetExtAddr(), \
ZDO_Config_Node_Descriptor.CapabilityFlags, 0 );
這個函式會自動以廣播方式報告自己的短地址和長地址,其餘在網的節點都可以收到;你也可以採用按鍵策略,新節點入網後通過按鍵觸發來報告自己的長短地址:
2、在主控節點的初始化函式中新增:
ZDO_RegisterForZDOMsg( TaskID, Device_annce); //我自己解析Device_annce
這樣,當新入網節點Annce的時候,主控節點收到這個訊息,然後通知給你的任務(TaskID),你的任務則需要在case ZDO_CB_MSG:處理函式中新增處理這個annce的程式碼,如:
case Device_annce: //device annouce process.
ProcessDeviceAnnce(inMsg);
break;
在自己實現的ProcessDeviceAnnce函式中,你可以提取出新來節點的長短地址。。。。。
3、有了新節點的長短地址,其實什麼都可以做了,我現在利用新節點的長短地址來請求其返回它的EP資訊:
在適當的地方呼叫ZDP_ActiveEPReq( &zDestAddr, shortAddr, SECURITY_FLAG);
這是一個直接面向目標短地址的單播req,目標節點收到這個req之後,會自動處理的(程式碼協議棧已經實現了),Zstack協議棧實際上實現了絕大多數響應req的函式,然後返回一個rsp,這一部分其實你不用管,也就是說目標節點方面你一行程式碼都不用寫,存在其上的所有EP資訊就會被返回到主控節點;但是Zstack沒有實現絕大多數rsp處理函式,因為rsp一般來將使用者會有不同的想法,所以他也沒辦法實現;
4、主控節點如果想處理返回的活動EP資訊(比如EP號),那麼需要在任務初始化的時候註冊一下由任務處理這個返回訊息:
ZDO_RegisterForZDOMsg( TaskID, Active_EP_rsp);
然後在ZDO_CB_MSG處理函式中新增自己的處理程式碼:
case Active_EP_rsp://active ep response process.
ProcessActiveEpRsp(inMsg);
break;
自己編寫的ProcessActiveEpRsp函式就可以提取到目標節點上所有EP資訊,比如我自己實現的一段程式碼就是這樣的(註釋解釋):
static void ProcessActiveEpRsp(zdoIncomingMsg_t *inMsg)
{
uint8 *pData;
uint8 i;
ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg ); //呼叫ZDO_ParseEPListRsp函式(這個函式協議棧已經實現了,什麼時間什麼地點調
//用什麼函式問題的具體體現,即:在rsp處理的時候呼叫這個函式,不知道你理解沒?
//下面我處理經過Parse後的訊息:
uint8 cnt = pRsp->cnt;
pData = (uint8 *)osal_mem_alloc(6 + cnt);
//here, 3 is one for status, two for short address.one is cnt
if(pData)
{
pData[0] = LO_UINT16(pRsp->nwkAddr);
pData[1] = HI_UINT16(pRsp->nwkAddr);
pData[2] = pRsp->status;
pData[3] = pData[0];
pData[4] = pData[1];
pData[5] = cnt;
for(i=0;i < cnt;i++)
pData[6 + i] = pRsp->epList;
osal_mem_free(pRsp);
Uart_SendBack(pData,(6 + cnt)); //串列埠方式把獲得的資訊發給PC,你可以存起來,也可以進一步做別的;
osal_mem_free(pData);
}
HalLedSet(HAL_LED_GREEN,HAL_LED_MODE_FLASH); //用閃燈方式表示收到了訊息。。。
}
//函式裡面這段程式碼我實現的依據是什麼?這你就的去找找看協議棧是如何處理這個req的了,看看ZDP_ActiveEPReq函式的協議棧實現,
//#define ZDP_ActiveEPReq( dstAddr, NWKAddrOfInterest, SecurityEnable ) \
// ZDP_NWKAddrOfInterestReq( dstAddr, \
// NWKAddrOfInterest, Active_EP_req, SecurityEnable )
//看到這裡就夠了,我們知道這個函式呼叫會發一個Active_EP_req給目標節點,至於怎麼發出去的,沒必要研究了。
//再去查檢視協議棧是如何處理Active_EP_req的,找到了:
//{ Active_EP_req, ZDO_ProcessActiveEPReq },
//這個函式的具體實現(協議棧中的)
/*
void ZDO_ProcessActiveEPReq( zdoIncomingMsg_t *inMsg )
{
byte cnt = 0;
uint16 aoi;
byte stat = ZDP_SUCCESS;
aoi = BUILD_UINT16( inMsg->asdu[0], inMsg->asdu[1] );
if ( aoi == NLME_GetShortAddr() )
{
cnt = afNumEndPoints() - 1; // -1 for ZDO endpoint descriptor
afEndPoints( (uint8 *)ZDOBuildBuf, true );
}
else
{
stat = ZDP_INVALID_REQTYPE;
}
ZDP_ActiveEPRsp( inMsg->TransSeq, &(inMsg->srcAddr), stat,
aoi, cnt, (uint8 *)ZDOBuildBuf, inMsg->SecurityUse );
*/
//這個你要看懂了,實際上就是向你報告有幾個活動EP,每個EP的號是多少。。。。
例子大致說完了,如果不知道我在說什麼,也不知道我說的這些函式怎麼找的同學,那還得去好好入門入門,這篇文件不適合你!
如果能大致領會意思,我想你就體會到了我們的學習重點在哪裡,再說一遍:在什麼時間、什麼地點呼叫什麼函式!而不是研究協議棧到底怎麼實現的。
相關推薦
zigbee入門 z-stack學習入門
這個帖子我不知道放在原創區是不是合適。如果不合適,請版主移到別處去。(本帖子針對TI完整協議棧)最近群內總是有新手不停地問如何入門的方法。今晚有點兒閒暇,就寫一點兒自己的想法,希望能有點兒借鑑。假設要學這個的同學們具備了基本的硬體基礎和C語言基礎,如果這兩點不具備,我個人認
linux學習入門標準教程(2)
linux標準教程Linux系統篇2.1 Linux系統管理經過前兩章的學習,咱們現已可以獨立裝置Linux體系,現已把握了Linux學習的竅門,那接下來,咱們將體系的來了解Linux體系各目錄、權限及常用命令的運用。2.1. 1 Linux目錄初識通過前面的學習,我們已經能夠獨立安裝完一個linux
『Python』MachineLearning機器學習入門_效率對比
cnblogs 新的 arange 學習 nump 部分 運行 orm blog 效率對比: 老生常談了,不過這次用了個新的模塊, 運行時間測試模塊timeti: 1 import timeit 2 3 normal = timeit.timeit(‘sum(x*
『Python』MachineLearning機器學習入門_極小的機器學習應用
highlight 保存 數值 out 有意思 port del ear 解方程 一個小知識: 有意思的是,scipy囊括了numpy的命名空間,也就是說所有np.func都可以通過sp.func等價調用。 簡介: 本部分對一個互聯網公司的流量進行擬合處理,學習最基本的機器
深度學習入門1
ont gin 語音識別 告訴 min 重要 orf 模型 獲得 發布這個系列,一來是為了總結自己的學習,二來也是希望給深度學習初學者一些入門的指導。好廢話不多說了,我們直接進入主題,這一節先說一下,深度學習發展歷程。 1958,感知器(相當於生物的神經元) 1969,M
機器學習入門 - 1. 介紹與決策樹(decision tree)
recursion machine learning programmming 機器學習(Machine Learning) 介紹與決策樹(Decision Tree)機器學習入門系列 是 個人學習過程中的一些記錄與心得。其主要以要點形式呈現,簡潔明了。1.什麽是機器學習?一個比較概括的理解是:
JavaWeb學習入門之——圖書館管理系統開發(Hibernate學習1)
pass ica void 技術分享 gets 學習 images 創建 driver 最近看了看JavaWeb的書籍,才感覺到大二時候學的JavaWeb才僅僅只是個入門。最尷尬的當初還沒咋學一直在看.NET,現在看起來JavaWeb,各種框架各種頭疼啊。看了幾個例子之後覺
機器學習入門:線性回歸及梯度下降
想要 oom 考試 erl text local oca 希望 觀察 機器學習入門:線性回歸及梯度下降 本文會講到: (1)線性回歸的定義 (2)單變量線性回歸 (3)cost function:評價線性回歸是否擬合訓練集的方法 (4)梯度下
機器學習--入門答疑
類別 邏輯 啤酒 gre 是否 知識結構 中間 場景 討論 剛接觸機器學習這一個月我都做了什麽? 這一個月,從對機器學習充滿好奇與畏懼,到對各種算法稍有理解以及圍繞推薦場景的編碼實踐,算是對機器學習有了一個入門的體驗。但是中間也踩過不少坑,比如啃過線性代數的教材、
機器學習入門之四:機器學習的方法-神經網絡(轉載)
轉載 bsp 圖像 src nbsp 加速 數值 str 我們 轉自 飛鳥各投林 神經網絡 神經網絡(也稱之為人工神經網絡,ANN)算法是80年代機器學習界非常流行的算法,不過在90年代中途衰落。現在,攜著“深度學習”之勢,神
機器學習入門之決策樹算法
所有 最大的 id3 次數 要去 決策樹算法 4.5 獲取 ddl 1、什麽是決策樹(Decision Tree) 決策樹是一個類似於流程圖的樹結構,其中每一個樹節點表示一個屬性上的測試,每一個分支代表一個屬性的輸出,每一個樹葉節點代 表一個類或者類的分布
機器學習入門之python實現圖片簡單分類
numbers org 路徑 圖片分類 jpg animal 入門 res windows 小任務:實現圖片分類 1.圖片素材 python批量壓縮jpg圖片: PIL庫 resize http://blog.csdn.net/u012234115/article/
Unity Shader入門精要學習筆記 - 第4章 學習 Shader 所需的數學基礎
旋轉矩陣 即使 模擬 能夠 一點 空間使用 虛擬 地板 金字塔 摘錄自 馮樂樂的《Unity Shader入門精要》 笛卡爾坐標系 1)二維笛卡爾坐標系 在遊戲制作中,我們使用的數學絕大部分都是計算位置、距離、角度等變量。而這些計算大部分都是在笛卡爾坐標系下進行的。 一個二
Unity Shader入門精要學習筆記 - 第3章 Unity Shader 基礎
但是 detail spa net 表示 part 文件 人的 text 來源作者:candycat http://blog.csdn.net/candycat1992/article/ 概述 總體來說,在Unity中我們需要配合使用材質和Unity Shader才能達
Unity Shader入門精要學習筆記 - 第11章 讓畫面動起來
位置 視覺效果 想要 朝向 系列 圖像 顏色 offset star 轉自 馮樂樂的 《Unity Shader入門精要》 Unity Shader 中的內置變量 動畫效果往往都是把時間添加到一些變量的計算中,以便在時間變化時畫面也可以隨之變化。Unity Shader 提
Unity Shader入門精要學習筆記 - 第16章 Unity中的渲染優化技術
也會 檢測 特點 著色器 版本 切換 代碼優化 學習 順序 轉自馮樂樂的 《Unity Shader 入門精要》 移動平臺的特點 為了盡可能一處那些隱藏的表面,減少overdraw(即一個像素被繪制多次),PowerVR芯片(通常用於ios設備和某些Android設備)使用
Unity Shader入門精要學習筆記 - 第14章非真實感渲染
只需要 遮擋 本質 lar 屏幕 準備 dot smo try 轉載自 馮樂樂的 《Unity Shader 入門精要》 盡管遊戲渲染一般都是以照相寫實主義作為主要目標,但也有許多遊戲使用了非真實感渲染(NPR)的方法來渲染遊戲畫面。非真實感渲染的一個主要目標是,使用一些渲
Unity Shader入門精要學習筆記 - 第10章 高級紋理
unp string math 計算 圖像繪制 兩種方法 內存 對象 交叉 轉載自 馮樂樂的 《Unity Shader入門精要》 立方體紋理 在圖形學中,立方體紋理是環境映射的一種實現方法。環境映射可以模擬物體周圍的環境,而使用了環境映射的物體可以看起來像鍍了層金屬一樣反
前端學習入門-angular2-Typescript基本語法(二)
moved subst 一個 super clas color 模式 值類型 tin 接口 接口的創建 interface labelValue{ label:string; } //創建函數對接口進行調用 labelObj是