无线传感器网络:第05章 TI ZStack开发提高_第1页
无线传感器网络:第05章 TI ZStack开发提高_第2页
无线传感器网络:第05章 TI ZStack开发提高_第3页
无线传感器网络:第05章 TI ZStack开发提高_第4页
无线传感器网络:第05章 TI ZStack开发提高_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2022/7/141无线传感器网络讲义TI ZStack开发提高2022/7/1425.1 NV操作5.2 单播、广播、组播5.3 地址查询5.4 网络拓扑5.5 绑定2022/7/1435.1 NV操作NV就是Non Volatile的缩写,即非易失性存储器即使系统断电后,存储在该存储器中的数据也不会丢失。在CC2530单片机中,NV=Flash存储器。 NV有什么作用呢?在ZigBee协议栈中,NV存储器主要用于保存网络的配置参数(如网络地址),因为掉电后该参数不丢失,所以,当系统采用电池供电时,因为电池没电而导致该节点关机,则只需要更换电池,等恢复供电后,该节点还是加入原来的网络中并且该

2、节点的网络地址可以从NV中读取,这样可以保持该节点的网络地址没有变化。开发者需要掌握NV存储器的读和写函数的使用,这些函数位于 协议栈OSAL文件夹下有OSAL_Nv.h和OSAL_Nv.c文件中。 2022/7/1445.1 NV操作uint8 osal_nv_item_init( uint16 id, uint16 len, void *buf)NV条目初始化函数,在协议栈中使用NV存储器时将该存储器分成了很多条目,每个条目都有一个ID号,参看ZcomDef.h 中的定义,用户也可以添加自己的条目 uint8 osal_nv_write( uint16 id, uint16 ndx, ui

3、nt16 len, void *buf)NV写入函数。id: NV条目ID号 ;ndx:距离条目开始地址的偏移量; len:要写入的数据长度;buf:指向存放写入数据缓冲区的指针。 uint8 osal_nv_read( uint16 id, uint16 ndx, uint16 len, void *buf)NV读取函数。id: NV条目ID号;ndx:距离条目开始地址的偏移量;len:要读取的数据长度;buf:指向存放读取数据缓冲区的指针。2022/7/145 / Send the message status = AF_DataRequest(&dstAddr, &sapi_epDesc

4、, commandId, len, pData, &handle, txOptions, radius);typedef struct union uint16 shortAddr; ZLongAddr_t extAddr; addr; afAddrMode_t addrMode; /地址模式:单播、广播、组播 byte endPoint; uint16 panId; / used for the INTER_PAN feature afAddrType_t;5.2 单播、广播、组播2022/7/146typedef enum afAddrNotPresent = AddrNotPresent

5、, afAddr16Bit = Addr16Bit, /单播 afAddr64Bit = Addr64Bit, /单播 afAddrGroup = AddrGroup, /组播 afAddrBroadcast = AddrBroadcast /广播 afAddrMode_t;广播:my_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;my_DstAddr.addr.shortAddr=0 xFFFF;使用广播通信时,网络地址可以有三种0 xFFFF, 数据包将在全网广播,包括处于休眠状态的节点0 xFFFD, 数据包将只发往往未处于体眠状态的节点0

6、 xFFFC, 数据包发往网络中的所有路由器节点 5.2 单播、广播、组播2022/7/147组播:my_DstAddr.addrMode = (afAddrMode_t) AddrGroup;my_DstAddr.addr.shortAddr=GenericApp_Group.ID;可见,使用组播的方式发送数据时,需要加入特定的组中。如何表示一个组呢?如何使节点加入该组中呢? 在apsgruops.h文件中有aps_Group_t结构体的定义: #define APS_GROUP_NAME_LEN 16 typedef struct uint16 ID; /组ID uint8 nameAPS

7、_GROUP_NAME_LENl; /组名 ) aps_Group_t;使用aps_AddGroup0函数使该端口加到组中 aps_AddGroup(uint8 endpoint, aps_Group_t *group);5.2 单播、广播、组播2022/7/148组播用法示例:在GenericApp_init()函数中定义组: aps_Group_t GenericApp_Group; GenericApp_Group.ID=Ox0001; GenericApp_G0 =6; osal_memcpy(GenericApp_Group. name1),Groupl”, 6);

8、在GenericApp_ProcessEvent()函数中加入组: case ZDO_STATE_CHANGE: aps_AddGroup(GENERICAPP_ENDPOINT, &GenericApp_Group); 在消息发送函数调用AF_DataRequest()进行组播发送:my_DstAddr.addrMode = (afAddrMode_t) AddrGroup;my_DstAddr.addr.shortAddr=GenericApp_Group.ID;AF_DataRequest( &my_DstAddr, &GenericApp_epDesc,.)5.2 单播、广播、组播20

