zigbee学习笔记-----Z-Stack协议栈的使用

学习zigbee其实就是学习zigbee的协议栈,协议栈我选择的是Z-Stack2.5.1a,虽然zigbee3.0已经出来了,但是作为学习选择Z-Stack2.5.1a最大的理由就是Z-Stack2.5.1a版本发行的较早,资料较多,易于学习。

对于初学者来讲个人觉得没有必要把协议栈全部搞懂,只需要搞懂应用层,OSAL调度机制,一些常用的API函数,能够根据需要修改部分宏定义以及网络层的部分代码,能够做到这些这个协议栈使用起来应该就没什么问题了。研究协议栈的代码这个是很不推荐的,新手在没有对协议栈很了解的情况下去看代码是很容易迷路的,并且这个协议栈关于路由算法和加密技术是不开源的,所以经常就是看着看着就全靠猜测了。

那么这个协议栈大体框架是怎样的呢?在经过连续的踩坑后我终于有了一些心得体会。首先要先了解协议栈的目录结构:

 

由于我也是初学者所以目前只对app层和nwk进行过修改,tool下的配置文件是需要根据项目的不同需求来进行更改的。

关于MT我暂时还没有对其进行深入的研究,只是在论坛中了解到MT一般不用,但是里面有很多功能的实现很值得借鉴参考,MT与官方自带的调试工具相配合可以实现对各层的控制,详情请参考MT层简介

关于官方的HAL库,在使用时我对里面的按键,led,以及串口进行了重写。初学者最好还是不要动官方的源码,自己再另写一个就好了。

介绍完Z-Stack的目录结构再来讲一下zigbee协议栈中各层的作用。

应用层

ZigBee应用层共分为4个部分,分别是应用支持子层(Application Support Layer,APS)、应用框架层、ZigBee设备对象层(ZigBee Device Objects,ZDO)和ZigBee设备对象的管理平台。

应用框架层(AF)

AF层的功能就是管理一个设备中所有可用的端点(1 ~ 240)。

以下是我对AF的一些理解:

  1. 一个端点可以关联一个应用任务,也可以多个端点关联一个应用任务,即系统中应至少有一个应用任务
  2. AF提供了一个如何在Zigbee协议栈上及案例一个规范的描述。它规定了规范的一系列的标准数据类型,协助服务发现的描述符,传输数据的帧格式等等。
  3. 端口主要是处理接受数据和发送数据。
  4. 接收数据时只有相应的端口在本地被注册时才会将这一帧数据交给相应的应用层任务。这点其实不难理解,就像计算机中应用程序有不同的网络端口号一样,只有端口号匹配上了系统才会将网络中接受到的数据送到相应的端口也就是应用任务。
  5. 虽然AF的主要功能为管理端口,但是有一点需要注意ZDO管理的端点0并不在AF的管理范围之内,AF只管理端口号为1~240的端点。AF和ZDO都在APS的上一层,但是AF的某些功能需要ZDO来完成。
  6. 在使用一个端点时要先使用afRegister来注册一个端点,不然这个端点的是收不到数据的。
  7. 应用层通过AF_DataRequest函数发送无线数据
  8. afIncomingData函数接受到数据后将数据送到相应的端口,下面是关于这个流程的总结

extern void afIncomingData( aps_FrameFormat_t *aff, zAddrType_t *SrcAddress,                       

                                              uint8 LinkQuality, byte SecurityUse, uint32 timestamp );

作用:在APS层接收到数据后,会调用这个函数,函数内部调用afBuildMSGIncoming(), 如果项目中定义了MT_AF_CB_FUNC,则向MT注册SPI_CB_AF_DATA_IND事件,否则向应用层注册 AF_INCOMING_MSG_CMD事件,两者只取其一。

以下为系统处理来自AF层数据包的大致流程

afIncomingData() 

     --> afBuildMSGIncoming()

          --> osal_msg_send() 

             --> osal_set_event() 

                 --> 根据task_id调用事件处理函数(如SampleApp_ProcessEvent())

                     --> 判断具体事件类型调用相应回调函数(如SampleApp_MessageMSGCB())

                          --> 实现具体现象

