Zigbee的术语
重点弄懂它们的从属关系,主要包括:节点,设备,端点,簇(群集),属性。
属性Attribute是一个反映物理数量或状态的数据值,比如开关值(On/Off),温度值、百分比等。
群集Cluster是包含一个或多个属性(attribute)的群组。简单的说,群集就是属性的集合。每个群集都被分配一个唯一的群集ID且每个群集最多有65536个属性。设备描述DeviceDescription是指一个大型目标应用的一部分,包括一个或多个群集,并且指定群集是输入还是输出。描述符有:节点描述符、电源描述符、简单描述符、端点描述符。
端点EndPoint是协议栈应用层的入口,也可以理解应用对象(ApplicationObject)存在的地方,它是为实现一个设备描述而定义的一组群集。(程序中的20吧)每个ZigBee设备可以最多支持240这样的端点,这也意味着在每个设备上可以定义240个应用对象。端点0被保留用于与ZDO接口,这是每个ZigBee设备必须使用的端点,而端点255被保留用于广播,端点241-254则被保留用于将来做扩展使用。
设备设备描述 Device Description 是指一个大型目标应用的一部分,包括一个或多个群集,并且指定群集是输入还是输出。描述符有:节点描述符、电源描述符、简单描述符、端点描述符。
节点 Node 也可以理解为一个容器,包含一组 ZigBee 设备,分享一个无线信道。每个节点有且只有一个无线信道使用。
绑定问题
在zigaee协议中定义了一种特殊的操作,叫做绑定(binding)操作。它能够通过使用ClusterID为不同节点上的独立端点建立一个逻辑上的连接。
要实现绑定操作,端点必须向协调器发送绑定请求,协调器在有限的时间间隔内接收到两个端点的绑定请求后,便通过建立端点之间的绑定表在这两个不同的端点之间形成了一个逻辑链路。因此,在绑定后的两个端点之间进行消息传送的过程属于消息的间接传送。其中一个端点首先会将信息发送到ZigBee协调器中,ZigBee协调器在接收到消息后会通过查找绑定表,将消息发送到与这个端点相绑定的所有端点中,从而实现了绑定端点之间的通信。
路由协议(RoutingProtocol)
当路由器从他自身的应用程序或者别的设备那里收到一个单点发送的数据包,则网络层(NWKLayer)根据一下程序将它继续传递下去。如果目标节点是它相邻路由器中的一个,则数据包直接被传送给目标设备。否则,路由器将要检索它的路由表中与所要传送的数据包的目标地址相符合的记录。如果存在与目标地址相符合的活动路由记录,则数据包将被发送到存储在记录中的下一级地址中去。如果没有发现任何相关的路由记录,则路由器发起路径寻找,数据包存储在缓冲区中知道路径寻找结束。
ZigBee终端节点不执行任何路由功能。终端节点要向任何一个设备传送数据包,它只需简单的将数据向上发送给它的父亲设备,由它的父亲设备以它自己的名义执行路由。同样的,任何一个设备要给终端节点发送数据,发起路由寻找,终端节的的父亲节点都已它的名义来回应
注意ZigBee地址分配方案使得对于任何一个目标设备,根据它的地址都可以得到一条路径。在Z-Stack中,如果万一正常的路径寻找过程不能启动的话(通常由于缺少路由表空间),那么Z-Stack拥有自动回退机制
在Z-Stack中,执行的路由已经优化了路由表记录。通常,每一个目标设备都需要一条路由表记录。但是,通过把一定父亲节点记录与其子所有子结点的记录合并,这样既可以优化路径也可以不丧失任何功能
路径发现与选择
路径发现是网络设备凭借网络相互协作发现和建立路径的一个过程。路由发现可以由任意一个路由设备发起,并且对于某个特定的目标设备一直执行。路径发现机制寻找源地址和目标地址之间的所有路径,并且试图选择可能的最好的路径
路径选择就是选择出可能的最小成本的路径。每一个结点通常持有跟它所有邻接点的“连接成本(linkcosts)”。通常,连接成本的典型函数是接收到的信号的强度。沿着路径,求出所有连接的连接成本总和,便可以得到整个路径的“路径成本”。路由算法试图寻找到拥有最小路径成本的路径
路径通过一系列的请求和回复数据包被发现。源设备通过向它的所有邻接节点广播一个路由请求数据包,来请求一个目标地址的路径。当一个节点接收到RREQ数据包,它依次转发RREQ数据包。但是在转发之前,它要加上最新的连接成本,然后更新RREQ数据包中的成本值。这样,沿着所有它通过的连接,RREQ数据包携带着连接成本的总和。这个过程一直持续到RREQ数据包到达目标设备。通过不同的路由器,许多RREQ副本都将到达目标设备。目标设备选择最好的RREQ数据包,然后发回一个路径答复数据包(aRouteReply)RREP给源设备。RREP数据包是一个单点发送数据包,它沿着中间节点的相反路径传送直到它到达原来发送请求的节点为止
一旦一条路径被创建,数据包就可以发送了。当一个结点与它的下一级相邻节点失去了连接(当它发送数据时,没有收到MACACK),该节点向所有等待接收它的RREQ数据包的节点发送一个RERR数据包,将它的路径设为无效。各个结点根据收到的数据包RREQ、RREP或者RERR来更新它的路由表
路径维护
中间节点沿着连接跟踪传送失败,如果一个连接被认定是坏链,那么上游节点将针对所有使用这条连接的路径启动路径修复。节点发起重新发现直到下一次数据包到达该节点,标志路径修复完成。如果不能够启动路径发现或者由于某种原因失败了,节点则向数据包的源节点发送一个路径错误包(RERR),它将负责启动新路径的发现。这两种方法,路径都自动重建。
路径期满
路由表为已经建立连接路径的节点维护路径记录。如果在一定的时间周期内,没有数据通过沿着这条路径发送,这条路径将被表示为期满。期满的路径一直保留到它所占用的空间要被使用为止。设臵ROUTE_EXPIRY_TIME为期满时间,单位为秒。如果设臵为0,则表示关闭自动期满功能。
Z-Stack协议栈总体设计
Z-Stack由main()函数开始执行,main()函数共做了2件事:一是系统初始化,另外一件是开始执行轮转查询式操作系统,
任务初始化osalInitTasks(void)中的任务需要与声明的任务列表pTaskEventHandlerFn tasksArr[]中的顺序一致。
设置事件发生标志。我知道的有两种方式。
1、osal_set_event(uint8task_id,uint16event_flag)
2、osal_start_timerEx(uint8taskID,uint16event_id,uint16timeout_value)
第一种方法直接设置标志flag置位,第二种方式则等待timeout_value时间然后再设置置位。
ZigBee2007协议栈中使用的各个层次:
设备对象层,即ZDO(ZigBeeDeviceObject)层,提供了管理一个ZigBee节点所要使用的功能函数。ZDOAPI为协调器、路由器和终端设备提供了应用端点的管理函数,其中包括:建立、发现和加入一个ZigBee网络,绑定应用端点和安全管理。
应用框架层,即AF(ApplicationFramework),提供了针对协议栈的应用端点(EndPoint1~240)和设备对象端点(EndPoint0)接口,其中主要包含:设备描述数据结构和数据收、发函数。在ZigBee应用中,提供2种标准服务类型:键值对(KVP)或报文(MSG)
应用支持子层,即APS(ApplicationSupportSublayer),为设备对象和应用实体提供了一系列的支持服务
网络层,即NWK(ZigBeenetwork),为上层提供了管理服务和数据服务。
介质访问层,即ZMAC,在802.15.4MAC与网络层之间提供接口
运行 在 ZigBee 协 议 栈上 的 应用 程 序实 际上 就 是厂 商 自定 义的 应 用对 象 ,并 且 遵循 规 范(profile)运 行 在端 点 1~ 240 上 。在 ZigBee 应 用中 , 提供 2 种 标 准服 务类 型 :键 值 对(KVP) 或 报文 ( MSG)
应用函数接口
ZDO
设备网络启动
设备和服务发现
终端设备绑定、绑定和取消绑定服务
网络管理服务
设备网络启动
ZDApp_Init()—>ZDOInitDevice()
但是如果定义了HOLD_AUTO_START,则不进行设备网络启动,等待按键控制启动
启动过程的要点
无论是协调器还是路由器或是终端设备,其启动过程至网络初始步骤均是一样的,只是不同设备的配置文件在编译时有所区别:
协调器:F8wCoord.cfg
-DZDO_COORDINATOR // Coordinator Functions
-DRTR_NWK // Router Functions
路由器:F8wRouter.cfg
/*RouterSettings*/
-DRTR_NWK//RouterFunctions
终端设备:F8wEndev.cfg
无
对于协调器,在 Workspace 区域的下拉菜单中选择 CoordinatorEB-Pro,鼠标点击上方的“ make 按钮”后,所有文件对应的红色“ *”将消失,此时配置文件 f8wCoord.cfg 将被使用, 而 f8wEndev.cfg 和 f8wRouter.cfg 不会使用。对于路由和终端也是同样的配置,唯一不同是,路由情况下f8wRouter.cfg,其它两个不使用;终端情况下f8wEndev.cfg,其它两个不使用。
IAR中编译选项,
要为协调器工程选项添加一条编译选项则操作方法是,打开 SampleApp 工 程 后 ,选 中 工 程 名SampleApp-CoordinatorEB,然后根据工程选项设置的路径:Project->Options->C/C++ Compiler->Preprocessor->Defined 。如下图所示。只需在 Defined symbols 框内添加一条新选项即可;要取 消编译选项,只需在该编译选项的左侧添加“ x”即可。
对于路由和终端位置相同,只不过以开始分别要workspace下面选RouterEB和EnddeviceEB以切换不同的工程(里面没有定义ZIGBEEPRO,说明我们的程序使用的是ZIGBEEPRO 2007)
所以说关于程序编译的宏定义是两个地方综合的结果,一个是IAR选项设置,另外一个是.cfg配置文件中的介绍。
针对不同配置文件有
在F8wCoord.cfg中定义了ZDO_COORDINATOR和RTR_NWK
在F8wRouter.cfg中定义了RTR_NWK
在F8wEndev.cfg中没有做定义。
根据以上配置的定义,在ZGlobals.h中确定了设备的类型
#if!defined ( ZSTACK_DEVICE_BUILD )
#if defined ( ZDO_COORDINATOR )
#define ZSTACK_DEVICE_BUILD (DEVICE_BUILD_COORDINATOR)
#elif defined ( RTR_NWK )
#define ZSTACK_DEVICE_BUILD (DEVICE_BUILD_ROUTER)
#else
#define ZSTACK_DEVICE_BUILD (DEVICE_BUILD_ENDDEVICE)
#endif
#endif
ZDO 任务事件处理函数
这一张表介绍的比较全,建立网络过程中用到的各种各样的函数
ZigBee 网络支持单播、组播和广播数据包。在实现组播通信时,需要将通信的端点加入到 工作组中。:
grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP); 如果同在一个工作组内,将该端点从工作组中删除:
aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP ); 如果不在该工作组内,则将该端点加入到工作组中:
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
Zigbee终端是不是使用路由,要根据路径的优化来确定,它会选择最优的路径进行数据的传输。
MicroWait (n);微秒级延时
关于Zigbee的安全与加密
Zigbee规范定义了信任中心的用途,信任中心是在网络分配安全钥匙的一种令人信任的设备。Zigbee提供了一套基于128为AES算法的安全类和软件,并集成802.15.4的安全元素。Zigbee协议栈类为MAC、网络和应用层定义了安全性。它的安全服务包括针对关键进程建立和传输、设备管理和框架保护的方法。
安全方案有一组在MAC层的帧上所执行的操作完成,以提供安全服务,安全方案的名称表明对称加密算法、模式和完整性码的长度。
CC2530硬件支持128bit的AES加密算法
如何开启Z-stack中的加密算法。
1、 将f8wConfig.cfg文件中的-DSECURE=1,设置为1,这个变量在协议栈中作为if语句的条件使用,条件为真语句就是开启加密算法的函数。
2、 将ZGlobals.c中的uint8 zgPreConfigKeys= FLASE修改为uint8 zgPreConfigKeys = TRUE
3、 准备一个key,这个可以在函数nwk_global.c中修改,具体是以下数组
CONST byte defaultKey[SEC_KEY_LEN] =
{
#if defined ( APP_TP ) || defined ( APP_TP2 )
// Key for ZigBeeConformance Testing
0xbb, 0xbb, 0xbb, 0xbb,0xbb, 0xbb, 0xbb, 0xbb,
0xaa, 0xaa, 0xaa, 0xaa,0xaa, 0xaa, 0xaa, 0xaa
#else
// Key for In-HouseTesting
0x08, 0x01, 0x02, 0x03,0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B,0x0C, 0x0D, 0x0E, 0x0F
#endif
};
如果使用了加密算法后,网络中所有设备都需要开启这个算法,且各个设备中的key必须相同。
加密算法开启以后,如果你需要修改代码,就必须改变你的key,或者是擦除一次你的flash。
OSAL维护了一个消息队列,每个消息都会被放到这个消息队列中去,当任何接收到事件后,可以从消息队列中获取属于自己的消息,然后调用消息处理函数进行相应处理即可。
每个消息都包含一个消息头osal_msg_hdr_t和用户自定义的消息,osal_msg_hdr_t结构体的定义为:
typedef struct
{
void *next;
uint16 len;
uint8 dest_id;
}osal_msg_hdr_t;
参考资料:
1、Zigbee无i安传感器网络设计与实现
2、CC2530-datasheet
3、锋硕电子资料