ZigBee学习笔记CC2530
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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); //用闪灯方式表示收到了消息。。。
}