Zigbee协议栈简介
??Zigbee 协议分为2 部分:
IEEE 802.15.4 定义了PHY (物理层)和MAC (介质访问层)技术规范。Zigbee 联盟定义了NWK (网络层)、APS (应用程序支持层)、APL (应用层)技术规范。
??Zigbee 协议栈就是将各个层定义的协议都集合在一起,以函数的形式实现,并给用户提供API ,用户可以直接调用。
如何理解Zigbee协议栈
??TI 推出的ZigBee 2007 协议栈也称为Z-Stack ,它是Chipcon 推出其CC2430 开发平台时,开发的一款商业级协议栈软件。 ??Chipcon 公司为自己设计的Z-Stack 协议栈中提供了一个名为操作系统抽象层OSAL 的协议栈调度程序。 ??下图是TI 公司的基于ZigBee 2007 的协议栈Z-Stack-CC2530-2.3.0 ,所有文件目录如红色框所示,我们可以把它看做一个小型的操作系统,采用任务轮询的方法运行。
如何使用Zigbee协议栈
??以简单的无线数据通信为例,其一般步骤为:
- 组网:调用协议栈组网函数、加入网络函数,实现网络的建立和节点的加入。
- 发送:发送节点调用协议栈的发送函数,实现数据无线发送。
- 接收:接收节点调用协议栈的无线接收函数,实现无线数据接收。
??由于协议栈都把这些函数都封装好了,因此我们用起来比较方便。大家可以了解一下下面的关键字:
CCM :Counter with CBC-MAC (Mode of Operation )HAL :Hardware Abstraction Layer (硬件抽象层)PAN :Personal Area Network (个人局域网)RF :Radio Frequency (射频)RSSI :Received Signal Strength Indicator (接收信号强度指示)
??CC2530 BasicRF 文件夹结构如下图:
docs 文件夹:打开文件夹,里面仅有一个名为CC2530_Software_Examples 的PDF 文档,文档的主要内容是介绍Basic RF 的特点、结构及使用。从中我们可以知道,里面Basic RF 包含三个实验例程:无线点灯、传输质量检测、谱分析应用。Ide 文件夹:打开文件夹后会有三个文件夹,以及一个cc2530_sw_examples.eww 工程,这个工程是上面提及的三个实验例程工程的集合。在IAR 环境中打开该工程,在workspace 看到如下文件夹:Ide\Settings 文件夹是在每个基础实验的文件夹里都会有的,它用于保存读者自己的IAR环境设置;Ide\srf05_CC2530 文件夹里面放有三个工程,即light_switch.eww 、per_test.eww 和spectrum_analyzer.eww 。Source 文件夹:该文件夹里面有apps 文件夹和components 文件夹。Source\apps 文件夹存放Basic RF 三个实验的应用实现的源代码;Source\components 文件夹包含着Basic RF 的应用程序使用不同组件的源代码。
??打开文件夹WeBee CC2530 BasicRF\ide\srf05_cc2530\iar 路径里面的工程light_switch.eww (无线点灯),我们的实验就是对它进行修改的。在介绍Basic RF 之前,来看看这个实验例程设计的大体结构。
Hardware layer :这是实现数据传输的基础。Hardware Abstraction layer :它提供了一种接口来访问TIMER 、GPIO 、UART 、ADC 等,这些接口都通过相应的函数进行实现。Basic RF layer :为双向无线传输提供一种简单的协议。Application layer :它是用户应用层,相当于用户使用Basic RF 层和HAL 的接口。我们通过在Application layer 就可以使用到封装好的Basic RF 和HAL 的函数。
??Basic RF 由TI 公司提供,它包含了IEEE 802.15.4 标准的数据包的收发功能,但并没有使用到协议栈,仅仅让两个结点进行简单的通信。也就是说,Basic RF 仅仅是包含IEEE 802.15.4 标准的一小部分。其主要特点有:
- 不会自动加入协议,也不会自动扫描其他节点也没有组网指示灯(
LED3 )。 - 没有协议栈里面所说的协调器、路由器或者终端的区分,节点的地位都是相等的。
- 没有自动重发的功能。
??Basic RF 的工作过程有启动、发射和接收。使用Basic RF 实现无线传输只要学会使用这些过程的相应函数就可以了。 ??启动的要求如下: ??1. 确保外围器件没有问题。 ??2. 创建一个basicRfCfg_t 的数据结构,并初始化其中的成员,在basic_rf.h 代码中可以找到:
typedef struct {
uint16 myAddr;
uint16 panId;
uint8 channel;
uint8 ackRequest;
#ifdef SECURITY_CCM
uint8 *securityKey;
uint8 *securityNonce;
#endif
} basicRfCfg_t;
??3. 调用basicRfInit 函数进行协议的初始化,在basic_rf.c 代码中可以找到:
uint8 basicRfInit ( basicRfCfg_t *pRfConfig );
函数功能是对Basic RF 的数据结构初始化,设置模块的传输通道、短地址和PAD ID 。 ??发送过程如下: ??1. 创建一个buffer ,把payload 放入其中,Payload 不大于103 个字节。 ??2. 调用basicRfSendPacket 函数发送,并查看其返回值。在basic_rf.c 中可以找到:
uint8 basicRfSendPacket ( uint16 destAddr, uint8 *pPayload, uint8 length )
参数destAddr 是目的短地址,pPayload 是指向发送缓冲区的指针,length 是发送数据长度。函数功能是给目的短地址发送指定长度的数据,发送成功刚返回SUCCESS ,失败则返回FAILED 。 ??接收过程如下: ??1. 上层通过basicRfPacketIsReady 函数来检查是否收到一个新数据包。在basic_rf.c 中可以找到:
uint8 basicRfPacketIsReady ( void );
函数功能是检查模块是否已经可以接收下一个数据,如果准备好了,则返回TRUE 。 ??2. 调用basicRfReceive 函数,把收到的数据复制到buffer 中。代码可以在basic_rf.c 中找到:
uint8 basicRfReceive ( uint8 *pRxData, uint8 len, int16 *pRssi );
函数功能是接收来自Basic RF 层的数据包,并为所接收的数据和RSSI 值配缓冲区。
|