|
从本章开始,本教程将以实际的应用为例,逐一对前言所提到的例程进行剖析。本文所提供的并不单单是这些例子的简单罗列,而是希望读者能从其中学到每一个例子的精髓。如果对任何一个例程有疑问,请直接在相应的教程后跟帖。
一加一远大于二,希望这里有一个互动跟共享的氛围,每个人都能从其中得到自己需要的。
[注:本文源自www.feibit.com--“飞比”Zigbee论坛,为尊重劳动者成果,如需转载请保留此行,并通知作者]
每一个例程都会以下面的格式来进行介绍,另外,为了提高论坛人气,会在适当的位置设置一定的阅读门槛,希望大家能踊跃参与。
[一]程序功能
[二]操作说明
[三]系统框架
[四]网络结构及协议解析
[五]扩展思考(本部分是基于例程基础上,底层的相关问题。由于本教程定位于应用,所以这部分只提出问题,后续的“奥特曼读书日记”将继续深入讨论)
例1.基于Basic RF的无线电灯控制
注:本例程的源代码来源于TI官方网站,为方便大家,贴子底部提供了下载地址。代码解压后请进入..\ide\srf05_cc2530\iar,打开light_switch工程文件进行编译、调试。另外,此例在Zstack2006中也有相同功能的例程,本教程均可适用。
[一]程序功能
此例程是一个基本的点对点通信实验,实现了一个开关控制一个电灯的功能。每一个节点是用来做开关还是用来做灯的控制器,可能通过按键进行选择。本例程可以作为一个无线通信的入门级程序,同时为了增加对信号质量的理解,本站对原例程进行了部分修改,增加了Rssi值的显示,在每收到一个数据包的时候,灯控制器会在LCD上显示相应的dbm值。
[二]操作说明
将程序编译、下载至开发板后,按Reset键后,屏幕显示如下:
此时,按下“S1”键,选择设备模式:
用遥杆(Joystick)左右键在“开关”和“电灯”间选择,“S1”键进行确认。
当选择为“开关”时,按遥杆中间键,发送控制信号,将打开或者关闭“电灯”板上的LED。此时“电灯”板上的LCD接收数据计数值加一,同时会显示接收RSSI值。
[三]系统框架
此平台采用的是典型的“死循环”结构,其中有一个循环等待用户按“S1”键,进行功能设置,设置完之后按功能不同分别进入“开关”和“灯”的死循环。如下代码:
//循环等待用户按“S1”键进入设置菜单
// Wait for user to press S1 to enter menu
while (halButtonPushed()!=HAL_BUTTON_1);
halMcuWaitMs(350);
//设置完后分别进入不同循环
// Transmitter application
if(appMode == SWITCH) {
// No return from here
appSwitch();
}
// Receiver application
else if(appMode == LIGHT) {
// No return from here
appLight();
}
[四]网络结构及协议解析
Basic RF由TI公司提供,它包含了IEEE 802.15.4标准的数据包的收发。这个库只是用来演示无线设备是如何进行数据传输的,不包含完整功能的协议。但是它采用了与802.15.4 MAC兼容的数据包结构及ACK包结构,其功能如下:
1. 不提供“多跳”、“设备扫描”及Beacon
2. 不提供不同种的网络设备,如协调器、路由器等。所有节点同级,只实现点对点传输。
3. 传输时会等待信道空闲,但不按802.15.4 CSMA-CA要求进行两次CCA检测。
4. 不重传数据
其工作原理如下:
启动:
1. 创建一个basicRfCfg_t的数据结构,并初始化其中的成员
2. 调用basicRfInit()函数进行协议的初始化
数据发送:
1. 创建一个buffer,把payload放入其中
2. 调用basicRfSendPacket()函数发送
数据接收:
1. 上层通过basicRfPacketIsReady()函数来检查是否收到一个新的数据包
2. 调用basicRfReceive()函数,把收到的数据复制到buffer中。
数据桢结构:
数据包结构(无加密情况)
[Preambles (4)][SFD (1)][Length (1)][Frame control field (2)]
[Sequence number (1)][PAN ID (2)][Dest. address (2)][Source address (2)]
[Payload (Length - 2+1+2+2+2)][Frame check sequence (2)]
ACK包结构:
[Preambles (4)][SFD (1)][Length = 5 (1)][Frame control field (2)]
[Sequence number (1)][Frame check sequence (2)]
注:本协议同时提供加密方式传输(默认为关),其打开方式如下:
Project ==> option ==> C/C++ compiler ==> defined symbols 将xSECURITY_CCM改为SECURITY_CCM即可。
设备寻址:
本例程实现的是两个点间的通信,各自的地址只因设置为“开关”或者“灯”而不同,不存在地址安排等一系列复杂的网络问题。如下代码:
static void appSwitch() //开关
{
… …
// Initialize BasicRF
basicRfConfig.myAddr = SWITCH_ADDR;
… …
}
static void appLight() //灯
{
… …
// Initialize BasicRF
basicRfConfig.myAddr = LIGHT_ADDR;
… …
}
// BasicRF address definitions
#define PAN_ID 0x2007
#define SWITCH_ADDR 0x2520
#define LIGHT_ADDR 0xBEEF
[五]扩展思考
1. 802.15.4的整个数据包结构,数据是如何一个比特一个比特发出去并接收的,每组数据代表什么意思?
2. 802.15.4的数据是如何进行加密的?
附件:TI Basic RF简单点对点传输协议源代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|