9、22/7/149(1)查询本节点有关的地址信息查看节点的网络地址、MAC地址、父节点的网络地址、父节点的MAC地址。调用ZigBee协议栈实现的网络管理函数如下: uint16 NLME_GetShortAddr(void) 返回该节点的网络地址。 bye NLME_GetExtAddr(void) 返回指向该节点MAC地址的指针。 uint16 NLME_GetCoordShortAddr(void) 返回父节点的网络地址。 void NLME_GetCoordExtAddr(byte*buf) 该函数的参数是指向存放父节点MAC地址的缓冲区的指针。 用法见P164-1655.3 地址查询2

10、022/7/1410(2)查询网络中其他节点有关的地址信息已知节点的16位网络地址查询节点的IEEE地址; 调用ZDP_IEEEAddrReq0函数发送地址查询请求; 等待协调器发送自身的IEEE地址(协议栈自动完成,用户不需要处理); 添加ZDO_CB_MSG消息响应函数,并调用ZDO_ParseAddrRsp()函数对数据包进行解析得到所需要的IEEE地址。afStatus_t ZDP_IEEEAddrReq( uint16 shortAddr, byte ReqType, byte StartIndex, byte SecurityEnable );已知节点的IEEE地址查询该节点的网络

11、地址。afStatus_t ZDP_NwkAddrReq( uint8 *IEEEAddress, byte ReqType, byte StartIndex, byte SecurityEnable );5.3 地址查询2022/7/1411(2)查询网络中其他节点有关的地址信息- 地址查询的返回消息的处理:/ Parse the NWK_addr_rsp and IEEE_addr_rsp messagesZDO_NwkIEEEAddrResp_t* ZDO_ParseAddrRsp( zdoIncomingMsg_t *inMsg ); typedef struct uint8 stat

12、us; uint16 nwkAddr; /短地址 uint8 extAddrZ_EXTADDR_LEN; /长地址 uint8 numAssocDevs; uint8 startIndex; uint16 devList; ZDO_NwkIEEEAddrResp_t; / in ZDObject.h在APP层初始化函数(如GenericApp_Init)中需要注册NWK_addr_rsp或IEEE_addr_rsp类型的ZDO簇ID,以便应用层得到该类型消息的响应,如:ZDO_RegisterForZDOMsg(GenericApp_TaskID, IEEE_addr_rsp);在事件处理函数

13、的ZDO_CB_MSG分支中处理查寻结果,如: ZDO_NwkIEEEAddrResp_t *pRsp=ZDO_ParseAddrRsp(inMsg); if(pRsp-status=ZSuccess) To_string(buf, pRsp-extAddr,8);5.3 地址查询2022/7/14125.4 网络拓扑 设置一个ZigBee网络可以采用星型网拓扑,也可以采用网状网拓扑,这是可以配置的。不管是那种配置,网络中协调器负责网络的建立和维护外,还负责与上位机进行通信,包括向上位机发送数据和接收上位机的数据并无线转发给下面各个节点。在星型网中,设备类型为协调器和终端设备,且所有的终端设备

14、都直接与协调器通信。网状网又称MESH网,其中的设备类型为协调器、路由器和终端节点,其中有的路由器和终端设备并不直接与协调器通信,需要中间路由器节点才能将数据上传到协调器。路由设备除了需要根据协调器发送的命令来执行数据采集或控制被控对象,还需承担路由任务。 2022/7/14135.4 网络拓扑 设置将Z-Stack(ZigBee 2007)协议栈设置为星型网时,只需要改变协议栈中的NWK文件夹下的nwk_globals.h文件中的一行代码,注意选择正确的PROFILE_ID分支。 #define NWK_MODE NWK_MODE_STAR /设置为星型网将Z-Stack(ZigBee 20

15、07)协议栈设置为Mesh网时,只需要改变协议栈中的NWK文件夹下的nwk_globals.h文件中的一行代码,注意选择正确的PROFILE_ID分支。 #define NWK_MODE NWK_MODE_MESH /设置为MESH网 2022/7/14145.4 网络拓扑 获取void Sendlnfo (void) /填充设备信息并向协调器发送 RFTX rftx: uint16 nwk: if (GenericApp_NwkState=DEV END_DEVICE) 判断是否是终端节点 osal_memcpy (rftx. type. END, 3) ;if (GenericApp Nw

16、kState=DEV_ROUTER) 判断是否是路由器 osal_memcpy (rftx. type, ROU, 3); nwk=NIME_GetShortAddr() ; /获得本节点网络地址To_string (rftx .myNWK. (uint8 *)&nwk,2) ;nwk = NLME_GetCoordShortAddr () ; /获得父节点网络地址To_string (rftx.pNWK, (uint8 *)&nwk, 2) afAddrT ype_t my_DstAddr; my_Ds tAddr. addrMode= (afAddrMode_t) Addrl6Bit; m

