zigbee简介
zigbee 是IEEE 802.15.4协议的代名词。这个协议规定的短距离,低功耗的无线通信技术。
协议栈
协议栈是指网络中各层协议的总和, 其反应了网络中文件传输的过程:由上层到底层,再由底层到上层的过程。zigbee联盟在2005年发布了第一份zigbee规范。
TI Z-stack 2007年由TI发布, 其配合OSAL(多任务操作系统)完成整个协议栈的运行
zigbee协议栈建立在IEEE 802.15.4的PHY层和MAC层规范之上。它实现了网络层(NWK)和应用层(APL)
应用层由提供了应用子层, APS和zigbee设备对象(ZDO)。
物理层(PHY)
物理层定义了物理无线信道和MAC子层的接口, 提供物理层数据服务和物理层管理服务。
物理层内容:
1) zigbee的激活
2)当前信道的能量检测
3)接收链路服务质量信息
4)zigbee信道接入方式
5)信道频率选择
6)数据传输和接收
介质接入控制子层(MAC)
MAC层负责处理所有物理层无线信道访问,并产生网络信号,同步信号;支持PAN连接和分离, 提供两个对等MAC实体之间可靠的链路。
MAC层功能:
1) 网络协调器产生信标(beaeon)
2) 与信标同步
3) 支持PAN(个域网)链路的建立和断开
4) 为设备的安全性提供支持
5) 信道接入方式采用免冲突载波检测多址接入机制
6) 处理和维护保护时隙机制
7) 在两个对等的MAC实体键提供安全可靠的通信链路
网络层(NWK)
网络层是zigbee的核心。 网络层主要实现节点加入或离开网络,接收或抛弃其他节点, 路由查找及数据传输等功能。
网络层功能:
1) 网络发现
2) 网络形成
3) 允许设备连接
4) 路由器初始化
5) 设备同网络连接
6) 直接将设备和网络连接
7) 断开网络连接
8) 重新复位设备
9) 接收机同步
10) 信息库维护
应用层(APL)
zigbee应用层包括应用支持层APS, zigbee设备对象ZDO和制造商定义的应用对象。
应用支持层(APS)功能:
1) 维持绑定表
2) 在绑定设备间传递信息
设备对象(ZDO)功能:
1) 定义设备在网络中的角色
2) 发起和响应绑定请求
3) 在网络设备中建立安全机制
4) 发现网络设备,并决定提供应用服务类型
应用程序框架(AF)
运行在zigbee协议栈上的应用程序实际上是厂商自定义的应用对象, 并且遵循规范运行在端点1~240上。
zigbee提供两种标准服务类型: 键值对(KVP) 和 报文(MSG)。
zigbee基本概念
设备类型:
1) Coordinator (协调器)
2) Router (路由器)
3) End-Device(终端)
zigbee网络中由一个Coordinator 和多个Router和多个End-Device组成。
Coordinator(协调器)
协调欺负责启动整个网络。它是网络的第一个设备。协调欺选择一个信道和一个网络ID(PAN ID),启动整个网络。 协调欺也可以协助建立网络中安全层和应用层的绑定(bindings)。
注意: 协调器的角色主要涉及网络启动和配置,一旦完成,就像一个路由器或者消失。由于整个zigbee网络的分布特性, 因此接下来整个网络的操作就不在依赖协调器是否存在。
Router(路由器)
路由器的功能是允许其他设备加入网络,多跳路由或者协助它自己由电池供电的终端设备的通讯。
通常路由器希望一直是活动状态,因此必须使用主电源供电,但是当使用树状网络拓扑结构时,允许路由间隔一定的周期操作一次。这样就可以使用电池供电。
Ebd-Device(终端设备)
终端设备没有特定的维持网络结构的责任,它可以睡眠或者唤醒,因此它可以是一个电池供电的设备。通常终端设备对存储空间要求比较小。
协议栈规范(stack profile)
Zigbee定义了两个规范; zigbee 和zigbee PRO
协议栈规范的ID(STACK_PROFILE_ID)在nwk_global.h中定义如下:
// Controls various stack parameter settings
#define NETWORK_SPECIFIC 0 // 特定网络
#define HOME_CONTROLS 1 // zigbee
#define ZIGBEEPRO_PROFILE 2 // zigbee pro
#define GENERIC_STAR 3
#define GENERIC_TREE 4
zigbee协议组成
端点(endpoint)
8位字段, 描述一个射频端所支持的不同应用。
端点0x00 : 用于寻址设备配置文件, 这是每个zigbee设备必须使用的端点。
端点0xFF : 用于寻址所有活动端点
端点0xF1 ~ 0xFE : reservered
端点0x01 ~ 0xF0 : 共240个, 支持240个应用,即物理信道最多支持240个虚拟链路。
簇 (cluster)
多个属性的汇集形成了簇, 簇是属性的集合,每个簇拥有一个唯一的ID。
// sampleApp.c
const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] =
{
SAMPLEAPP_PERIODIC_CLUSTERID, // 1
SAMPLEAPP_FLASH_CLUSTERID // 2
};
属性(attribute)
设备之间通信的每一种数据对象,比如开关状态或者温度值等都是属性。每个属性可得到唯一的ID,
File :zcl.h
// Attribute record
typedef struct
{
uint16 attrId; // Attribute ID
uint8 dataType; // Data Type - defined in AF.h
uint8 accessControl; // Read/write - bit field
void *dataPtr; // Pointer to data field
} zclAttribute_t;
typedef struct
{
uint16 clusterID; // Real cluster ID
zclAttribute_t attr;
} zclAttrRec_t;
描述符(descriptor)
一个设备(device)可以拥有240个端点(endpoint), 每一个端点必须有一个端点描述符endPointDesc, 端点描述符包括一个简单描述符(SimpleDescriptionFormat)
File : af.h
typedef struct
{
uint8 endPoint;
uint8 *task_id; // Pointer to location of the Application task ID.
SimpleDescriptionFormat_t *simpleDesc;
afNetworkLatencyReq_t latencyReq;
} endPointDesc_t;
例子SampleApp.c:
// Fill out the endpoint description.
SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; // 20
SampleApp_epDesc.task_id = &SampleApp_TaskID; //全局uint8
SampleApp_epDesc.simpleDesc
= (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;
SampleApp_epDesc.latencyReq = noLatencyReqs; // enum
其中SimpleDescriptionFormat_t定义如下:
typedef struct
{
uint8 EndPoint; // 端点1——240
uint16 AppProfId; // profile ID
uint16 AppDeviceId; // device ID
uint8 AppDevVer:4; // Descriptor version
uint8 Reserved:4; // AF_V1_SUPPORT uses for AppFlags:4.
uint8 AppNumInClusters; // cnts of input Cluster
cId_t *pAppInClusterList; // cnts of input Cluster ID
uint8 AppNumOutClusters; // cnts of output Cluster
cId_t *pAppOutClusterList; // cnts of output Cluster
} SimpleDescriptionFormat_t;
上面的SampleApp_SimpleDesc :
const SimpleDescriptionFormat_t SampleApp_SimpleDesc =
{
SAMPLEAPP_ENDPOINT, // int Endpoint;
SAMPLEAPP_PROFID, // uint16 AppProfId[2];
SAMPLEAPP_DEVICEID, // uint16 AppDeviceId[2];
SAMPLEAPP_DEVICE_VERSION, // int AppDevVer:4;
SAMPLEAPP_FLAGS, // int AppFlags:4;
SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters;
(cId_t *)SampleApp_ClusterList, // uint8 *pAppInClusterList;
SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters;
(cId_t *)SampleApp_ClusterList // uint8 *pAppInClusterList;
};
绑定(binding)
上面的key1 绑定EP3, key2 绑定EP4和EP5,利用这种绑定关系可以实现控制。
路由
路由对于应用层来说是透明的, 应用程序只要简单向下发送任何设备的数据到栈中, 栈会负责寻找路径。这种方法,应用程序不知道操作是在一个多跳或者什么网络中。路由另一个功能是自愈ZigBee网络,如果某个无线连接断开, 路由功能又能自动寻找新的路径避开断开的网络连接, 这极大提高了网络的可靠性,是ZigBee网络的关键特性。
点播,组播和广播
点播: 点对点通信, 不容许第三个设备收到信息
组播: 网络中节点分组,每个组员发出的信息只有相同组号组员才能收到
广播: 发送模块发出信息, 网络中所有节点都可以收到数据。
File : af.h
typedef enum
{
afAddrNotPresent = AddrNotPresent, // Indirect
afAddr16Bit = Addr16Bit, // Unicast
afAddr64Bit = Addr64Bit, //
afAddrGroup = AddrGroup,
afAddrBroadcast = AddrBroadcast // Broadcast
} afAddrMode_t;
在ZigBee中, 数据包可以单点传送(Unicast), 多点传送(Multicasr)或者广播传送(Broadcast)
,每种方式都对应上面一个地址参数.
对于广播传送, 目标地址DstAddr.addr.shortAddr有如下配置:
typedef struct
{
union
{
uint16 shortAddr;
ZLongAddr_t extAddr;
} addr;
afAddrMode_t addrMode;
uint8 endPoint;
uint16 panId; // used for the INTER_PAN feature
} afAddrType_t;
其中shortAddr可以选择:
enum bcast_addr_e {
NWK_BROADCAST_SHORTADDR_RESRVD_F8 = 0xFFF8,
NWK_BROADCAST_SHORTADDR_RESRVD_F9,
NWK_BROADCAST_SHORTADDR_RESRVD_FA,
NWK_BROADCAST_SHORTADDR_RESRVD_FB,
NWK_BROADCAST_SHORTADDR_DEVZCZR, // 0xFFFC: Routers and Coordinators
NWK_BROADCAST_SHORTADDR_DEVRXON, // 0xFFFD: Everyone with RxOnWhenIdle == TRUE
// 0xFFFE: Reserved (legacy: used for 'invalid address')
NWK_BROADCAST_SHORTADDR_DEVALL = 0xFFFF
};