《国家标准》zigbee两种绑定机制.docx
- 文档编号:8375896
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:15
- 大小:25.35KB
《国家标准》zigbee两种绑定机制.docx
《《国家标准》zigbee两种绑定机制.docx》由会员分享,可在线阅读,更多相关《《国家标准》zigbee两种绑定机制.docx(15页珍藏版)》请在冰豆网上搜索。
《国家标准》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, //源EP
commandId, //簇ID
&destination, //目的地址模式
sapi_epDesc.endPoint);//目的EP
if(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))
{
//Trytomatchwithadeviceintheallowbindmode
ret=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)
{
//Setatimertomakesurebindcompletes
osal_start_timerEx(sapi_TaskID,ZB_BIND_TIMER,AIB_MaxBindingTime);
sapi_bindInProgress=commandId;
return;//dontsendcbackevent
}
}
//---------------------------------
}
SAPI_SendCback(SAPICB_BIND_CNF,ret,commandId);
}
else //create=false删除绑定
{
//RemovelocalbindingsforthecommandId
BindingEntry_t*pBind;
//Loopthroughbindingsanremoveanythatmatchthecluster
while(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:
一直处于绑定模式
//0 允许绑定的时间(单位/秒) 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(timeout>64) { 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->pAppOutClusterList)) { //Trytomatchwithadeviceintheallowbindmode //匹配一个在允许绑定模式下的设备 ret=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) { //Setatimertomakesurebindcompletes设置一个时间,确保绑定完成 osal_start_timerEx(sapi_TaskID,ZB_BIND_TIMER,AIB_MaxBindingTime); sapi_bindInProgress=commandId;//允许基于commandId命令的绑定过程 return;//dontsendcbackevent } } //--------------------------------- ………… } ****************************************** 在之中调用了函数ZDP_MatchDescReq(),将建立和发送一个匹配描述符请求。 用这个函数在一个应用中的输入/输出簇列表中搜索匹配某条件的设备/应用。 该绑定响应处理在SAPI_ProcessEvent事件处理函数中 caseZDO_CB_MSG: /*ZDO信息数据*/ SAPI_ProcessZDOMsgs((zdoIncomingMsg_t*)pMsg); 看下SAPI_ProcessZDOMsgs()函数 ****************************************** // SAPI_Init()函数中注册了以下两个ZDO信息 // ZDO_RegisterForZDOMsg(sapi_TaskID,NWK_addr_rsp); // ZDO_RegisterForZDOMsg(sapi_TaskID,Match_Desc_rsp); voidSAPI_ProcessZDOMsgs(zdoIncomingMsg_t*inMsg) { switch(inMsg->clusterID) { //-------------------- caseNWK_addr_rsp: ………… //-------------------- caseMatch_Desc_rsp: { zAddrType_tdstAddr; ZDO_ActiveEndpointRsp_t*pRsp=ZDO_ParseEPListRsp(inMsg); if(sapi_bindInProgress! =0xffff)//commandId { //Createabindingtableentry创建一个绑定条目 dstAddr.addrMode=Addr16Bit; dstAddr.addr.shortAddr=pRsp->nwkAddr; /*调用这个函数来实现两个设备的绑定*/ if(APSME_BindRequest(sapi_epDesc.simpleDesc->EndPoint, //源EP sapi_bindInProgress, //簇ID &dstAddr, //目的地址模式 pRsp->epList[0])==ZSuccess) //目的EP //成功实现绑定后 { //zb_BindDevice()中开启了一个定时器,用于接收Match_Desc_rsp计时 //如果接收到,则停止这个定时器,如下;如果溢出,则触发相应任务事件 osal_stop_timerEx(sapi_TaskID, ZB_BIND_TIMER); osal_start_timerEx(ZDAppTaskID,ZDO_NWK_UPDATE_NV,250); sapi_bindInProgress=0xffff; //FindIEEEaddr ZDP_IEEEAddrReq(pRsp->nwkAddr,ZDP_ADDR_REQTYPE_SINGLE,0,0); //Sendbindconfirmcallbacktoapplication zb_BindConfirm(sapi_bindInProgress,ZB_SUCCESS); } } } break; } } ****************************************** 以上内容摘自《zigbee2006无线网络与无线定位实战》这本书,根据协议版本的不同作了一些修改。 实例中的两种绑定机制,第一种(已知扩展地址的绑定)流程,就是zb_BindDevice()根据扩展地址直接调用APSME_BindRequest()创建绑定条目实现绑定,再得到其16位网络地址;第二种(未知扩展地址的绑定),因地址未知,须先经过一个描述符匹配过程得到相匹配设备的16位短地址,然后通过APSME_BindRequest()创建绑定条目实现绑定,再得到其扩展地址. 下面引用《zigbee2006无线网络与无线定位实战》对未知扩展地址的绑定流程的描述(以simpApp灯开关实验为例),根据协议版本不同作了相应修改: (1)首先调用zb_AllowBind(myAllowBindTimeout)函数,使管理设备(灯)处于允许绑定(匹配)响应模式 (2)在myAllowBindTimeout规定的时间内,终端设备需要调用zb_BindD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 国家标准 zigbee 绑定 机制