17、y_DstAddr.endPoint=GENERICAPP_ENDPOINT; my_DstAddr. addr. shortAddr=Ox00 00; AF_DataRequest( &my_DstAddr, &GenericApp_epDesc, GENERICAPP_CLUSTERID,11, (uint8 *)&rftx, &GenericApp_TransID, AF_DISCV_ROUTE,AF_DEFAULT_RADIUS );) /向协调器发送设备信息2022/7/1415ZMonitor2022/7/14165.5 绑定 一个典型的ZigBee节点也将有很多属性(attrib

18、ute) ,每个属性都有自己的值。一个簇(cluster)实际上是一些相关命令和属性的集合,这些命令和属性一起被定义为一个应用接口。在整个网络中每个簇都被分配了一个唯一的簇ID。 例如在家居照明控制灯规范中,ZigBee为遥控开关控制器(开关)定义了一个必要的输出簇:OnOffSRC。它也为开关负载控制器(灯)定义了一个必要的输入簇:OnOffSRC。这两个簇的ClusterID都是OnOffSRC,因此开关便可以通过这个簇来对灯进行控制,ZigBee在On()ffSRC簇中定义了一个属性OnOff。为它定义了三种不同的属性值,分别是OxFF表示OnOx00表示Off0 xF0表示Toggle

19、。当需要打开照明灯时,遥控开关便通过应用层KVP消息,发送Set命令将照明灯OnOffSRC簇中OnOff属性设置为On。同样如果需要关闭照明灯时,也可以通过Set命令将照明灯()nOffSRC簇中()n()ff设置为Off。Toggle属性值的意义是,如果电灯在开的状态下,设置这个值将会把电灯关掉;如果电灯是关闭状态,通过设定这个属性值则又会把电灯打开。2022/7/1417 绑定(binding)操作是使用ClusterID为不同节点上的独立端点建立一个逻辑上的连接,绑定操作能够使用户的应用变得更加方便灵活。 下图中。节点Z1中的端点EP3与节点Z2中的端点EP5, EP7, EP8绑定,

20、实现了开关1同时控制电灯1,2,3。5.5 绑定绑定是一种两个(或者多个)设备之间在应用层的信息流控制机制。在最新的Z - Stack版本中,它被称为源绑定,所有的设备都必须执行绑定机制。绑定允许应用程序发送一个数据包而不需要知道目标地址。APS层从它的绑定表中确定目标地址,然后将数据继续向目标应用或者目标组发送。2022/7/1418绑定的建立要实现绑定操作,端点可向协调器发送绑定请求,协调器在有限的时间间隔内接收到两个端点的绑定请求后,便通过建立端点之间的绑定表在这两个不同的端点之间形成了一个逻辑链路。绑定端点的消息传送在绑定后的两个端点之间进行消息传送的过程属于消息的间接传送。其中一个端

21、点首先会将信息发送到ZigBee协调器中。ZigBee协调器在接收到消息后会通过查找绑定表,将消息发送到与这个端点相绑定的所有端点中,从而实现绑定端点之间的通信。5.5 绑定2022/7/1419 间接绑定:间接绑定方法比较简单,在Profile文件中就包含这种方法,它通过按键来发送绑定信息。需要绑定的两个节点在一定的时间内发送绑定命令,当协调器在设定的时间内收到这样的两条绑定信息时,它就会建立对应的绑定表。建立了绑定关系的两个节点之间就可以通过Endpoint来相互通信。 直接绑定(OTA):直接绑定需要用户编写相应的绑定程序,ZigBee协议栈中含有绑定API,用户可以通过适当的方法调用来

22、实现绑定功能。这种方法通常是使用一个节点直接向协调器发送两条绑定信息,这两条信息中的目标地址和源地址相反。这种方法需要用户对协议栈有一定的了解,熟悉相关的API函数。使用这种方法可以通过第三方节点来配置网络来是任意两个节点之间建立绑定关系使网络通信方式更加灵活。而且第三方节点可以通过与上位机互联,在上位机可以建立一个界面,通过串口向第三方节点传递配置信息,使配置更加方便。 直接绑定(通过串口):这种方法是使用上位机通过串口向协调器发送绑定信息,一般使用的比较少,因为通常我们的协调器需要与上位机通信,要把网络的信息传到上位机,一般不适合在同一个上位软件再做网络的配置部分。通常直接绑定(OTA)方

