zigbee两种绑定机制

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

我使用的协议栈版本及例子信息:ZigBee2006\ZStack-1.4.3-1.2.1个人注释版_5.24\Projects\zstack\Samples\SimpleApp\CC2430DB建立一个绑定表格有3种方式:(1)ZDO绑定请求:一个试运转的工具能告诉这个设备制作一个绑定报告(2)ZDO终端设备绑定请求:设备能告诉协调器他们想建立绑定表格报告。该协调器将使协调并在这两个设备上创建绑定表格条目。(3)设备应用:在设备上的应用能建立或管理一个绑定表格。有两种可用的机制配置设备绑定:(1)如果目的设备的扩展地址是已知的,则zb_BindDeviceRequest()函数能创建一个绑定条目。(2)如果扩展地址是未知的,则一个按钮可以利用。这样的话,这个目的设备首先处于一种状态,它将被zb_AllowBindResponse()发出一个匹配响应;然后在源设备处,zb_AllowBindRequest()函数带着空地址出发.以上两种绑定机制,最终都是用函数APSME_BindRequest()创建绑定。不同的是,前者采用的目的地址是64位扩展地址,而后者采用的目的地址是16位网络地址。前者已知扩展地址,调用了ZDP_NwkAddrReq()函数获得目的设备短地址;后者利用描述匹配得到了短地址,然后调用了ZDP_IEEEAddrReq()函数,获取目的设备的扩展地址.******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************1、已知扩展地址的绑定这里可以直接调用函数zb_BindDevice()发起绑定请求:zb_BindDevice(uint8create,//是否创建绑定,TRUE则创建,FALSE则解除uint16commandId,//命令ID,基于某命令的绑定,相当于簇uint8*pDestination)//指向扩展地址的指针函数程序如下(已知扩展地址的绑定部分)******************************************voidzb_BindDevice(uint8create,uint16commandId,uint8*pDestination){zAddrType_tdestination;uint8ret=ZB_ALREADY_IN_PROGRESS;if(create)//create=true建立绑定{if(sapi_bindInProgress==0xffff)//不允许绑定过程??{//---------------------------------if(pDestination)//已知扩展地址的绑定,即*pDestination为非NULL{destination.addrMode=Addr64Bit;osal_cpyExtAddr(destination.addr.extAddr,pDestination);//直接调用APS绑定请求函数ret=APSME_BindRequest(sapi_epDesc.endPoint,//源EPcommandId,//簇ID&destination,//目的地址模式sapi_epDesc.endPoint);//目的EPif(ret==ZSuccess)//绑定成功{//Findnwkaddr发现网络地址,得到被绑定设备的短地址ZDP_NwkAddrReq(pDestination,ZDP_ADDR_REQTYPE_SINGLE,0,0);osal_start_timerEx(ZDAppTaskID,ZDO_NWK_UPDATE_NV,250);}}//---------------------------------else//未知目的扩展地址,即*pDestination=NULL{ret=ZB_INVALID_PARAMETER;destination.addrMode=Addr16Bit;destination.addr.shortAddr=NWK_BROADCAST_SHORTADDR;//0xffff描述符匹配请求:广播/*检测输出簇;如果是输出簇,则去匹配一个处于允许绑定模式的设备*/if(ZDO_AnyClusterMatches(1,&commandId,sapi_epDesc.simpleDesc-AppNumOutClusters,sapi_epDesc.simpleDesc-pAppOutClusterList)){//Trytomatchwithadeviceintheallowbindmoderet=ZDP_MatchDescReq(&destination,NWK_BROADCAST_SHORTADDR,sapi_epDesc.simpleDesc-AppProfId,1,&commandId,0,(cId_t*)NULL,0);}/*检测输入簇;如果是输入簇,则去匹配一个处于允许绑定模式的设备*/elseif(ZDO_AnyClusterMatches(1,&commandId,sapi_epDesc.simpleDesc-AppNumInClusters,sapi_epDesc.simpleDesc-pAppInClusterList)){ret=ZDP_MatchDescReq(&destination,NWK_BROADCAST_SHORTADDR,sapi_epDesc.simpleDesc-AppProfId,0,(cId_t*)NULL,1,&commandId,0);}if(ret==ZB_SUCCESS){//Setatimertomakesurebindcompletesosal_start_timerEx(sapi_TaskID,ZB_BIND_TIMER,AIB_MaxBindingTime);sapi_bindInProgress=commandId;return;//dontsendcbackevent}}//---------------------------------}SAPI_SendCback(SAPICB_BIND_CNF,ret,commandId);}else//create=false删除绑定{//RemovelocalbindingsforthecommandIdBindingEntry_t*pBind;//Loopthroughbindingsanremoveanythatmatchtheclusterwhile(pBind=bindFind(sapi_epDesc.simpleDesc-EndPoint,commandId,0)){bindRemoveEntry(pBind);}osal_start_timerEx(ZDAppTaskID,ZDO_NWK_UPDATE_NV,250);}return;}******************************************在上面已知扩展地址的绑定程序中调用了APS绑定函数APSME_BindRequest(),这个函数在两个设备间建立绑定,通过APSME_BIND.confirm原语返回,而且这两者是不可分割的。如果绑定成功,则调用函数ZDP_NwkAddrReq()得到目的设备的短地址。ZDP_NwkAddrReq()这个函数可以产生一个根据已知遥远设备的IEEE地址,请求得到16位短地址的信息.该信息以广播的方式发送给网络中的所有设备.2、未知扩展地址的绑定(simpApp例子中默认的绑定机制)该绑定方式下,在发送绑定请求前,先要让被绑定的目的设备处于允许绑定模式。可以调用函数zb_AllowBind()进入该模式,函数如下:******************************************//函数设置设备处于允许绑定模式//timerout=0x00:不允许绑定//timerout=0xff:一直处于绑定模式//0timeout65:允许绑定的时间(单位/秒)voidzb_AllowBind(uint8timeout){osal_stop_timerEx(sapi_TaskID,ZB_ALLOW_BIND_TIMER);if(timeout==0){afSetMatch(sapi_epDesc.simpleDesc-EndPoint,FALSE);}else{afSetMatch(sapi_epDesc.simpleDesc-EndPoint,TRUE);//设置允许响应匹配描述符请求if(timeout!=0xFF){if(timeout64){timeout=64;}//设置了允许匹配后,开启一个定时器,时间为timeout*1000,//时间一到触发sapi任务ZB_ALLOW_BIND_TIMER事件,SAPI_ProcessEvent()对其的处理是//afSetMatch(sapi_epDesc.simpleDesc-EndPoint,FALSE)而取消允许绑定osal_start_timerEx(sapi_TaskID,ZB_ALLOW_BIND_TIMER,timeout*1000);}}return;}******************************************参数timeout是进入绑定模式持续的时间(s)。如果设置为OxFF,则设备在任何时候都在允许绑定模式;如果设置为OxOO,则设备将通过该命令取消允许绑定模式.调用该函数使设备在给定时间内进入允许绑定模式.一个在允许绑定模式下同等的设备调用函数zb_BindDevice()能与之建立绑定,此时目的扩展地址为空(参见上面zb_BindDevice()未知目的扩展地址部分).zb_AllowBind()调用afSetMatch(),使之允许响应ZDO的匹配描述符请求.以上设置目的设备允许绑定模式(比如simpleApp的灯设备),那在目的设备处于允许绑定模式的时间内,源设备(比如simpleApp的开关设备)可以调用zb_BindDevice()来发起绑定请求.此时执行的程序如下:******************************************voidzb_BindDevice(uint8create,uint16commandId,uint8*pDestination){…………//---------------------------------else//未知目的扩展地址,即*pDestination=NULL{ret=ZB_INVALID_PARAMETER;destination.addrMode=Addr16Bit;destination.addr.shortAddr=NWK_BROADCAST_SHORTADDR;//0xffff/*检测输出簇,如果是输出簇,则去匹配一个处于允许绑定模式的设备*/if(ZDO_AnyClusterMatches(1,&commandId,sapi_epDesc.simpleDesc-AppNumOutClusters,sapi_epDesc.simpleDesc-pAppOutClusterL

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功