afIncomingData()函数用来从APS层传递一个ASDU到AF层;中间调用了afBuildMSGIncoming()函数,这个函数是用来为APS层建立一个特定格式的消息包,然后再调用osal_msg_send()把消息(包含了ASDU)传往AF层。在afBuildMSGIncoming()函数中只有当端口号匹配上时才会调用osal_msg_send()上传消息,如果是组播的话还要看这个组是否已经和要发送的端点关联在了一起,如果没有关联的话会直接返回,不会上传消息。

 

APS:应用支持子层

APS子层的主要功能是保存绑定表并让对应的设备之间传递信息。ZigBee应用支持子层在网络层和应用层之间设置一组ZigBee设备对象,这些对象与厂商定义的应用对象相匹配,并提供网络层到应用层之间的通信服务接口。应用支持子层分为两个部分,分别是APS数据实体(APSDE)和APS管理实体(APSME)。在一个子网中的两个或多个设备可以通过数据实体服务接入点APSDE-SAP来进行数据通信;APSME对这个接入点提供服务机制进行管理,主要功能是接收设备请求并保存设备的状态,这样APSME就包含了一个管理对象的数据库即APS信息库(AIB)。

应用支持子层负责提供了一个数据服务给应用和Zigbee设备规范。它也提供一个管理服务以维护绑定链接和它自己绑定表的存储。

 

ZDO(zigbee设备对象层)


     一个端点对应一个任务,一个任务都有唯一的任务号及任务处理函数,ZDO_RegisterForZDOMsg()在相应的任务中注册事件,并且每一个事件只能被成功的注册一次。注册的实质是将注册的信息通过ZDO_Msg_t的形式加入到链表中,其中zdoMsgCBs保留链表的头指针。


    无线数据的发送和接收:1.发送端:先将无线数据包发送到下层,直到物理层,物理层将数据包一无线电波的形式发送出去 。
                                            2.接收端:当有无线数据包到来时,节点的最下层,也就是物理层将接收到这个无线数据包,然后层层上传,直到应用层。(数据包在到达应用层之前就已经被解析完成了。不用关注怎样解析数据包)


      ZDO是一个特殊的应用层的端点(Endpoint),ZDO占用每个节点(node)的0终端(Endpoint0)。它是应用层其他端点与应用子层管理实体交互的中间件。应用程序通过端点0可以与zigbee堆栈的其他层通信,所有端点都使用应用支持子层(APS)提供服务。


    一个任务可以有16个事件,而每一个事件可以有256个消息,从0x00-0xff。其中SYS_EVENT_MSG是系统的事件,KEY_CHANGE应该是属于SYS_EVENT_MSG事件下的消息,其实这样说不是很准确,它只是包括在传递的消息中,表现的形式还是一个事件,但是它不属于一个任务中16个事件之一,本质上还是SYS_EVENT_MSG下的子事件。


      ZDO的配置叫做ZDP(ZigBee设备配置ZigBee Device Profile)ZDP可以被应用终端(application end points)和ZigBee节点访问。

Zigbee设备对象层定义了一个设备在网络中的角色(协调器、路由器或者终端节点),发起或者应答绑定和发现请求,并在网络设备间建立一个安全关系。它同时也提供定义了Zigbee设备规范里的一套丰富的管理指令。Zigbee设备对象总是为端点0。

ZDO的主要功能是分配相关的设备在ZigBee网络中的角色(如ZigBee协调器或终端设备),同时接受设备的请求然后为设备提供的应用服务进行设定,最后对鄭定的请求进行初始化并响应,并对相关的设备进行安全性保护。

ZDO层使用的端口0其实也就是众多端口中的一个,只不过这个端口比较特殊,他的功能已经被协议栈提前定义好了。我们知道ZDO主要是处理一些网络中设备与设备之间的联系(如入网请求等),并且这些联系最终的表现形式其实就是一帧帧的数据,所以处理起来的流程和AF其他端点的处理流程大致相同,(以下为个人猜想)接受到数据先判断端口号,然后根据不同帧的类型和功能号去执行不同的事件。

关于ZDO_RegisterForZDOMsg注册事件的详细说明

ZDO_RegisterForZDOMsg可以注册一个事件或者说是注册一个子事件,通过ZDO_RegisterForZDOMsg注册的事件都是在ZDO_CB_MSG事件的回调函数中处理的。