23、法比较适用,可以专门做一个网络的配置软件,来配置网络,当然间接绑定最简单,在项目中可以综合考虑选择适当的绑定方式。绑定的三种方法2022/7/1420间接通信:间接通信是指各个节点通过端点的绑定建立通信关系,这种通信方式不需要知道目标节点的地址信息,包括IEEE地址或网络短地址Z- Stack底层将自动从栈的绑定表中查找目标设备的具体网络地址并将其发送出去。簇簇就是人们在着手建立Profile时遇到的这个概念,它是一簇网络变量(attributes)的集合,在同一个Profile中,ClusterID是唯一的。在直接寻址方式和间接寻址方式中都会用到这个概念。在间接寻址方式中,建立绑定表时需要搞

24、清楚Cluster的含义与属性。对于可以建立绑定关系的两个节点,它们的Cluster的属性必须一个选择“输入”,另一个选择“输出”,而且ClusterID值相等,只有这样,它们彼此才能建立绑定,而在间接通信是指各个节点通过端点的绑定建立通信关系,这种通信方式不需要知道目标节点的地址信息,包括IEEE地址或网络短地址Z- Stack底层将自动从栈的绑定表中查找目标设备的具体网络地址并将其发送出去。2022/7/1421SimpleApp解析 SimpleApp工程主要提供两个应用实例:温度传感器实验和灯开关实验。SimpleSensor和SimpleCollector用于温度传感器实验Simpl

