一、zigbee的介绍
低功耗,相比目前的wifi蓝牙功耗更低 低成本,协议栈免专利费,IC结构简化 低速率,工作在20~ 250kbps的速率 近距离,在不增加功率放大器的情况下,一般介于10~100米之间 短时延,无论是唤醒 还是入网都在毫秒级 高容量,同一协调器最多管理65000+节点 自组网,因移动或信号干扰断网后自组 自愈 高安全,支持AES128位对称加密通信 免执照,使用工业科学医疗(ISM)频段,915MHz(美国), 868MHz(欧洲), 2. 4GHz(全球)
Zigbee在3个频段定义了27个物理信道:
二、zigbee协议
1、从官方协议了解到,zigbee可以大致分为五层:
应用层APL,应用框架层AF,以及设备对象ZDO 应用支持子层APS 网络层NWK 媒体访问控制层MAC 物 理层PHY
1.1 PHY,从无线物理信道上为MAC层提供数据收发的服务:
启动和关闭RF收发器 当前信道能量检测 对接收 到的数据报进行链路服务质量指示LQT(Link Quality Indication) 为CSMA/CA算法提供空闲信道评估 CCA(Clear Channel Assessment) 对信道频率进行选择 数据包的传输和接收
1.2 MAC,保证协议数据正确收发:
全功能设备(协调器和路由器)产生并发送信标帧(Beacon)。 普通设备根据全功能设备的 信标帧进行同步。 支持PAN(个域网)的关联(Association)建立和取消关联(Disassociation)断开操作。 为 设备的安全性提供支持。 使用CSMA/CA机制共享物理信道。 处理和维护时隙保障GTS(Guaranteed Time Slot)机制。 在两个对等的MAC实体之间提供一个可靠的数据链路。
1.3 NWK,兼容IEEE802.15.4标准,并为上层提供数据服务(NLDE)和管理服务(NLME):
产生网络层的数 据包:当网络层接受到来自应用子层的数据包,网络层对数据包进行解析,然后加上适当的网络层包头 向MAC传输。 提供路由数据包的功能,如果包的目的节点是本节点的话,将该数据包向应用子层发送, 如果不是,则将该数据包转发给路由表中下一结点。 提供入网器件的参数配置协议,比如建立新的协调 器并发起建立PAN网络或者加入一个已有的网络。
NWK 提供加入或脱离PAN网络的功能,如果节点是协调器或者是路由器,还可以要求子节点脱离网 络。 如果本节点是协调器或者是路由器,则接入该节点的子节点的网络地址由网络层分配控制。 网络层 能发现维护网络邻居信息,比如发现新节点。 网络层能控制接收器的接受时间和状态。
1.3 APS,为ZDO访问NWK提供了通路:
APS层协议数据单元APDU的处理。 APSDE提供在同一个网络中的 应用实体之间的数据传输机制。 APSME提供多种服务给应用对象,这些服务包括安全服务和绑定服务, 并维护管理对象的数据库,也就是我们常说的AIB。
1.4 AF,为各个用户自定义的应用对象提供了模板式的活动空间:
为每个应用对象提供了键值对KVP服务和 报文MSG服务两种服务供数据传输。 每个节点除了64位的IEEE地址,16位的网络地址外,AF还为每个 节点提供了8位的应用层入口端点地址,对应于用户应用对象。 端点0用于整个ZigBee设备的配置和管理 ,端点255用于向所有端点的广播(同一终端的不同应用),区别于短地址广播(不同终端) 端点1至240供用户 自定义用于对象使用
AF 端点241-254保留将来使用 每一个端点应用都对应一个配置文件(Profile)
Profile配置文件包括:
设备ID(Device ID) 事务集群ID(cluster ID) 属性ID(Attribute ID) 等等 AF可以通过这些信息来决 定服务类型
ZDO,是一个特殊的应用层的端点(Endpoint)占用了端点0,它是应用层其他端点与应用子层管理实体 之间交互的中间件,它主要提供的功能有: 初始化应用支持子层,网络层。 发现节点和节点功能,在无 信标的网络中,加入的节点只对其父节点可见。 而其他节点可以通过ZDO的功能来确定网络的整体拓扑 结构以及节点所能提供的功能。 安全加密管理,主要包括安全key的建立和发送,以及安全授权。
ZDO 网络的维护功能。 绑定管理,绑定的功能由应用支持子层提供,但是绑定功能的管理却是由ZDO 提供,它确定了绑定表的大小,绑定的发起和绑定的解除等功能。 节点管理,对于网络协调器和路由 器,ZDO提供网络监测、获取路由和绑定信息、发起脱离网络过程等一系列节点管理功能。
1.5 APL,基于zigbee协议栈,建立在ZDO基础之上的具体上层应用,
主要包括: 数据采集 对象控制 近场 定位
三、CC2530F256
1、CC2530的概述
基于8051架构,
2、最小系统:
电源电路、复位电路、下载电路、调试电路、时钟电路
3、端口的介绍
用作通用 I/O 时,引脚可以组成 3 个 8 位端口,端口 0、端口 1 和端口 2,表示为 P0、P1 和 P2。其中,P0 和 P1 是完全的 8 位端口,而 P2 仅有 5 位可用。
功能:通用IO、特殊功能IO
P0SEL :端口 0 功能选择寄存器
P1SEL :端口 1 功能选择寄存器
P2SEL :端口 2 功能选择寄存器
方向:输入 输出
P0DIR :端口 0 方向寄存器
P1DIR :端口 1 方向寄存器
P2DIR :端口 2 方向寄存器
电平:高电平1 低电平0
输入模式寄存器:
P0INP :端口 0 输入模式寄存器
P1INP :端口 1 输入模式寄存器
P2INP :端口 2 输入模式寄存器
四、OSAL操作系统抽象层
1、OSAL的概述
OSAL,Operating System Abstraction Layer,即操作系统抽象层。 从Z-Stack1.4.3及以后开始引入OSAL。 OSAL是一种基于事件驱动的轮询式操作系统,所提供的管理功能有: 任务登记、任务初始化、任务触发 任务间消息传递 任务同步 中断处理 计时器 内存分配
2、OSAL轮询机制
总结之添加任务的流程:
1、任务初始化 得到任务ID 完成任务处理函数的 前期工作(main自动调用完成);
2、任务处理函数 实现该函数 将函数名 tasksArr[]数组中;
3、在合适的时候调用 osal_set_event(my_Task_ID, LED_EVENT);
4、在任务处理函数中 记得判断是具体的哪个事件----->记得异或该事件 将events中的事件位清0;
3、消息的收发
:任务之间的收发收发消息。 比如:自己的任务初始化函数 给自己的任务事件处理函数 发送消息。
1、OSAL发送消息
1.1 申请消息空间:
uint8 * osal_msg_allocate( uint16 len ) 参数len:需要申请堆区空间的字符数 返回值: 成功:堆区空间的起始地址编号 失败:NULL
1.2 将要发送的消息 放入空间中
strcpy(申请的消息空间地址, 自定义小)
1.3 发送消息
uint8 osal_msg_send(目的任务ID, 申请的消息空间地址) 函数内部: osal_set_event( 目的任务ID, SYS_EVENT_MSG ); //SYS_EVENT_MSG系统定义的消息事件0x8000
2、接收OSAL消息
2.1 在目的任务ID所对应的事件处理函数中 判断SYS_EVENT_MSG。
if(events & SYS_EVENT_MSG) { //接收消息 //释放消息空间 }
2.2 接收消息:
//参数:task_id 表示接收消息的任务ID //返回值:收到消息的空间起始地址 uint8 *osal_msg_receive( uint8 task_id )
2.3 释放消息空间:
uint8 osal_msg_deallocate( uint8 *msg_ptr )
3、案例 初始化函数发送消息 事件处理函数中接收消息
demo.h
demo.c