不需要自己在花時間去撰寫
只是需要稍微去修改才能使用
接下來我開始說ZDP的使用方式
ZDP的code都放在
C:\Texas Instruments\ZStack-1.4.3\Components\stack\zdo\ZDProfile.c裡面
接下來就是來看裡面有什麼東西
裡面已經寫好任何一個zigbee接受到指令後所需要得反應
例如在Z-stack的API手冊裡也到ZDP_NwkAddrReq()的函式
它是用來得知某個已知的IEEE address位址想要知道
它在zigbee的short address
在這個code裡面已經寫好反應的方式
也就是說不必寫傳送和回覆的程式碼
都已經寫好給你了
但是它沒寫好的就是我接收到要做什麼事
因為他已經將傳送的資料交給zdo的程序來處理
沒辦法交給使用者自訂的程序來處理
所以需要修改一部分來交給自訂的程序處理
所以要找到
CONST zdpMsgProcItem_t zdpMsgProcs[] =這是zdp接受到訊息的指令所對應到的函式
裡面並沒有NWK_addr_rsp
也就是回應過來所對應的函式
所以在
{0xFFFF, NULL}前面加上
{ NWK_addr_rsp, ProcessAddrRsq },ProcessAddrRsq可以自己命名
不過最好寫個前置判斷
因為不是每個device都需要用到
所以我都寫成這樣
#if defined (addr_rsp) { NWK_addr_rsp, ProcessAddrRsq }, #endif這樣編譯的時候只會編譯有define addr_rsp的device
然後還要在上面加上
#if defined (addr_rsp) extern void ProcessAddrRsq( zdoIncomingMsg_t *inMsg ); #endif因為我想要把它寫在自訂程序同一個地方
接下來就到自訂程序的地方寫code
也就是sampleapp.c
當然要宣告
void ProcessAddrRsq( zdoIncomingMsg_t *inMsg );然後開始寫處理的方式
不過要先知道他傳過來的格式是什麼
先找到
void zdpProcessAddrReq( zdoIncomingMsg_t *inMsg )的函式
它是用來回覆有關address的函數
在裡面的程式看來
在資料的第2個位子就是IEEE address
佔8個位子
也就是inMsg->asdu+1到inMsg->asdu+8
接下來就是short address
佔2個位子
也就是inMsg->asdu+9到inMsg->asdu+10
當然也可以由接收到的資料裡面找來源位子
inMsg->srcAddr.addr.shortAddr這樣就可以設計成下面這樣子
void ProcessAddrRsq( zdoIncomingMsg_t *inMsg ) { if (osal_ExtAddrEqual(end_addr.extAddr, inMsg->asdu+1)) { end_addr.shortAddr = inMsg->srcAddr.addr.shortAddr; } }osal_ExtAddrEqual是內建函數用來比較IEEE address是否一樣
接下來就是如何呼叫ZDP_NwkAddrReq()的函式
在ZDP_NwkAddrReq的函式外圍有前置判斷
所以要先設定#define ZDO_NWKADDR_REQUEST
接下來就可以直接用了
ZDP_NwkAddrReq(end_addr.extAddr, ZDP_ADDR_REQTYPE_SINGLE, 0, 0);第一個參數是IEEE address
第二個參數是要如何回傳
ZDP_ADDR_REQTYPE_SINGLE//只回傳需求端
ZDP_ADDR_REQTYPE_EXTENDED//用廣播的方式回傳
第三個參數是startindex
第四個參數是securitysuite
其他的也就照這樣寫就可以了
4 意見:
抱歉..
我看不懂最後要怎麼得到short address
可以再說詳細一點嗎??
我是用serialApp改的
在serialapp.c最底下
void ProcessAddrRsq( zdoIncomingMsg_t *inMsg )
{
if(osal_ExtAddrEqual(SerialApp_TxAddr.addr.extAddr, inMsg->asdu+1))
{
SerialApp_TxAddr.addr.shortAddr = inMsg->srcAddr.addr.shortAddr;
}
}
然後
uint8 tmp_dst_extAddr[8] = {0x7d, 0x17, 0x00, 0x01, 0x00, 0x4B, 0x12, 0x00};
* sho_addr = ZDP_NwkAddrReq(tmp_dst_extAddr, ZDP_ADDR_REQTYPE_SINGLE, 0, 0);
還是無法得到short address..
因為使用ZDP_NwkAddrReq不會讓你得到short address
但是只要是device有接收到
在他的OS裡的ZDO層會接收到
所以要改一下他們的ZDO
會比較快
也就是改ZDProfile.c
想請問為何我把發送設定每60秒發送一次
它建立網路至開始發送第一筆數據至少都要3~4分鐘
而設定每5秒傳送至網路建立後發送第一筆數據 只要10秒
哪裡不對 設錯了?!
// Send Message Timeout
#define SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT 60000 // Every 60 seconds
你可能設錯了
因為在OS的設定
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_INFO_EVT, 30000 );
這個函數才會隔一段時間去呼叫一次
而不是設定define就會修改
因為我沒有原始檔了所以我沒辦法知道原來的是define
osal_start_timerEx的說明在
http://matttt-blog.blogspot.com/2010/04/cc2430-zstack.html#more
有
張貼留言