25、eSwitch和SimpleController用于灯开关实验。2022/7/1422用户打开SimpleApp工程后,会在Workspace区域看到不同的设备类型,不同的设备类型下均包含App文件夹,里面存放着各种应用实现的源文件。可以发现,每种设备类型都包含sapi.c、sapi.h和SimpleApp.h文件,即每种设备程序运行时的任务初始化函数、任务事件处理函数均是在sapi.c中实现。1 任务初始化函数 SAPI_Init( byte task_id )负责初始化该任务的所有初始量,如相关硬件初始化、表格初始化和上电启动通知等。/*函数描述:SimpleApp的初始化函数/*函数参数

26、:task_id 是OSAL分配的任务ID,该ID用于发送消息和设定定时器在任务初始化函数中,主要用到了以下Z - Stack的API函数和变量定义:(1) afRegister 该函数为ZigBee设备注册一个新的端口。应用程序中的每一个端口都必须使用该函数进行注册。函数原型 afStatus_t afRegister( endPointDesc_t * epDesc)函数参数:epDesc-指向端口描述符的指针返回值 afStatus_t在ZComDef.h的Zstatus_t结构中定义的状态值。工程程序架构(1)2022/7/1423(2) afSetMatch (允许绑定或不允许) 默

27、认情况下ZigBee设备对ZDO的匹配描述做出响应。可以使用该函数改变其响应行为。如果参数action的值是false,那么ZDO将不会对ZDO的匹配描述请求做出响应。 函数原型: uint8 afSetMatch( uint8 ep, uint8 action ) 函数参数:ep-端口号。action-允许响应时是true(默认情况),不允许时是false。 返回值: 成功的话返回值是true如果返回false表示没有找到ep端口号。(3) ZDO_RegisterForZDOMsg 该函数被用于注册一个接收请求或响应信息的事件。该信息将被发送至OSAL的信息队列中。接收到该信息的任务自动分

28、析该信息,或者是调用ZDO的分析函数处理该信息。 注意:只有响应信息才可以使用ZDO的分析函数。 使用该函数注册信息后,ZigBee设备接收的无线信息(OTA)会作为ZDO_CB_MSG信息发送至任务队列进行下一步处理。 函数原型 ZStatus_t ZDO_RegisterForZDOMsg(uint8 taskID. uint16 clusterID); 函数参数:taskID-该信息准备发送至的任务ID clustered-准备接收的信息类型(clusterID,例如NWK_add_rsp)。返回值: ZStatus_t在ZComDef.h的Zstatus_t结构中定义的状态值。工程程序

29、架构(2)2022/7/1424(4) RegisterForKeys 按键注册函数,将按键的变化信息发送至某一个任务。函数原型 byte RegisterForKeys( byte task_id);函数参数 Task_id-任务的ID号;返回值 byte-按键所对应的状态值。 (5) osal_set_event 调用该函数启动任务。 函数原型: byte osal_set_event( byte task_id, UINT16 event_flag); 函数参数: task_ id-任务ID号; event_flag -占用2字节,每一位对应一个事件,其中,系统事件只有SYS_EVENT

30、_MSG,剩余的事件/标志位,由接收任务定义; 返回值: 若返回ZSUCCESS,表示成功;返回INVALID_TASK,表明是一个无效的任务。工程程序架构(3)2022/7/1425任务事件处理函数 SAPI_ProcessEvent(taskid, event)在SAPl_lnit函数的最后调用osal_set_event( task_id, ZB_ENTRY_EVENT)这将触发任务的事件处理函数SAPI_ProcessEvent该函数处理任务所有的事件,包括时间、消息和其他用户定义的事件。里面的所有确认函数都是用户编写,向应用(用户)指示该事件发生,继而可以做相关的处理,如发现网络设备

31、后,可以把该设备的信息输出到LCD或串口;接收到数据后把该数据输出到LCD或串口;接收到命令后,根据命令做相应的处理(闪灯等);发生键盘事件可以调用键盘处理函数;发送完数据包后,可以闪烁LED指示发送完毕等。(1) ZB_ENTRY_EVENT事件 - 由SimpleAPI定义的启动事件 由于初始化函数的最后触发了ZB_ENTRY_EVENT事件事件处理函数首先处理该事件。其中调用了zb_ HandleOsaIEvent函数,该函数由具体的应用设备程序来实现,如果在Workspace中选择SimpleCollectEB设备,则该函数的定义在SimpleCollector.c中,该函数默认为空,

32、用户可以自己添加相应操作。工程程序架构(4)2022/7/1426由SAPI_ProcessEvent流程及ZB_ENTRY_EVENT事件的触发处理可知:应用程序首先读取非易失性存储器中已有的信息,并保存在startOptions中。接下来,通过if语句判断是启动Z- Stack协议栈建立网络加入网络,还是闪烁红色指示灯(LED2)提示用户。(2) SYS_EVENT_MSG事件 - 由OSAL定义的强制事件 SYS_EVENT_MSG是OSAL规定的强制事件,当信息经OSAL调度发送至程序任务的时候任务事件处理函数将根据其中的信息不同而采取不同的操作。 KEY_CHANGE:该信息表示键盘

33、动作。还以SimpleCollcetorEB设备为例,当任务检测到按键事件发生时,它将调用zb_HandleKeys函数(在SimpleCollector.c中实现)工程程序架构(5)2022/7/1427SimpleApp的启动流程由ZB_ENTRY_EVENT事件的处理流程可知,打开ZigBee设备的电源后,系统闪烁LED2(红灯),并进入等待状态。直到用户进行按键操作,使不同的设备建立网络加入网络,并进行数据发送的操作。 当按下SW1键时,首先判断设备是否处于初始化状态,通过zb_ReadConfiguration判断设备的类型,并最终使其担任协调器的角色。然后,通过zb_WriteCo

34、nfiguration设置ZCD_NV_STARTUP OPTION的值为ZCD _STARTOPT_AUTO_START,然后调用zb_SystemReset函数重新启动设备。 通过上述的操作之后,应用程序会将ZCD_NV_STARTUP_OPTION的值设为ZCD_STARTOPT_AUTO_START,并将其写入非易失性存储器;这样,当用户第二次打开ZigBee设备的时候,它将自动启动Z - Stack进行相关的操作。2022/7/1428按键事件发生的流程2022/7/1429 按键事件的触发传递 HAL(Hardware Lay)检测到按键状态变化(通过H/W中断或者H/W轮询操作)

35、。 HAL对应的OSAL任务检测到按键的状态变化,触发OSAL按键变化的回调函数。 OSAL按键变化回调函数发送一个OSAL的系统事件消息给已径注册过的任务。2022/7/1430温度传感器数据采集的例程系统配置:传感节点(终端设备, sensor nodes) + 采集节点(协调器,collection node)。采集节点负责建立网络,传感节点加入网络并与采集节点建立绑定后,将温度值和电压值发送给采集节点。功能需求:整个应用程序应该具备以下基本功能:自动建立一个网络;传感节点能够自动发现采集节点,而且一旦加入网络后,能够自动与一个采集节点建立绑定;传感节点能够周期性地向一个采集节点发送数据

36、,并采用端到端确认(acknowledgement)的发送模式;如果传感节点没有收到采集节点的确认消息,它将解除与该采集节点的绑定,然后,重新发现采集节点并与其建立绑定(重新发现的采集节点可能是另外一个采集节点)。2022/7/1431原理(1)每个设备都有一组能被配置的参数整个配置参数在代码中已经定义了默认值(在f8wConfig. cfg中)。在同一个网络中,所有设备的“网络细节”配置参数(如PANID、Channel等)应该被设置成一样的值。每个设备的“设备细节”配置参数(Coordinator、Router、EndDevice等)可以配置为不同的值。 2022/7/1432原理(2)Z

37、CD_NV_LOGICAL_TYPE的设置必须确保:有正确的一个设备作为协调器被配置;所有电池供电的设备作为终端设备被配置。一旦这些工作都完成,这个设备就可以以任意方式启动。协调器设备将建立网络,其他设备将发现和加入这个网络。 协调器将扫描所有被ZCD_NV_CHANLIST参数制定的通道,选择1个最小能量的通道。协调器将选择用ZCD_NV_PANID参数指定的网络ID。路由器和终端设备将扫描用ZCD_NV_CHANLIST配置参数指定的通道和试图发现ID为ZCD_NV_PANID参数指定的网络。2022/7/1433原理(3) - (1)协调器格式化网络 协调器将扫描DEFAULT_CHAN

38、I_IST指定的通道,最后在其中之一上形成网络。如果ZDAPP_CONFIG_PAN_ID被定义为0 xFFFF,那么协调器将根据自身的IEEE地址建立一个随机的PAN ID;如果ZDAPP_CONFIG_PAN_ID没有被定义为0 xFFFF,那么协调器建立网络的PAN ID将由ZDAPP_CONFIG_PAN_ID指定。 当所有的参数配置好后,可调用下面函数来格式化网络: ZStatus_t NLME_NetworkFormationRequest(uint16 Panld, uint32 ScanChannels, byte ScanDuration, byte BeaconOrder,

39、 byte SuperframeOrder byte BatteryLifeExtension);一般不直接使用上面的函数建立网络,而是使用ZDO_StartDevice()函数来启动一个设备。2022/7/1434原理(4)(2)路由器和终端设备加入网络 路由器和终端设备启动后,将扫描DEFAULT_CHANLIST指定的频道。如果ZDAPP_CONFIG_PAN_ID没有被定义为0 xFFFF,则路由器将强制加入ZDAPP_CONFIG_PAN_ID走义的网络。 发现一个网络将调用下面的函数:ZStatus_t NLME_NetworkDiscoveryRequest( uint32 Sc

40、anChannels, byte ScanDuration) ; 该函数要求网络层去发现邻居路由器节点,并且应该在进行网络扫描之前调用,扫描的结果由ZDO_NetworkDiscoveryConfirmCB()函数返回。其中: ScanChannels-准备扫描的信道号(信道号的范围为1126,即仅对2.4 GHz频段有效)。 ScanDuration-规定了在新的网络开始建立之前,其他网络可以扫描每个信道的时间长度。 2022/7/1435原理(6)(3) ZDO_StartDevice() 实际上, ZigBee设备启动时不直接调用NLME_NetworkFormationRequest、

41、NLME_NetworkDiscoveryRequest和ZStatus_t NLME_OrphanjoinRequest去形成网络,而是通过调用ZDO_StartDevice()函数来启动设备。 在任务事件处理函数中,当ZB_ENTRY_EVENT事件触发时,一旦ZCD_NV_STARTUP_OPTION的值被设置为ZCD_STARTOPT_AUTO_START,则应用程序调用zb_StartRequest()函数。设备打开电源之后,由于还未形成网络,所以经过设备逻辑类型的判断后程序会跳转至ZDOlnitDevice( zgStartDelay)其中的ZDApp_Networklnit()函

42、数会触发ZDO_NETWORK_INIT事件而ZDO_NETWORK_INIT事件的处理函数位于Z- Stack虚用层的任务事件处理函数ZDApp_event_loop()中,包含了ZDO_StartDevice()2022/7/1436原理(5)(2)路由器和终端设备加入网络 .发现网络存在后,就调用下面的函数加入网络。ZStatus_t NLME_OrphanjoinRequest( uint32 ScanChannels, byte ScanDuration); 该函数要求网络层以孤节点的形式加入网络。函数调用的结果由ZDO_JoinConfirmCB()返回。 注意:如果协调器和踣由器

43、或终端设备都没有定义ZDAPP_CONFIG_ PAN_ID为0 xFFFF则两者之间不一样的定义可能会出现一些意外的结果;如果ZDAPP_CONFIG_PAN_ID被定义为一个正确的值(小于或等于0 x3FFF),那么协调器就只在指定的PAN ID上试图建立网络。2022/7/1437原理(6)2数据传输 只有建立了网络并加入到网络中,ZigBee设备才可以传输数据。在温度传感器实验中,采集节点和传感节点首先建立绑定关系然后将采集的温度值和电压值发送给采集节点。 (1)数据发送 当传感节点与采集节点建立绑定时,传感节点会调用zb_BindConfirm函数,该函数的主要功能是,如果建立绑定成

44、功,则传感节点开始向采集节点发送传感数据;否则,重新搜索采集节点。传感节点向采集节点发送传感数据的函数是myApp_StartReporting()MY_REPORT_TEMP_EVT和MY_REPORT_BATT_EVT的事件处理过程,在SimpleSensor.c的zb_ HandleOsaIEvent函数中实现2022/7/1438原理(7)2数据传输无论发送温度信息还是电压信息,都将调用zb_SendDataRequest函数, 在AF.c中定义,负责发送数据。其函数原型为:afStatus_t AF_DataRequest(afAddrType_t *dstAddr* endPoin

45、tDesc_t -x srcEP, uint16 cID, uint16 len. uint8 x buf. uint8 x transID, uint8 Options, uint8 radius) dstAddr-目的地址指针。可选的地址模式有:afAddrNotPresent,表示通过绑定关系指定目的地址;afAddrGroup,向一个组发送数据;afAddrBroadcast,发送广播消息;afAddr16Bit,单播发送。 srcEP-发送节点的端点描述符指针; cID-ClusID; len-发送的字节数; transID-传输序列号,该序列号随着信息的发送而增加; options

46、-发送选项; radius-最大传输半径(发送的跳数)。2022/7/1439原理(8)3数据接收(2)数据接收 在采集节点中,当其接收到传感节点发送昀信息后,将触发SYS_EVENT_MSG事件,并对AF_INCOMING_MSG_CMD信息做出处理。 case AF_INCOMING_MSG_CMD: pMSGpkt一(aflncomingMSGPacket_t*)pMsg; SAPI_ReceiveDatalndication( pMSGpkt - srcAddr. addr. shortAddr, pMSGpkt - clusterld, pMSGpkt - cmd. DataLeng

47、th, pMSGpkt - cmd. Data); break; 即采集节点接收到传感节点发送的信息后,将调用SAPI_ReceiveDatalndication函数进行处理。默认情况下zb_ReceiveDatalndication函数将被调用2022/7/1440SimpleSensor和SimpleConllector温度传感器实验中的绑定1)SimpleSensor 发现可用的协调器时自动绑定到该协调器。 if ( event & MY_FIND_COLLECTOR_EVT ) / Find and bind to a collector device zb_BindDevice( T

48、RUE, SENSOR_REPORT_CMD_ID, (uint8 *)NULL ); 2) SimpleConllector协调器的按键处理函数zb_HandleKeys中,当SW1被按下后,若设备已经进行了初始化,则将调用zb_AllowBind函数,进入允许绑定的模式 / Turn ON Allow Bind mode indefinitelyzb_AllowBind( 0 xFF );HalLedSet( HAL_LED_1, HAL_LED_MODE_ON );2022/7/1441SimpleSensor和SimpleCollector温度传感器实验中的绑定3) SimpleSen

49、sor调用zb_SendDataRequest进行数据发送zb_SendDataRequest的功能是启动一个数据包传输到目标设备。传输的目标可能是对方设备的16位短地址或无效地址(0 xFFFE)。在后一种情况下,数据包将被发送到以前为这个特定的CommandID建立了绑定的设备(S)。zb_SendDataRequest函数立即返回。发送完成时回调函数zb_SendDataConfirm 将被调用。2022/7/1442SimpleAPI中绑定的实现(1)Zigbee2006开始采用Source Binding,也就说发送数据的节点保存绑定表。在绑定响应端zb_AllowBind的实现中,

50、调用了afSetMatch, 该设备对ZDO的匹配描述将做出响应。在绑定请求端Zb_BindDevice的函数实现中,会调用ZDO_AnyClusterMatches和ZDP_MatchDescReq等一系列函数。ZDO_AnyClusterMatches的作用是命令列表匹配比较,ZDP_MatchDescReq的作用是发送一个匹配(Match_Desc_req)消息,尽量与一个处于允许绑定模式 的设备进行匹配。2022/7/1443SimpleAPI中绑定的实现(2)当绑定请求设备发送了匹配消息并有设备(响应设备)对其进行响应时,那么在绑定请求设备中会触发SYS_EVENT_MSG事件,在事

51、件处理函数SAPI_ProcessEvent中会调用ZDO_CB_MSG的处理函数SAPI_ProcessZDOMsgs。case ZDO_CB_MSG: SAPI_ProcessZDOMsgs( (zdoIncomingMsg_t *)pMsg ); break;.在SAPI_ProcessZDOMsgs 的实现代码中,有关于匹配消息响应Match_Desc_rsp的处理,应用程序为所有正确响应的设备建立绑定列表,并通过发送绑定确认消息通知应用上层。从而完成绑定过程。2022/7/1444void SAPI_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )

52、switch ( inMsg-clusterID ) . case Match_Desc_rsp: / 匹配消息的响应消息 zAddrType_t dstAddr; ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg ); if ( sapi_bindInProgress != 0 xffff ) / 创建绑定表项 dstAddr.addrMode = Addr16Bit; dstAddr.addr.shortAddr = pRsp-nwkAddr; if ( APSME_BindRequest( sapi_epDesc.simp

53、leDesc-EndPoint, sapi_bindInProgress, &dstAddr, pRsp-epList0 ) = ZSuccess ) osal_stop_timerEx(sapi_TaskID, ZB_BIND_TIMER); osal_start_timerEx( ZDAppTaskID, ZDO_NWK_UPDATE_NV, 250 ); sapi_bindInProgress = 0 xffff; / Find IEEE addr ZDP_IEEEAddrReq( pRsp-nwkAddr, ZDP_ADDR_REQTYPE_SINGLE, 0, 0 ); / 给上层发

54、送绑定确认消息 zb_BindConfirm( sapi_bindInProgress, ZB_SUCCESS ); break; 2022/7/1445Zigbee绑定绑定是控制信息流在两个设备的应用层之间流动的一种机制。在Z - Stack2006版本中,绑定可以在任何设备上实现,称为源绑定。 绑定允许应用层发送信息而无需指定目的地址APS层从它的绑定表格中确定目的地址,然后在信息前端加上这个目的地址或组地址。注意:在Z - Stack2004版本中所有绑定条目都存储在协调器中,而最新的Z- Stack2006中所有绑定条目都存储在发送数据的设备中。绑定就是在两个设备应用层上的逻辑链接。多

55、重绑定能在一个设备上被创建,另外,一个绑定可能有多个目的设备(一个到多个绑定)。2022/7/1446Zigbee绑定一旦绑定被创建,就可以不需要指定目的地址,在调用函数zb_SendDataRequest()时,只需要将0 xFFFE作为目的地址就可发送数据了。如果设定了NV_RESTORE编译选项绑定信息将保存在非易失性存储器中。当设备意外复位或电池需要充电时,能够自动恢复绑定信息。绑定只能在“互为补充” ( complementary)的设备间被创建。也就是说,当两个设备已经在他们的简单描述符结构中注册为一样的命令ID并且一个作为输入另一个作为输出时,绑定才能成功。2022/7/1447

56、Zigbee绑定绑定表格形式:(as,es,cs)=(ad1|,ed1|),(ad2|,ed2|),(adn| ,edn|)其中:as为绑定源设备的地址; es为绑定源设备EP的标识符; cs为绑定连接的簇标识符; adi为i绑定分配的目的地址或目的组地址; edi为i绑定分配的EP标识符。 注意:只有当adi是一个设备地址时,才会有edi。2022/7/1448Zigbee绑定建立一个绑定表格有三种方式: ZDO绑定请求通过一个命令告诉设备创建一个绑定记录。 ZDO终端设备绑定请求设备能告诉协调器它们想建立绑定记录。该协调器将在这两个设备上创建绑定表格条目。 设备应用设备应用程序能建立或管理

57、一个绑定表。 任何一个设备或应用能在网络中发送一个ZDO信息到另一个设备建立一个绑定记录。2022/7/1449ZDO绑定请求通过调用函数ZDP_BindReq()发送一个绑定请求。第一个参数(dstAddr)是绑定源地址的短地址。这之前应该确定允许绑定,在ZDConfig.h文件中有参数ZDO_BIND_UNBIND_REQUEST允许绑定。 能用同样的参数调用函数ZDP_UnbindReq()移除绑定。 目标设备将调用函数ZDApp_BindRsp()或ZDApp_UnbindRsp()对绑定或解除绑定请求做出应答。,2022/7/1450ZDO终端设备绑定请求该机制是用一个按钮按下或其他

58、类似的动作来选择设备在指定时间内被绑定。在规定时间内,该终端设备绑定请求信息被收集到协调器,并创建一个基于配置( Profile)ID和簇(Cluster)ID的规定的绑定表格条目。默认的终端设备绑定超时时间(APS_DEFAULT_MAX_BINGDING_TIME)为16 s(定义在nwk_globals.h中)但是这个时间可以被改变。 ,2022/7/1451设备应用绑定管理应用层管理绑定表格,即应用层将调用下列函数添加和移除绑定表格条目: bindAddEntry():增加绑定表格条目。 bindRemoveEntry():从绑定表格中移除条目。 bindRemoveClusterld

59、FromList():从绑定表格项目中移除一个簇ID。 bindAddClusterldToIist():添加一个簇ID到一个存在的绑定表格。 bindRemoveDev():移除指定地址的所有绑定条目。 bindRemoveSrcDev():移除源地址的所有条目。 bindUpdateAddr():更新条目到另一个地址。 bindFindExisting():发现一个绑定表条目。 bindlsClusterIDinList():在绑定表条目中核对一个存在的簇。 bindNumBoundTo():同一个地址(源或目的)的条目数。 bindNumOfEntries():表格条目数。 bindCapacity():最大条目允许。 bindWriteNV():在NV中更新表格。 ,2022/7/1452绑定建立的两种机制如果目的设备的扩展地址是已知的,则zb_BindDeviceRequest()函数能创建一个绑定条目。 如果扩展地址是未知的,则通过按键的辅助进行绑定操作。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论