您好,欢迎访问三七文档
协议栈寻址网络中每一个设备都有唯一的网络地址,协调器按照事先配置的参数,采用一定的算法产生地址并进行分配。这些参数是:•MAX_NODE_DEPTH•NWK_MAX_ROUTERS•NWK_MAX_DEVICE_LISTMAX_NODE_DEPTH决定了网络的最大深度。协调器位于深度0,其子节点位于深度1,子节点的子节点位于深度2,以此类推。MAX_DEPTH参数限制了网络的物理长度。NWK_MAX_DEVICE_LIST决定了一个路由器或者一个协调器节点可连接子节点的最大个数。NWK_MAX_ROUTERS决定了一个路由器或者一个协调器可以处理的子节点中最大的路由器个数,它是MAX_CHILDREN的一个子集。协议栈寻址在ZigBee协议栈中,向ZigBee节点发送数据通常使用AF_DataRequest()函数,该函数用一个afAddrType_t类型的目标地址作为参数。Typedefstruct{Union{Uint16shortAddr;网络地址}afAddrMode_taddrMode;地址模式参数ByteendPoint;端点}afAddrType_t;协议栈寻址•除了网络地址和端点外,还要指定地址模式参数。地址模式参数即为寻址方式,可以设置为以下几个值:•Typedefenum•{afAddrNotPresent=AddrNotPresent,afAddr16Bit=Addr16Bit,单点传送afAddrGroup=AddrGroup,组播传送AfAddrBroadcast=AddrBroadcast,广播传送}AfAddrMode_t;单点传送:单点传送是标准寻址模式,它将数据包发送给一个已知网络地址的网络设备。将afAddrMode设置为Addr16Bit,并且在数据包中携带目标设备地址。组播传送:组播传送是将数据包传送给一个相同组的设备,将模式设置为afAddrGroup。广播传送:广播传送是将数据包发送给网络的每一个设备时,将模式设置为AddrBroadcast。目标shorAddr可以设置为以下广播地址的一种:NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设备,包括睡眠中的设备。NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所有在空闲时打开接收的设备,也就是说,除了睡眠中的所有设备。NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器(包括协调器,可以将协调器看出一种特殊的路由器)。协议栈路由•ZigBee路由协议是基于AODV专用网络路由协议实现的。•当路由器收到一个单点发送的数据包后,如果目标设备是它的相邻节点或子节点,则数据包会被直接传送给目标设备。否则,路由器将要检索它的路由表中与所要传送的数据包的目标地址相符合的记录。•ZigBee终端节点不执行任何路由功能。•ZigBee路由器(含协调器)将完成路径发现和选择、路径保持维护、路径期满处理等路由功能。实现ZigBee协调器和天然气传感器节点之间的点对点通信。具体功能:按下天然气传感器节点的KEY键,则向ZigBee协调器发出“LED1”字符串,ZigBee协调器收到数据(以“LED1”为例)后,回复给天然气传感器节点一个确认信息“ACK1”;天然气传感器节点接收到ACK1则后则点亮灯LED1或熄灭LED1.基于协议栈的点对点通信实验点对点通信程序流程图天然气传感器节点的程序流程图协调器程序流程图簇(Cluster)描述符•簇可以理解成一个应用领域下的一个特定对象,例如:智能家居系统中有调光器,操作这个调光器就需要一些命令,如开灯、关灯、变亮、变暗等,实现这些操作需要不同的命令,因此簇是由命令组成的。例如:constcId_tSampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS]={SAMPLEAPP_PERIODIC_CLUSTERID,//点对点SAMPLEAPP_FLASH_CLUSTERID,//组播SAMPLEAPP_BROADCAS,//广播};SampleApp_ClusterList就是一个簇,包含了命令SAMPLEAPP_PERIODIC_CLUSTERID、SAMPLEAPP_FLASH_CLUSTERID、SAMPLEAPP_BROADCASconstSimpleDescriptionFormat_tSampleApp_SimpleDesc={SAMPLEAPP_ENDPOINT,//intEndpoint;SAMPLEAPP_PROFID,//uint16AppProfId[2];SAMPLEAPP_DEVICEID,//uint16AppDeviceId[2];SAMPLEAPP_DEVICE_VERSION,//intAppDevVer:4;SAMPLEAPP_FLAGS,//intAppFlags:4;SAMPLEAPP_MAX_CLUSTERS,//uint8AppNumInClusters;(cId_t*)SampleApp_ClusterList,//uint8*pAppInClusterList;SAMPLEAPP_MAX_CLUSTERS,//uint8AppNumInClusters;(cId_t*)SampleApp_ClusterList//uint8*pAppInClusterList;};EndPoint–终端号:1-240是节点的子地址,用来接收数据AppProfId–定义了这个终端上支持的ProfileID(剖面ID),ID最好遵循由ZigBee联盟的分配。AppDeviceId–终端支持的设备ID,ID最好遵循ZigBee联盟的分配。AppDevVer–此终端上设备执行的设备描述的版本:0x00为Version1.0.Reserved–保留AppNumInClusters–终端支持的输入簇数目pAppInClusterList–指向输入ClusterID列表的指针AppNumOutClusters–终端支持的输出簇数目pAppOutClusterList–指向输出ClusterID列表的指针简单设备描述符节点描述符typedefstruct{ByteendPoint;Byte*task_id;SimpleDescriptionFormat_t*simpleDesc;afNetworkLatencyReq_tlatencyReq;}endPointDesc_t;task_id--任务ID指针,当接收到消息时,此任务ID将指示消息传递目的。接收到的消息是以OSAL消息形式包装的。simpleDesc--指向这个终端的ZigBee简单描述latencyReq--必须用noLatencyReqs来填充节点描述符是个结构体,其内容被赋值于初始化函数SampleApp_Init()当中。节点描述符voidSampleApp_Init(uint8task_id){SampleApp_TaskID=task_id;SampleApp_NwkState=DEV_INIT;SampleApp_TransID=0;//Fillouttheendpointdescription.SampleApp_epDesc.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_epDesc.task_id=&SampleApp_TaskID;SampleApp_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&SampleApp_SimpleDesc;SampleApp_epDesc.latencyReq=noLatencyReqs;//RegistertheendpointdescriptionwiththeAFafRegister(&SampleApp_epDesc);endPointDesc_tSampleApp_epDesc;添加按键代码voidSampleApp_HandleKeys(uint8shift,uint8keys)(App\SampleAp439行){(void)shift;//Intentionallyunreferencedparameteruint8buf1[4]={'L','E','D','1'};//需要发送LDE1命令if(keys&HAL_KEY_SW_1){}if(keys&HAL_KEY_SW_2){}if(keys&HAL_KEY_SW_6){SendData(0x0000,buf1,4);//通过无线点对点发送数据,长度为4}if(keys&HAL_KEY_SW_7){}}按键代码最终下载到天然气传感器节点上,用来检测天然气传感器电路板KEY1的状态变化。添加数据发送处理代码函数SendData()是最关键的内容,具体的发送任务由它来完成。发送函数内具体执行发送任务的是AF_DataRequest()。其中参数uint16addr为点对点发送的目的地址。参数uint8*buf是存放需要发送的数据缓冲。参数uint8Leng为通过点对点传输数据的长度。uint8SendData(uint16addr,uint8*buf,uint8Leng)(App\SampleApp503行左右){afAddrType_tSendDataAddr;SendDataAddr.addrMode=(afAddrMode_t)Addr16Bit;//点对点模式SendDataAddr.endPoint=SAMPLEAPP_ENDPOINT;//端点号SendDataAddr.addr.shortAddr=addr;//目的地址if(AF_DataRequest(&SendDataAddr,&SampleApp_epDesc,SAMPLEAPP_PERIODIC_CLUSTERID,Leng,buf,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS)==afStatus_SUCCESS)return1;elsereturn0;//Erroroccurredinrequesttosend.}添加数据接收处理代码实验二、基于协议栈的组播通信实验实验设计要求按下天然气传感器电路板上的KEY1键,向所有属于组1的传感器节点发送“LED1”信号,当组1的传感器节点接收到组播信号后,节点上的LED1闪烁三次。再按一次天然气传感器电路板的KEY1,向所有属于组2的传感器节点发送“LED1”信号,当组2的传感器节点接收到组播信号后,节点上的LED1闪烁三次。实验程序流程(详细操作见实验指导书)实验步骤1、添加簇描述符、添加设备描述符、添加端点描述符图2-4IAR工程界面红色框里的内容即为本次实验的簇ID设置。将红色代码添加到相应的程序段中。黄色框里定义了简单设备描述符将红色代码添加到相应程序段中endPointDesc_tSampleApp_epDesc;端点描述符是个结构体,其内容被赋值于初始化函数SampleApp_Init()当中红色部分即为端点描述符的具体赋值内容,也包含了定义组播的通信的通信模式。同学将红色代码添加到相应的程序段中。2、添加按键代码3、添加数据发送处理代码SampleApp.c中,函数SampleApp_SendFlashMessage()具体的组发送任务由它来完成。SampleApp_SendFlashMessage(uint16AddrGroupID,uint8*buf,uint8Leng)完成了组播的无线发送。其中参数uint16AddrGroupID为组播的组号。参数uint8*buf是存放需要发送的数据缓冲区。参数uint8Leng通过组播传输数据的长度。发送函数内具体执行发送任务的是AF_DataRequest()4、添加数据接收处理代码同学将
本文标题:物联网通信
链接地址:https://www.777doc.com/doc-5495551 .html