ZDO_RegisterForZDOMsg可以注册如下事件

ZDO_RegisterForZDOMsg( TaskID, End_Device_Bind_rsp );//ZDO注册End_Device_Bind_rsp

ZDO_RegisterForZDOMsg( TaskID, Match_Desc_rsp );     //ZDO注册Match_Desc_rsp

ZDO_RegisterForZDOMsg( TaskID, Device_annce);        //ZDO注册Device_annce

ZDO_RegisterForZDOMsg( TaskID, Active_EP_rsp);       //ZDO注册Active_EP_rsp

ZDO_RegisterForZDOMsg( TaskID, Simple_Desc_rsp);     //ZDO注册Simple_Desc_rsp

ZDO_RegisterForZDOMsg( TaskID, NWK_addr_rsp);        //ZDO注册NWK_addr_rsp

以Match_Desc_rsp 为例来说明ZDO注册事件的一般操作流程

1、在ZDNwkMgr_Init中加入要注册的事件如

ZDO_RegisterForZDOMsg( ZDNwkMgr_TaskID, Match_Desc_rsp );//注册组播回调

2、在ZDO_CB_MSG的回调函数中添加

case Match_Desc_rsp:
        ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
        if ( pRsp )
        {
          if ( pRsp->status == ZSuccess && pRsp->cnt )
          {
            ZG_Serial_Control_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
            ZG_Serial_Control_DstAddr.addr.shortAddr = pRsp->nwkAddr;
            // Take the first endpoint, Can be changed to search through endpoints
            ZG_Serial_Control_DstAddr.endPoint = pRsp->epList[0];
          }
          osal_mem_free( pRsp );
        }
      break;

这样就可以在设备完成绑定后触发Match_Desc_rsp事件,然后处理绑定后得到的绑定信息,也就是目标设备的地址信息。

 

NWK:网络层

网络层是半开源的,核心代码不开源,比如路由算法不开源;包含有网络层配置参数文件及网络层库的函数接口文件,APS层库的函数接口。主要负责路径选择和数据转发。

网络层对MAC和应用层提供接口并管理网络结构和路由。路由通俗的说就是选择一条路径将数据传输到目的设备。在ZigBee网络中,终端设备并没有路由发现的能力,但Zi班ee协调器和路由则具此功能。ZigBee协调器的网络层建立并维持整个网络的正常工作,选择网络的拓扑结构(树,星型或者mash),保持和终端设备间的通讯。此外,ZigBee协调器还能给设备分配标识码。

网络层首先确保MAC层具备正常的工作的能力,同时为应用层提供服务接口。网络层包含网络层数据实体(NLDE)和网络管理实体(NLDE)在内的两个服务实体。

 

MAC:数据链路层

数据链路层包含MAC层的参数配置文件以及MAC的LIB库的函数接口文件。负责为节点和它的直接邻居之间提供可靠的通信链路,提供冲突避免以提高通信效率。帮助避免碰撞和提高效率,MAC层还负责打包和分解数据。

MAC层主要提供两种服务:MAC数据服务和通过MAC层管理接口实体(MLME/SAP)接入点实现的MAC层管理服务。MAC提供接口给NWK调用,它也负责生成信标帧和通过信标帧控制设备同步(在z-Stack中只有非信标模式)。MAC层数据服务中MCPS-SAP支持两个对等的SSCS实体之间SSCS协议数据单元(SPUD)的传输。MAC层管理服务中MLME-SAP支持在MAC层和其上层之间传递管理命令。

(信标模式管理;信道接入;通信链路;发送连接及断开连接请求;)注:在Z-Stack中只有非信标模式

 

PHY:物理层

物理层主要负责数据的调制与解调,发送和接收。射频模块处于这一层。PHY提供两种服务:PHY数据服务和通过物理层管理实体接口(PLME)实现的PHY管理服务。PHY数据服务是通过无线物理信道的发送和接收物理层协议数据单元(PPDU)来实现的。物理层提供给MAC层与物理无线信道之间的接口是通过通过射频固件和硬件实现的。负责将数据通过天线发送和接收。

(RSSI、LQI之间可以换算;射频接收;能量检测;信道选择;通过物理媒介传输和接收数据)

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值