引用-ZIGBEE-ZSTACK网络配置相关问题
下面是以道友問的問題,這里簡單做分析,僅供交流學習用,有什么不對之處還請各位大蝦指正。鄙人郵箱為:peterpanjy@163.com. 歡迎交流!!
1: 最主要的就是路由問題。我用06協議棧自帶的例子程序sampleapp修改了一下,另協調器以網絡地址的形式向終端發送數據,中間加入路由轉發數據。拿 到室外試驗了一下,結果路由根本不起作用。
zigbee06的路由程序應該怎么寫? 需要什么設置么?
2:在sampleapp這個程 序中,我把終端的程序修改為之接收信號,其他事件一概不作處理,組網后用協議分析儀察看了一下,發現終端每一秒都在向協調器發送一個命令信號,協調器也會 作出應答,這
些例子程序都是協調器發送數據到路由的,請問終端要怎么設置?
3我想做的很簡單:就是用協 調器用網絡地址向終端發送數據,終端只負責接收,網絡中存在路由器,起信息轉發作用。覺得是一個很簡單的程序,但是就是弄不出來,請指教以下具體應該怎么 弄?謝謝!
4:zigbee06要怎么設置網絡形式?星狀網狀樹形這些網絡要怎么才能建立?需要哪些設置呢?
5:06里面,網絡地址是怎 么分配的?還是用的04的分布式地址分配算法么?還是別的算法,有沒有詳細的解釋說明呢?在協議棧 里,MAX_DEPTH,MAX_CHILDREN,MAX_ROUTER都是在那里設置的?我只在
nwk.globals.h中找到了
#if ( STACK_PROFILE_ID == HOME_CONTROLS )
??? #define MAX_NODE_DEPTH????? 5
??? #define NWK_MODE??????????? NWK_MODE_MESH
這一個的定義。還有byte CskipRtrs[MAX_NODE_DEPTH+1] = {6,6,6,6,6,0};這一句是什么意思呢,死活看不明白了...
下面針對上面問題簡要分析下:
1、06協議的路由算法已經打包成庫,是不能修改的。
C:\Texas Instruments\ZStack-1.4.3-1.2.1\Projects\zstack\Libraries\TI2430DB\bin這里應 該有您需要的庫文件,要是可以您可以反編譯看看。
至于您拿出去不能演示,那是因為您沒有弄明白收到數據的現象。
希望下面的分析對您理解有 幫助!
2、至于每秒發信息,個人覺得可能不是每秒,大概是發送的周期信息。因為
在網絡成功建立或者成功加入后,設備都在發送周期信息,見 程序如下:
case ZDO_STATE_CHANGE:
????????? SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
????????? if ( (SampleApp_NwkState == DEV_ZB_COORD)
????????????? || (SampleApp_NwkState == DEV_ROUTER)
????????????? || (SampleApp_NwkState == DEV_END_DEVICE) )
????????? {
??????????? // Start sending the periodic message in a regular interval.
??????????? osal_start_timerEx( SampleApp_TaskID,
????????????????????????????? SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
????????????????????????????? SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
????????? }
可以看到網絡狀態 一旦改變(建立或者加入網絡),就調用了定時觸發事件:
SAMPLEAPP_SEND_PERIODIC_MSG_EVT
而 該事件為:
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
? {
??? // Send the periodic message
??? SampleApp_SendPeriodicMessage();
??? // Setup to send message again in normal period (+ a little jitter)
??? osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
??????? (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );
??? // return unprocessed events
??? return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
? }
這里調用了發送數據函數 SampleApp_SendPeriodicMessage(),而之后又調用了定時觸發事件 SAMPLEAPP_SEND_PERIODIC_MSG_EVT,所以該事件不停的在觸發并發送數據。
void SampleApp_SendPeriodicMessage( void )
{
? if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
?????????????????????? SAMPLEAPP_PERIODIC_CLUSTERID,
?????????????????????? 1,
?????????????????????? (uint8*)&SampleAppPeriodicCounter,
?????????????????????? &SampleApp_TransID,
?????????????????????? AF_DISCV_ROUTE,
?????????????????????? AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
? {
? }
? else
? {
??? // Error occurred in request to send.
? }
}
如 果想知道發送的是什么數據并了解發送到什么地方,建議可以分析下AF_DataRequest()函數里各個參數的含義。
3、其實您這個應用的卻 不難,主要是您對ZSTACK還不怎么熟悉,不知道怎么下手。其實就是現在ZSTACK中隨便哪個例子都可以滿足您的要求。就拿SAMPLE來說,都可以 滿足,就2項中提到的周期發送信
息,在發送函數里有個參數為AF_DISCV_ROUTE,就是這里設置為允許去找路由器路由信息,這個參數為2,則直接啟動AODV查找路由,為 1時,先查路由表,找不著路由則啟動路由查找,為0時,不用AODV
,直接走樹路由!而參數AF_DEFAULT_RADIUS指明了路由深度為:#define AF_DEFAULT_RADIUS????????????????? DEF_NWK_RADIUS
#define DEF_NWK_RADIUS 10
路由深度為10,也就是只能經過10次路由,每路由一次,該數據減1,有興趣可以用協議分析儀看一下。
4、 ZSTACK網絡結構設定
找到nwk_globals.h文件
// 網絡模式控制
#define NWK_MODE_STAR???????? 0
#define NWK_MODE_TREE???????? 1
#define NWK_MODE_MESH???????? 2
// 網絡加密控制
#define SECURITY_RESIDENTIAL? 0
#define SECURITY_COMMERCIAL?? 1
// 協議棧參數設置
#define NETWORK_SPECIFIC????? 0
#define HOME_CONTROLS???????? 1
#define ZIGBEEPRO_PROFILE???? 2
#define GENERIC_STAR????????? 3
#define GENERIC_TREE????????? 4
#define STACK_PROFILE_ID????? XXXXXXXXXX
這里定義協議棧模式的,是很重要的,直接涉及到下面的 定義。這里的值就為上面定義的協議棧參數色繪制那5個,當然用戶還可以繼續定義的!
當XXXXXXXXXX= HOME_CONTROLS時,程序如下:
#if ( STACK_PROFILE_ID == HOME_CONTROLS )
??? #define MAX_NODE_DEPTH????? 5
??? #define NWK_MODE??????????? NWK_MODE_MESH
??? #define SECURITY_MODE?????? SECURITY_RESIDENTIAL
#if?? ( SECURE != 0? )
??? #define USE_NWK_SECURITY??? 1?? // true or false
??? #define SECURITY_LEVEL????? 5
#else
??? #define USE_NWK_SECURITY??? 0?? // true or false
??? #define SECURITY_LEVEL????? 0
#endif
可以看出此時,網絡結構為網狀網絡
當XXXXXXXXXX= GENERIC_STAR時:
#elif ( STACK_PROFILE_ID == GENERIC_STAR )
??? #define MAX_NODE_DEPTH????? 5
??? #define NWK_MODE??????????? NWK_MODE_STAR
??? #define SECURITY_MODE?????? SECURITY_RESIDENTIAL
#if?? ( SECURE != 0? )
??? #define USE_NWK_SECURITY??? 1?? // true or false
??? #define SECURITY_LEVEL????? 5
#else
??? #define USE_NWK_SECURITY??? 0?? // true or false
??? #define SECURITY_LEVEL????? 0
#endif
可以看出此時,網絡結構為星狀網絡
當XXXXXXXXXX= NETWORK_SPECIFIC 時:
#elif ( STACK_PROFILE_ID == NETWORK_SPECIFIC )
// define your own stack profile settings
??? #define MAX_NODE_DEPTH????????? 5
??? #define NWK_MODE??????????? NWK_MODE_MESH
??? #define SECURITY_MODE?????? SECURITY_RESIDENTIAL
#if?? ( SECURE != 0? )
??? #define USE_NWK_SECURITY??? 1?? // true or false
??? #define SECURITY_LEVEL????? 5
#else
??? #define USE_NWK_SECURITY??? 0?? // true or false
??? #define SECURITY_LEVEL????? 0
#endif
#endif
當然這些參數用戶都是可以自己設定的,當然 也不能亂設定哈!
5、ZSTACK網絡參數設定
// 網絡中最多設備個數
#if !defined( NWK_MAX_DEVICE_LIST )
? #define NWK_MAX_DEVICE_LIST???? 20? // 目前設置為20個
#endif
路由器個數和終端節點個數 設定,通過wk_globals.c 中的下面代碼來實現。
??? byte CskipRtrs[MAX_NODE_DEPTH+1] = {6,6,6,6,6,0};
??? byte CskipChldrn[MAX_NODE_DEPTH+1] = {20,20,20,20,20,0};
在這里 CskipRtrs[MAX_NODE_DEPTH+1] = {5,0};是通過一個數組的方式來定義的,元素0 表示在路由0 級的時候最多掛載的路由器節點個數,元素1,表示在路由1 級中最多掛載的的路由器節點個數。這
里我們定義了在0 級(協調器直接通訊)最多掛載5 個路由器,第一級不掛載。
CskipChldrn[MAX_NODE_DEPTH+1] = {50,0};同樣是通過一個數組的方式來定義的,元素0 表示在路由0 級的時候最多掛載的終端節點個數,元素1,表示在路由1 級中最多掛載的的終端節點個數。這里
我們定義了在0 級(協調器直接通訊)最多掛載50 個終端,第一級不掛載。如下所示。
#if defined ( RTR_NWK )
? // change this if using a different stack profile...
? // Cskip array
? uint16 *Cskip;
? #if ( STACK_PROFILE_ID == HOME_CONTROLS )
??? byte CskipRtrs[MAX_NODE_DEPTH+1] = {6,6,6,6,6,0};
??? byte CskipChldrn[MAX_NODE_DEPTH+1] = {20,20,20,20,20,0};
? #elif ( STACK_PROFILE_ID == GENERIC_STAR )
??? byte CskipRtrs[MAX_NODE_DEPTH+1] = {5,5,5,5,5,0};
??? byte CskipChldrn[MAX_NODE_DEPTH+1] = {5,5,5,5,5,0};
? #elif ( STACK_PROFILE_ID == NETWORK_SPECIFIC )
??? byte CskipRtrs[MAX_NODE_DEPTH+1] = {5,5,5,5,5,0};
??? byte CskipChldrn[MAX_NODE_DEPTH+1] = {5,5,5,5,5,0};
? #endif // STACK_PROFILE_ID
#endif? // RTR_NWK
那么這里的 CskipRtrs[MAX_NODE_DEPTH+1] = {6,6,6,6,6,0};意思就是允許每級R或C最多能加入6各路由器。而byte CskipChldrn[MAX_NODE_DEPTH+1] = {20,20,20,20,20,0};表示每個路由器或協調器最
多掛在20個子節點,為什么有6維呢,那是因為參數MAX_NODE_DEPTH為5嘛,我想這個不用我多解釋了哈
轉載于:https://www.cnblogs.com/victoire/archive/2010/02/01/1661020.html
總結
以上是生活随笔為你收集整理的引用-ZIGBEE-ZSTACK网络配置相关问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优酷有的片子土豆是否也有?土豆有的片子优
- 下一篇: MSF连环攻击实验