1、无线传感器网络实验教程 绑定实验,主讲教师:柯宗武 2012年12月,Copyright:柯宗武,本章内容,绑定的基本概念 绑定的方法 实例讲解,Copyright:柯宗武,实验内容,协调器通过广播方式绑定终端节点,在液晶屏上显示绑定过程。 终端节点绑定到协调器。绑定成功后发送“Hello World”给协调器并显示。 绑定完成后,按协调器中键(center)时点亮对方的指示灯。,Copyright:柯宗武,预备知识-传感器网络数据通信,Copyright:柯宗武,预备知识- ZigBee网络地址,网络地址 在一个新设备加入网络之后协调器会主动为它分配一个网络地址,以方便在网络中的身分确认 理
2、论地址范围:0-65535 某些专用的地址不会分配给设备 如:0xFFFF是广播地址(所有设备),0xFFFE是广播到FFD设备(全功能设备:路由器),Copyright:柯宗武,预备知识-ZStack中网络地址定义,typedef struct unionuint16 shortAddr;ZLongAddr_t extAddr; addr;byte addrMode; zAddrType_t;,枚举类型 enum AddrNotPresent = 0,AddrGroup = 1,Addr16Bit = 2,Addr64Bit = 3,AddrBroadcast = 15 ;,Copyrigh
3、t:柯宗武,预备知识-应用框架(Application Framework),AF层为各个用户自定义的应用对象提供了模板式的活动空间,为每个应用对象提供了键值对KVP服务和报文MSG服务两种服务供数据传输使用。 每个节点除了64位的IEEE地址,16位的网络地址,每个节点还提供了8位的应用层入口地址,对应于用户应用对象。端点0为ZDO接口,端点1至240供用户自定义用于对象使用,端点255为广播地址,端点241 -254保留将来使用。,Copyright:柯宗武,预备知识-应用框架(Application Framework),每一个应用都对应一个配置文件(Profile)。配置文件包括:设备
4、ID(Device ID),事务集群ID(cluster ID),属性ID(Attribute ID)等。AF可以通过这些信息来决定服务类型。,Copyright:柯宗武,预备知识-profiles,应用profiles是一组统一的消息,消息格式和处理方法,允许开发者建立一个可以共同使用的分布式应用程序,这些应用是利用驻扎在独立设备中的应用实体来实现的。这些应用profiles允许应用程序发送命令、请求数据和处理命令的请求。 总之,配置文件使得ZigBee 设备可以互操作。ZigBee 联盟已经定义了很多标准的配置文件,比如远程控制开关配置文件和智能家居等。任何遵循某一标准配置文件的节点都可以
5、与其他实现相同配置文件的节点进行互操作。 一个public profile也规定了profile 的ID,比如智能家居就规定是0x104。,Copyright:柯宗武,预备知识-簇(cluster),簇标识符可用来区分不同的簇,簇标识符联系着从设备流出和向设备流入的数据。在特殊的应用profiles范围内,簇标识符是唯一的。 cluster要理解成一个大方向下的一个特定对象,比如智能家居下的一个调光器,操作这个调光器就需要一些命令,比如变亮,变暗,关灯,开灯这些,另外,这个调光器也会有一个attribute,也就属性,比如当前的亮度,由亮变暗的过程经历多长时间。,Copyright:柯宗武,预
6、备知识-簇(cluster),总结说来,Profile规范了应该包括哪些cluster,一个cluster会有一个ID,在一个cluster下又会有很多command,也会有很多attibute,在一个cluster下面command 和attribute的ID要唯一,不同的cluster下可以重复,不同的profile下clusterID也可以重复。,Copyright:柯宗武,预备知识- ZigBee设备对象(ZDO),ZigBee设备对象(ZDO),描述了一个基本的功能函数,这个功能在应用对象、设备profile和APS之间提供了一个接口。ZDO位于应用框架和应用支持子层之间。它满足所有
7、在ZigBee协议栈中应用操作的一般需要。此外ZDO还有以下作用: 初始化应用支持子层(APS),网络层(NWK),安全服务规范(SSS)。 从终端应用集合中配置的信息来确定和执行安全管理、发现、网络管理、以及绑定管理。,Copyright:柯宗武,预备知识- ZigBee设备对象(ZDO),ZDO描述了应用框架层中应用对象的公用接口以及控制设备和应用对象的网络功能。在终端节点0, ZDO提供了与协议栈中与低一层连接的接口,如果是数据则通过APSDE-SAP,如果是控制信息则通过APSME-SAP。 APS数据实体(APSDE)提供在同一个网络中的两个或者更多的应用实体之间的数据通信。通过AP
8、SDE服务接入点(APSDE-SAP); APS管理实体(APSME)提供多种服务给应用对象,这些服务包含安全服务和绑定设备,并维护管理对象的数据库,也就是我们常说的AIB。,Copyright:柯宗武,预备知识- ZDO与Profile的关系,ZDO是ZigBee设备对象,属于特殊的Endpoint(特制自己);Profile面向某个应用的公约或准则,包括5种描述项;AF是应用层。 Profile是法律条款, ZDO是逻辑工作实体(自己); Profile中的多种描述项是条例、是图纸, ZDO是具体实现。,以上内容详见ZigBee2007协议规范,Copyright:柯宗武,绑定 (Bind
9、ing)的基本概念,绑定是一种两个 ( 或者多个 ) 应用设备之间信息流的控制机制 。 绑定允许应用程序发送一个数据包而不需要知道目标地址。 APS 层从它的绑定表中确定目标地址 ,然后将数据继续向目标应用或者目标组发送 当两个设备已经在他们的简单描述符结构中登记为一样的簇ID,并且一个作为输入另一个作为输出时,绑定才能成功。 绑定服务是针对设备端点上的簇,用户程序只需要提供端点号和簇ID,就可以通过绑定表找到对应的被绑定的节点的网络地址和端点号,从而实现无线数据的发送,Copyright:柯宗武,建立绑定表,有四种方法可以建立一个绑定表: ZigBee Device Object Bind
10、Request(Match方式) 一个启动工具可以告诉设备创建一个绑定记录 ZigBee Device Object End Device Bind Request 两个设备可以告诉协调器它们想要建立一个绑定表记录。协调器来协调并在两个设备中创建绑定表记录。 Device Application 一个设备上的应用程序建立或者管理一个绑定表 由管理员手工绑定 通过pc机串口发送绑定命令,集中管理。,Copyright:柯宗武,ZigBee Device Object Bind Request,任何一个设备都可以发送一个 ZDO 信息给网络中的另一个设备,用来建立绑定表。称之为援助绑定,它可以为一
11、个发送设备创建一个绑定记录。 Match方式 一个节点可以通过调用afSetMatch函数允许或禁止本节点被Match(协议栈默认允许,可以手工关闭),然后另外一个节点在一定的时间内发起ZDP_MatchDescReq请求,允许被Match的节点会响应这个Req,发起的节点在接收到RSP的时候就会自动处理绑定。,Copyright:柯宗武,Match方式,网络中不一定有协调器存在,但是有A、B、C、D等多个节点,A性质是Outcluster,B、C、D的性质是Incluster,你可以通过按键策略来在一定时间内允许B、C、D中的任何一个开启被Match的功能,同时A发起Match请求(广播的)
12、,那么被允许Match的节点就会在收到请求后将自己的信息返给A,A在得到rsp的时候来处理绑定,,Copyright:柯宗武,Match方式绑定流程,Copyright:柯宗武,Match方式绑定流程,Copyright:柯宗武,ZigBee Device Object End Device Bind Request,这个机制是在指定的时间周期 (timeout period) 内 , 通过按下选定设备上的按钮或者类似的动作来绑定。协调器在指定的时间周期内,搜集终端设备的绑定请求信息,然后以配置 ID(Profile ID) 和簇ID(Cluster ID) 协议为基础,创建一个绑定表记录作为
13、结果。默认的设备绑 定时间周期(APS_DEFAULT_MAXBINDING_TIME) 是 16 秒钟 ( 在 nwk_globals.h 中定义 ) 。但是将它添加到f8wConfig.cfg 中,则可以更改。,Copyright:柯宗武,ZigBee Device Object End Device Bind Request 绑定程序流程,在 GenericApp.c 中的GenericApp_HandleKeys 函数中首先确定目的地址类型及目的地址,然后调用 ZDApp_SendEndDeviceBindReq() 函数ZDApp_SendEndDeviceBindReq搜集所有终端
14、节点的请求信息,然后调用 ZDP_EndDeviceBindReq() 【userApp.c】函数将这些信息通过fillAndSend()【ZDProfile.c】函数调用AF_DataRequest() 【ZDProfile.c】函数发送给协调器。,Copyright:柯宗武,ZigBee Device Object End Device Bind Request 绑定程序流程,协调器调用函数ZDApp_ProcessOSALMsg()【ZDApp.c】 ZDApp_ProcessOSALMsg调用函数 ZDP_IncomingData() 【 ZDProfile.c 】函数接收这些信息。
15、ZDApp_ProcessMsgCBs函数处理响应信息,调用ZDO_MatchEndDeviceBind()【 ZDObject.c 中】函数来处理这个请求。,Copyright:柯宗武,ZigBee Device Object End Device Bind Request 绑定程序流程,当收到两个匹配的终端设备绑定请求,协调器在请求设备中启动创建源绑定记录的进程。假设在ZDO 终端设备中发现了匹配的请求,协调器将执行下面的步骤: 发送一个解除绑定请求给第一个设备。这个终端设备锁定进程,这样解除绑定被首先发送来去掉一个已经存在的绑定记录。 等待 ZDO 解除绑定的响应,如果响应的状态是 ZD
16、P_NO_ENTRY ,则发 送一个 ZDO 绑定请求,Copyright:柯宗武,ZigBee Device Object End Device Bind Request 绑定程序流程,在源设备中创建一个绑定记录。如果状态是 ZDP_SUCCESS ,则继续前进到第一个设备的簇ID 。 等待 ZDO 绑定响应,如果收到了,则继续前进到第一个设备的下一个簇ID 。 当地一个设备完成后,用同样的方法处理第二个设备。 当第二个设备也完成之后,发送 ZDO 终端设备绑定请求消息给两个设备。,Copyright:柯宗武,Device Application,另一种进入设备绑定记录的方式是应用自己管理绑
17、定表 。 这就意味着应用程序需要通过调用下面的绑定管理函数在本地进入并且删除绑定记录: bindAddEntry() 在绑定表中增加一个记录 bindRemoveEntry() 从绑定表中删除一个记录 bindRomoveClusterIdFromList() 从一个存在的绑定表记录中删除一个群 ID bindAddClusterIdToList() 向一个已经存在的绑定记录中增加一个群 ID bindRemoveDev() 删除所有地址引用的记录,Copyright:柯宗武,Device Application,bindRemoveSrcDev() 删除所有源地址引用的记录 bindUpda
18、teAddr() 将记录更新为另一个地址 bindFindExisting() 查找一个绑定表记录 bindIsClusterIdInList() 在表记录中检查一个已经存在的群 ID bindNumBoundTo() 拥有相同地址 ( 源或者目的 ) 的记录的个数 bindNumEntries() 表中记录的个数 bindCapacity() 最多允许的记录个数 bindWriteNV() 在 NV 中更新表,Copyright:柯宗武,实例讲解-预备知识(ENDPOINT 一般描述符),每个ENDPOINT都必须有一个Zigbee简单描述。这些描述对Zigbee网络刻画了这个ENDPOIN
19、T ,其他设备可以询问这个终端以知道这个设备的类型。,Copyright:柯宗武,实例讲解-预备知识(ENDPOINT 一般描述符),/ Simple Description Format Structure typedef struct byte EndPoint;uint16 AppProfId;uint16 AppDeviceId;byte AppDevVer:4;byte Reserved:4; / AF_V1_SUPPORT uses for AppFlags:4.byte AppNumInClusters;cId_t *pAppInClusterList;byte AppNumOu
20、tClusters;cId_t *pAppOutClusterList; SimpleDescriptionFormat_t;,Copyright:柯宗武,实例讲解-预备知识(ENDPOINT 一般描述符),EndPoint 端口号:1-240 这是节点的子地址,用来接收数据 AppProfId 定义了这个终端上支持的Profile ID), ID最好遵循由ZigBee联盟的分配。 AppDeviceId 终端支持的设备ID,ID最好遵循ZigBee联盟的分配。 AppDevVer 此终端上设备执行的设备描述的版本:0x00为Version 1.0. Reserved 保留 AppNumInC
21、lusters 终端支持的输入簇数目 pAppInClusterList 指向输入Cluster ID列表的指针 AppNumOutClusters 终端支持的输出簇数目 pAppOutClusterList 指向输出Cluster ID列表的指针,Copyright:柯宗武,实例讲解-预备知识(ENDPOINT 描述符),节点中的每一个ENDPOINT都必须有一个设备描述符 typedef struct byte endPoint;byte *task_id; / Pointer to location of the Application task ID.SimpleDescription
22、Format_t *simpleDesc;afNetworkLatencyReq_t latencyReq; endPointDesc_t;,task_id -任务ID指针,当接收到消息时,此任务ID将指示消息传递目的。接收到的消息是以OSAL消息形式包装的,将发送到一个任务。,simpleDesc -指向这个终端的ZigBee简单描述。 。,必须用noLatencyReqs来填充。,Copyright:柯宗武,实例讲解-预备知识(设备注册函数),afStatus_t afRegister( endPointDesc_t *epDesc ); 为设备注册一个新的终端 epDesc -指向终端描
23、述符 返回值:afStatus_t -若成功则返回ZSuccess,否则返回ZComDef.h中定义的错误,Copyright:柯宗武,实例讲解-预备知识(发送数据的函数),afStatus_t AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP, uint16 cID, uint16 len, uint8 *buf, uint8 *transID, uint8 options, uint8 radius );dstAddr -目标地址指针。 srcEP -发送终端的终端描述符指针 cID -簇ID len -要发送的字节数
24、 buf -指向要发送的数据缓存的指针 transID -事务序列号指针。如果消息缓存发送,这个函数将增加这个数字,Copyright:柯宗武,实例讲解-预备知识(发送数据的函数),options -发送选项,可以由下面一项,或几项相或得到 AF_ACK_REQUEST 0x10 要求APS应答,这是应用层的应答,只在直接发送(单播)时使用。 AF_DISCV_ROUTE 0x20 总要包含这个选项 AF_SKIP_ROUTING 0x80 设置这个选项将导致设备跳过路由而直接发送消息。终点设备将不向其父亲发送消息。在直接发送(单播)和广播消息时很好用。 radius 最大的跳数,用默认值AF
25、_DEFAULT_RADIUS afStatus_t 成功则为ZSuccess(defined in ZComDef.h). 否则 Errors(defined in ZComDef.h),Copyright:柯宗武,实例讲解-预备知识(绑定请求),ZDP_EndDeviceBindReq参数说明 afStatus_t ZDP_EndDeviceBindReq(zAddrType_t *dstAddr,uint16 LocalCoordinator,byte endPoint,uint16 ProfileID,byte NumInClusters, cId_t *InClusterList,b
26、yte NumOutClusters, cId_t *OutClusterList,byte SecurityEnable ),dstAddr:协调器地址,有协调器协助进行绑定; LocalCoordinator:需要绑定的节点网络地址(本节点地址); endPoint:需要绑定的端点号; ProfileID:协议ID; NumInClusters:输入簇个数; InClusterList:输入簇列表; NumOutClusters:输出簇个数; OutClusterList:输出簇列表;,Copyright:柯宗武,实例讲解-预备知识(绑定匹配应答),afStatus_t ZDP_Match
27、DescReq( zAddrType_t *dstAddr, uint16 nwkAddr,uint16 ProfileID,byte NumInClusters, cId_t *InClusterList,byte NumOutClusters, cId_t *OutClusterList,byte SecurityEnable ),Copyright:柯宗武,实例讲解,定义输入、输出簇 定义两个设备描述 用户任务初始化 用户任务处理函数 按键处理 上键-ENDDEVICE 发起绑定请求 右键-CORDINATER发起绑定请求 左键-启动Match方式 中键-要求添加一个程序,按下CORDI
28、NATER中键控制ENDDEVICE一个灯,Copyright:柯宗武,绑定表演程序简介,Copyright:柯宗武,绑定表演-1,重新依次启动协调器、路由节点及终端节点。 等待节点都加入网络后。 把路由节点或终端节点的摇杆按键向右拔,OLED显示:,Copyright:柯宗武,绑定表演-2,然后把另一个节点的摇杆按键也向右拔,OLED显示:,如果绑定成功,两个节点同时显示:,Copyright:柯宗武,绑定表演-3,如果两个节点绑定成功后,这两个节点会启动超时定时器,每隔3秒向对方发送一次数据,另一个节点接收到数据后显示出来,并显示接收到数据的次数,如图:,Copyright:柯宗武,实例讲
29、解2,自动匹配 使用IAR7.51打开“ProjectszstackSamples GenericApp CC2530DB”中工程文件“GenericApp.eww”。 查看物理地址,两个节点物理地址不能相同 修改PANID,每个同学不一样。,Copyright:柯宗武,代码讲解,GenericApp.c GenericApp_HandleKey() ZDP_MatchDescReq ();发送绑定请求 fillAndSend (); AF_DataRequest ();将打包好的数据通过无线的形式发送出去 ,注意是发给ZDO层地址 ZDO层接收到无线数据包后,会产生一个AF_INCOMING
30、_MSG_CMD消息,Copyright:柯宗武,代码讲解,ZDApp.c ZDP_IncomingData ();/将消息按指定格式提取出来,并将消息路由到不同函数进行处理:将在ZDO注册过的回调消息,转交到回调消息响应部分处理;将指定的簇交由对应函数处理。 handled = ZDO_SendMsgCBs( / 在文件ZDProfile.c中注册绑定消息处理函数ZDO_ProcessMatchDescReq(),Copyright:柯宗武,代码讲解,ZDO_ProcessMatchDescReq ();/遍历本设备中注册过的端点描述符,使每个端点描述符的簇列表与无线收到簇列表进行匹配。 Z
31、DP_MatchDescRsp ();/成功匹配,发送Match_Desc_rsp 消息 在应用层注册有匹配描述符响应消息,当无线接收到响应数据包,在应用层回产生一个ZDO_CB_MSG消息。并调用GenericApp_ProcessZDOMsgs函数进行处理,Copyright:柯宗武,代码讲解,GenericApp_ProcessZDOMsgs() case Match_Desc_rsp: ZDO_ParseEPListRsp ();/对接收到的信息包进行解析,并将解析得到地址信号保存起来,作为通信的依据。 在应用层注册匹配描述符响应: ZDO_RegisterForZDOMsg( Gen
32、ericApp_TaskID, Match_Desc_rsp );,Copyright:柯宗武,编写无线应用程序的基本流程,定义简单描述符 定义输入、输出簇ID,注意要绑定的一对簇ID要一样 发送绑定请求 ZDP_EndDeviceBindReq或 ZDP_MatchDescReq 绑定成功后通过调用AF_DataRequest发送无线信息 接收方在AF_INCOMING_MSG_CMD消息下对接收消息进行处理,根据簇ID决定相应动作,Copyright:柯宗武,Thanks,Copyright:柯宗武,参考,采集节点zmain初始化sapiinit初始化进入事件按键事件(设置设备类型和启动方
33、式)进入事件启动设备请求检查设备逻辑类型是否正确初始化设备设置一个网络初始化事件(初始化网络)交给zdapp处理网络形成请求网络形成确认(反馈信息)网络启动事件处理ZDO状态改变事件处理更新网络状态向sapi发送ZDO状态改变事件启动确认【至此采集节点已经启动】按键事件(允许绑定)【至此采集节点已设置完毕】传感节点zmain初始化sapiinit初始化进入事件按键事件(设置设备类型和启动方式)进入事件启动设备请求检查设备逻辑类型是否正确初始化设备设置一个网络初始化事件(初始化网络)交给zdapp处理网络发现请求网络发现确认向ZDO发送网络发现处理信息网络层加入请求网络加入确认向ZDO发送网络加
34、入处理信息设置ZDO状态改变事件更新网络向sapi发送ZDO状态改变事件启动确认【至此传感节点已经启动】向sapi发送发现并绑定采集节点事件(包含于用户事件)(发现采集节点后)向采集节点发送匹配描述符请求消息(包含于系统消息)采集节点处理匹配描述符消息处理(ZDO层ZDO_ProcessMatchDescReq)如果找到与之匹配描述符,就给传感节点发送响应信息传感节点处理匹配响应(由于初始化时已经在sapi层注册了匹配响应,响应就在sapi层处理)设置网络更新事件(空操作)查找绑定设备的IE地址(向采集节点发送IE地址请求)采集节点处理传感节点的请求(包含于ZDO层AF消息输入处理)并查找自己的IE地址,将其发送给传感节点(由于未在sapi层注册IE地址响应处理,那么就在ZDApp层处理(包含在ZDO层AF消息输入处理)传感节点对IE地址做响应处理(更新网络地址和IE地址)向应用程序绑定确认消息设置用户事件(开始处理用户函数)发送数据给采集节点采集节点处理接收到的数据(sapi层AF消息输入处理),