概述
Zigbee复习
- CC2530数据帧基本结构由三部分构成:同步头、需要传输的数据、帧尾;
- 中国使用的Zigbee工作频段是2.4GHz,定义16信道;
- 在Zigbee协议架构中属于IEEE802.15.4标准定义的是**(物理层和MAC层)**;
- Zigbee技术特点是:低功耗、低成本、大容量、可靠、时延短、灵活的网络拓扑结构;
- 信息管理API函数:
- osal_msg_allocate();
- osal_msg_deallocate();
- osal_msg_send();
- osal_msg_receive();
- CC2530的串口方式分为:异步UART模式和同步SPI模式;
- Zigbee的应用层由:应用支持子层(APS),Zigbee设备对象,Zigbee应用框架(AF),Zigbee设备模板和制造商定义的应用对象;
- MAC层提供MAC层数据服务和MAC层管理服务,并负责数据成帧;
- Zigbee网络结构分为4层,从下到上分别为:物理层、MAC层、网络层、应用层;
- Zigbee是一种近距离、低复杂度、低功耗、低成本双向无线通讯技术;
- Zigbee硬件分为三部分:CC2530核心板、协调器底板、路由器底板;
- IEEE802.15.4数字高频调制技术2.4G直接序列扩频;
- CC2530的8051CPU有4个不同的存储空间,分别为:**CODE,DATA,XDATA,SFR;
- ZDO层提供了Zigbee设备管理功能包括:网络建立、发现网络、加入网络、应用端点绑定、安全管理等服务;
- 列举常用Zigbee芯片和Zigbee协议栈:
- 常见Zigbee芯片为CC243X系列、CC253X系列和MC1322X系列;
- Zigbee协议栈分3种:非开源、半开源、开源;
- 非开源:freescale解决方案和microchip解决方案;
- 半开源:TI公司开发的ZStack协议栈是一款免费的Zigbee协议栈,支持Zigbee和ZigbeePRO,并向后兼容Zigbee2006和Zigbee2004;
- 开源:Freakz,配合contiki操作系统,contiki代码全部为c编写,初学者比较容易上手;
- ZStack协议栈种两种地址类型:
- 64为IEEE地址:MAC地址,全球唯一地址,一经分配跟随设备一生,通常由制造商在设备出厂或被安装时设置,这些地址由IEEE组织来维护和分配;
- 16位网络地址:设备加入网络后,由网络中协调器分配给设备的地址,在网络中唯一,用来在网络中鉴别设备和发送数据,对于协调器,网络地址固定为0x0000;
- CC2530数据帧产生过程:
- CC2530射频部分产生并自动传输物理层的同步头,包括帧引导序列和帧开始界定符(SFD);
- 通过射频部分传输帧长度域和指定的字节数,包括MAC帧头和MAC负载;
- 通过操作寄存器计算并自动传输帧尾(FSC);
- Zigbee网络层功能:
- Zigbee网络中设备有三种类型:协调器、路由器、终端节点;
- 协调器具有建立新网络的能力;
- 协调器和路由器具备允许设备加入网络或者离开网络、为设备分配网络内部逻辑地址、建立和维护邻居表等功能;
- 终端节点只需要有加入或离开网络的能力即可;
- 端点的作用:
- 数据的发送和接收:当一个设备发送数据时,必须指定发送目的节点的长地址或短地址以及端点来进行数据的发送和接收,并且发送方和接收方使用的端点号必须一致;
- 绑定:如果设备之间需要绑定,那么在Zigbee网络层必须注册一个或者多个端点来进行数据的发送和接收以及绑定表的建立;
- IEEE802.15.4数字高频调制使用2.4G直接序列扩频技术;
- Zigbee三种网络拓扑结构:星型、树型、网状型;
- CC2530中断处理过程:
- 中断申请:中断源向CPU发出中断请求信号;
- 中断响应:CPU检测中断申请,把主程序中断地址保存到堆栈,转向中断向量入口地址;
- 中断处理:按照中断向量中设定好的地址,转入相应中断服务程序;
- 中断返回:中断服务程序执行完毕后,CPU执行中断返回指令,把堆栈中保存的数据从堆栈弹出,返回原来程序;
- 点亮CC2530LED1:
P0SEL &= ~0x01; P0DIR |= 0x01; P0_0 = 0;
- 在mytask_id的任务下使用osal_start_timerEx( )函数定义一个自定义事件,其中事件名称为TEM_MESSAGE_EVT,且隔5s钟触发
osal_start_timerEx(mytask_id, TEM_MESSAGE_EVT, 5000); - 属于CC2530物理存储器的是:RAM、FLASH、SFR寄存器、信息页面;
- 物联网网络架构:感知层、网络层、应用层;
- 一个Zigbee网络由一个协调器节点、多个路由器、多个终端设备;
- Zigbee中每个协调点最多可连接255个节点,一个Zigbee网络最多可容纳65535个节点;
- Zigbee安全性比较高,加密技术采用128位AES加密算法;
- 在IEEE 802.15.4标准协议中,规定了2.4GHz物理层的数据传输速率为250kb/s;
- 根据IEEE802.15.4标准协议,ZigBee的工作频段分为868MHz、915MHz、2.4GHz;
- Zigbee技术为什么使用自组织网来通信?
网状网通信实际就是多通道通信,在实际工业现场,由于各种原因,往往不能保证每一个无线通道都能够始终畅通,就像城市街道,可能因为车祸,道路维修等,使得某条道路的交通出现暂时中断,此时由于我们有多个通道,车辆(相当于我们的控制数据)仍然可以通过其他道路到达目的地,这一点对工业现场控制非常重要; - 凡符合什么条件的短距离通信就可以考虑采用Zigbee技术?
- 需要数据采集或监控的网点多;
- 要求传输的数据量不大,而要求设备成本低;
- 要求数据传输可靠性高,安全性高;
- 要求设备体积很小,不便放置较大的充电电池或电源模块;
- 可以用电池供电;
- 地形复杂,检测点多,需要较大网络覆盖;
- 对于那些现有的移动网络的盲区进行覆盖;
- 已经使用了现存移动网络进行低数据量传输的遥测遥控系统;
- 名词解释:
- MAC(数据链路层);
- NWK(网络层);
- APL(应用层);
- CCA( 清洁信道评估Clean channel evaluation);
- DSSS( 直接序列扩频Direct sequence spread spectrum);
- ZDO(Zigbee设备对象);
- LPR( 低功耗路由器 low power router);
- CSMA/CD(载波侦听多点接入/冲突检测);
- PAN( 个人区域网Personal area network);
- GTS(处理和维护保护时隙);
- LLC( 逻辑链路控制[计]logical link control);
- PD-SAP( 物理层数据服务接入点 Physical layer data service access point);
- FFD( 全功能设备Full function equipment);
- RFD(精减功能设备Reduced functionality devices);
- NIB( 网络信息库Network information base);
- NIME( 网络层管理实体Network layer management entity);
- NLDE( 网络层数据实体Network layer data entity);
- PDU(协议数据单元Protocol data unit);
- APSDE( 应用支持子层数据实体the application support sub-layer data entity);
- APSME( 应用支持子层管理实体 Application support sublayer management entity);
- WSN( 无线传感网Wireless sensor network);
- 简述直接序列扩频DSSS原理:
直接序列扩频DSSS是直接利用具有高码率的扩频码系列采用各种调制方式在发端与扩展信号的频谱,而在收端,用相同的扩频码序去进行解码,把扩展宽的扩频信号还原成原始的信息,它是一种数字调制方法,具体说,就是将信源与一定的PN码(伪噪声码)进行模二加; - Zigbee三种网络拓扑结构:
- Zigbee技术具有强大组网能力,可以形成星型,树型,网状型;
- 星型拓扑是最简单的,包含一个协调器和一系列终端节点,每一个终端节点只能和协调器进行通信,如果两个终端节点之间进行通信必须通过协调器进行转发;
- 网状网络(Mesh)只要彼此在对方的无线辐射范围内,任何两个FFD设备之间都能直接通信,在Mesh网络中每一个FFD都可以认为是网络路由器,都可以实现对网络报文的路由转发功能,Mesh网在构建时比较复杂,节点要维护的信息多;
- 簇状网络是一个复杂的星型网络,一个扩展的星型拓扑或是由多个简单的星型网络组成的拓扑结构,在簇状网络中,网络协调者、路由器和终端设备的功能清晰,相对于Mesh网络,构建簇状网络比较简单,所需资源相对较少,并且可以实现网络的路由转发功能,扩大网络通信范围;
- 服务原语:请求原语、指示原语、响应原语、确认原语;
- zigbee的基础是IEEE 802.15.4标准,其仅处理低级的物理层和MAC层协议,zigbee联盟对网络层和应用层协议进行了标准化;
- Zstack中Profile文件夹对应zigbee软件架构中的应用程序框架AF层;
- MAC层数据帧:信标帧、数据帧、确认帧、命令帧;
- Zigbee网络设备**精简功能设备(RFD),只能传送信息给FFD或从FFD接收消息;
- ZSTACK的NWK层负责:
- 节点地址类型分配;
- 协议栈模板和网络拓扑结构;
- 网络地址的分配的选择‘
- 协议栈启动流程? (结合)
- 参考1
- main()函数,程序入口;
- 进行系统初始化,对HAL,MAC等各层以及操作系统用到的信息如内存等进行了初始化;
- 初始化OSAL操作系统函数osal_init_system(),里面初始化了系统任务函数osalInitTask(),为系统各个任务分配了存储空间以及taskID;
- 一系列初始化完成,调用osal_start_system()函数,进入任务轮询处理;
- 参考2
- 由协调器的组网(创建PAN ID),终端设备和路由设备发现网络以及加入网络;
- 基本流程:main()->osal_init_system()->osalInitTasks()->ZDApp_Init(),进协议栈初始化函数ZDApp_Init()->ZDOInitDevice();
- 首先在ZMain.c的main函数中进入osal_init_system()函数,该函数通过创建任务表中定义的任务来初始化“任务”系统。这里面关键函数是osalInitTasks(),这个函数在任务初始化为每一层分配一个任务ID号,这个ID和事件处理函数对应成映射。
- DApp_Init()函数里初始化ZigBee协议栈网络,然后进入ZDOInitDevice()初始化设备。
- Zmain.c —> main () —> osal_init_system(); // 任务调度初始化
- osalInitTasks(); —> 默认启动了最多9个任务,添加到队列 ,序号 : 0~8;
- 最后通过调用GenericApp_Init() 实现用户自定义任务的初始化(用户根据项目需要修改该函数)osal_start_system(); —> 进入任务轮询处理
- 参考1
- ZStack-CC2530-2.3.0 开发的基本过程?
- 用户对于ZigBee无线网络的开发可以简化理解为应用层的C语言程序开发,用户不需要深入研究复杂的ZigBee协议栈;
- igBee无线传感器网络中数据采集,只需要用户在应用层加入传感器的读取函数即可;
- 如果考虑到节能,可以根据数据采集周期进行定时,定时时间到就唤醒ZigBee的终端节点,终端节点唤醒后,自动采集传感器数据,然后将数据发送给路由器或者直接发给协调器;
- 编写新任务的初始化函数,以及新任务的事件处理函数,将新任务初始化函数添加在osalInitTasks函数最后为该任务分配taskID,并将事件处理函数地址加入tasksArr[]数组;
- Zigbee的osal的工作原理?
- osal是基于事件驱动的轮询式操作系统,不断查看是否有事件发生,如果有事件发生,查找函数表找到事件处理函数进行处理,完成后,继续访问事件表查看是否有事件发生,不断循环;
- MAC帧头包含:帧控制域,帧序列号,地址域;
- 基于Z-Stack数据收发过程:
- 在GenericApp_ProcessEvent函数里对接收的数据包进行判断MSGpkt->hdr.event。如果是AF_INCOMING_MSG_CMD的情况,则收到消息,在这里调用需要调用的处理消息的函数;
- 在GenericApp_SendTheMessage函数里,先配置好发送模式,端口和地址,然后调用AF_DataRequest函数,填入目的地址,端点描述,簇ID,发送字节长度,发送的数据,发送数据的ID,设置路由发现,设置路由域;
- 分析Basic RF的启动、发射、接收过程?
- 启动:
- 创建一个basicRfCfg_t的数据结构,并初始化其中的成员;
- 在Application层调用Basic Rf层basicRfInit()函数进行协议的初始化。对Basic RF的数据结构初始化,设置模块的传输通道,短地址,PADID;
- 发送:
- 创建一个buffer,把payload放入其中;
- 调用basicRfSendPacket()函数发送,并查看其返回值;
- 接收:
- 上层通过basicRfPacketIsReady()函数来检查是否收到一个新数据包;
- 调用basicRfReceive()函数,把收到的数据复制到buffer中;
- 启动:
- 分析zigbee无线网络中,数据通信中单播、组播和广播的特点以及在z-stack中的具体实现
- 广播:向所有节点发送数据;
SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast; SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;
- 组播:向一组节点发送数据;
SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup; SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;
- 单播:发送数据到特定设备;
GenericApp_DstAddr.addrMode = (afAddrMode_t)afAddr16Bit; GenericApp_DstAddr.endPoint = 0; GenericApp_DstAddr.addr.shortAddr = 0;
- 编程实现CC2530开发板不断地向PC发送“hello zigbee!”字符串;
#include <ioCC2530.h>
#include <string.h>
void initUART0(void);
void Send_String(unsigned char *Data, int len);
unsigned char str1[13]=" hello zigbee!";
void initUART0(void)
{
CLKCONCMD &= ~0x40;//设置系统时钟源32MHz晶振
while(CLKCONSTA&0x40);//等待晶振稳定
CLKCONCMD&=~0x47;//设置系统主时钟频率32MHz
PERCFG= 0x00;//位置1P0口
P0SEL=0x3C;//P0口是串口
P2DIR&=~0xC0;//P0优先作为UART0
U0CSR|=0x80;//串口设置为UART方式
U0GCR|=9;
U0BAUD|=59;//波特率19200
UTX0IF=1;//UART0 TX中断标志初始为1
U0CSR|=0x40;//允许接受
IEN0|=0x84;//开总中断,接受中断
}
void Send_String(unsigned char *Data, int len)
{
unsigned int j;
for(j=0;j<len;j++)
{
U0DBUF=*Data++;
while (UTX0IF==0);
UTX0IF=0;
}
}
void main(void)
{
initUART0();
while (1)
{
Send_String(str1,13);
}
}
- 初始化IO口,要求LED1、LED3、SW1所对应的端口初始,并将LED1、LED3设置为输出口,将SW1设置为输入口,初始化后将LED1与LED3熄灭。
//按键
P0SEL &= ~0x01; //通用I/O
P0DIR &= ~0x01; //输入
P0INP |= 0x01; //上拉
//LED
P1SEL &= ~0xC0;
P1DIR |= 0xC0;
LED1=0;
LED3=0;
- 编写UART0串口初始化代码,PC端串口接收数据的串口初始化;
void initUART0(void)
{
//设置外设i/o口
//设置P0_2、P0_3、P0_4、P0_5为外设I/O口
//设置USART0工作模式为UART模式
//设置波特率为57600
//设置UART工作参数
//清零UART0 TX中断标志
//使能全局中断
}
void initUART0(void)
{
CLKCONCMD &= ~0x40;//设置系统时钟源32MHz晶振
while(CLKCONSTA&0x40);//等待晶振稳定
CLKCONCMD&=~0x47;//设置系统主时钟频率32MHz
PERCFG= 0x00;//位置1P0口
P0SEL=0x3C;//P0口是串口
P2DIR&=~0xC0;//P0优先作为UART0
U0CSR|=0x80;//串口设置为UART方式
U0GCR|=9;
U0BAUD|=59;//波特率19200
UTX0IF=1;//UART0 TX中断标志初始为1
U0CSR|=0x40;//允许接受
IEN0|=0x84;//开总中断,接受中断
}
- 编写一个程序,在z-stack协议栈中使用串口控制zigbee设备的LED状态改变;
static void rxCB(uint8 port,uint8 event)
{
HalUARTRead(0,uartbuf,6);
if(osal_memcmp(uartbuf,"LED1ON",6))
{
HalUARTWrite(0,uartbuf,6);
HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);
}
if(osal_memcmp(uartbuf,"LED2ON",6))
{
HalUARTWrite(0,uartbuf,6);
HalLedSet(HAL_LED_2,HAL_LED_MODE_ON);
}
osal_memset(uartbuf,0,6);
}
下面是陈博主的博客地址:
陈博主
最后
以上就是真实柚子为你收集整理的Zigbee复习Zigbee复习的全部内容,希望文章能够帮你解决Zigbee复习Zigbee复习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复