董 哲,邵晓琳
(北方工业大学 电气与控制工程学院,北京 100144)
ZigBee技术,在消费性电子设备、工业控制、汽车及智能交通、农业自动化、医疗辅助控制等方面具有广阔的应用前景。TI的CC2530芯片具备了实现Zig-Bee技术的各种底层硬件需求,是真正的一体化解决方案,完全符合ZigBee技术对节点“体积小”的要求。TI提供的ZStack协议栈,使ZigBee节点的软件开发转为应用程序的开发,尽可能地减轻了软件开发的工作量。
从系统的角度来看,智能化的家居体验必然要求节点之间的互通互联,一个典型的ZigBee智能家居系统中节点繁多,功能各异,如果每个节点单独开发,则对系统的开发维护带来诸多不便,对此本文创新性地给出了智能家居系统中通用节点的软硬件设计方案,该方案降低了系统的开发和维护难度,并具有一定的通用性和可扩展性。
智能家居设备可分为三类,一类是传感器节点,通过不同功能的传感器检测家居中的各种状态,如温湿度、光照度等,该类节点由传感变送单元、主控单元、通信单元组成。第二类是执行器节点,通过继电器、红外遥控等方式实现对家电的控制,该类节点由执行单元、主控单元、通信单元组成。第三类是网关控制器,实现网络的建立与维护、数据转发、节点控制等功能,该类节点由主控单元、通信单元组成。本文设计的通用型节点实现了主控单元、通信单元的基本功能,在通用单元的基础上只需扩展传感器、执行器等即可实现智能家居中各专用设备硬件。同时本文开发了基于Z-stack的智能家居通用软件,分为协调器和终端两个版本,前者适用于网关控制器类设备,后者适用于传感器、执行器类设备,智能家居中所需的各种专用设备无需进行单独的软件开发,只需定义设备类型即可实现。
如图1所示,智能家居系统中的ZigBee网络主要由ZigBee协调器和ZigBee终端设备组成。ZigBee协调器负责建立和维护ZigBee网络,可通过串口连接上位机或家庭网关来实现对家居系统的监测和控制;相同的ZigBee终端设备通过连接不同的传感器和家居设备而构成不同的应用节点。
图1 基于ZigBee的智能家居系统
如图2所示,深色阴影部分为系统输入,浅色阴影部分为系统输出,ZigBee协调器为系统的控制中心,将综合传感器采集的环境信息以及串口接收的控制信息用来控制每个家居设备的运行,同时将环境信息,以及家居设备运行状态发送到串口以供控制终端显示。本系统具有自动控制、直接控制、连锁控制、场景控制四种相互耦合的控制功能,此外系统还具有动作反馈的功能,不论设备以何种方式被控制,其动作变化都会在控制终端得到体现。
图2 系统功能模型
(1)自动控制
协调器根据传感设备采集的数据自动对某些家居设备进行控制,如当室外光照度较低时关闭窗帘。
(2)直接控制
用户可根据自己的需要,直接在控制终端操作某一设备,如打开客厅的电视。
(3)连锁控制
当用户的某一项活动需要控制多个设备时,可实现只控制一个设备来实现连锁控制,如当用户打开燃气开关后油烟机自动打开。
(4)模式控制
用户可以在控制终端选择不同的模式,家居设备的不同子集会在特定的模式中有不同的响应方式。如当设置睡眠模式时,一些安防功能会自动启用,照明系统会自动切换至弱光档以减少对眼睛的刺激。
每个ZigBee设备有一个全球唯一的64位IEEE长地址,但在ZigBee网络中通常用16位的短地址来标识自身和识别对方,也称作网络地址。对于协调器来说,短地址为0000H,对于路由节点和终端节点来说,短地址是它们在加入到网络中时由协调器动态分配的,与网络深度、最大路由数、最大节点数等参数的设置有关,还与节点入网顺序有关,直接通信关键点在于目标节点网络短地址的获得。
ZStack协议栈中定义的应用层无线数据发送函数为AF_DataRequest,函数原型如下:
其中dstAddr为地址类型结构体变量,包含目标节点地址类型和网络地址等参数;cID为命令号,在ZStack协议栈里主要用来区别不同命令以控制不同的操作;len为发送数据的长度;*buf为指向发送数据缓冲区的指针。
ZigBee设备收到无线数据后,会在应用层触发AF_INCOMING_MSG_CMD事件,可在结构体afIncomingMSGPacket_t中解析出所接收的数据及其源地址、命令号等相关的参数。
智能家居系统中的ZigBee网络是以应用为中心的网络,用户只关注各个ZigBee终端的应用功能,而不关心每个节点的网络地址,因此需要在终端的功能和它的网络地址之间建立映射关系,系统才能正确地通信。
用拨码开关为每个终端分配一个唯一的ID以区分其功能,以8位拨码开关为例,如表1所示,4位区分区域,4位区分应用,这样每个无线应用都有一个区域号和应用号组成的1个字节的ID号,系统最多可容纳256个独立的应用,足够覆盖家居生活的方方面面。
表1 终端应用ID
协调器建立网络成功后,终端节点会自动加入网络,终端入网成功后会在应用层触发ZDO_STATE_CHANGE事件,因此可以利用此事件来实现应用层网络的建立。首先终端在应用层任务初始化时读取拨码开关状态,得到其ID号fID,当终端的ZDO_STATE_CHANGE事件被触发,即终端成功加入网络时,将自己的ID号fID发送给协调器作为应用层入网请求。协调器端定义一个记录终端节点网络地址的数组uint16 Saddr[256],当协调器收到终端应用层入网请求后将无线数据的源地址赋给数组Saddr以fID为下标的元素:
这样就在协调器端建立了与节点应用功能对应的网络地址映射表,当需要控制某个设备时将Saddr中以被控设备为ID号fID为下标的元素赋值给协调器的目标地址:
就可以将数据或命令发送到对应的设备。
(1)网络通信
如图3所示,系统的网络通信主要由灰色矩形框内的7种情况发起,下面将分类对各种数据帧进行定义和解释。
图3 系统网络通信示意图
a.串口通信帧结构
协调器串口通信帧由起始码、功能码、数据码三部分构成,其中起始码1字节,值为0xFF,表示帧头;功能码1字节,由0x00递增,表示此帧的功能,数据码长度和内容由功能码决定。
如表2,协调器的串口接收3种类型的帧,开机请求帧用于上位机程序打开时获取当前系统的信息;场景设置帧用于设置模式,如进入睡眠模式,退出睡眠模式;节点控制帧用于直接控制,如用户打开客厅的电视机。
表2 协调器串口接收数据帧
如表3,协调器的串口发送3种类型的帧,数据回复帧用于回复上位机的开机请求帧;设备入网帧用于告知上位机新加入ZigBee网络的家居设备;设备数据帧用于向上位机反馈每个设备的参数和状态信息,如温度传感器采集的温度值,电视机的开关状态。
表3 协调器串口发送数据帧
b.无线通信帧结构
无线通信帧是指协调器和终端节点通信的无线数据帧,在此用协议栈中无线数据收发的一个参数cID(命令号)来区分帧的功能和类型,用无线收发的数据缓冲区buf来存放数据,数据长度及内容由命令号cID决定。
如表4,以cID的高字节作为功能码来区分无线数据帧的类型,低字节存放节点fID来识别应用。协调器接收2种类型的帧,入网帧为终端节点的应用层入网请求;参数帧为终端节点的参数和状态信息。
表4 协调器无线接收数据帧
如表5,协调器发送5种类型的帧,以cID高字节的高4位表示帧类型,入网回复帧用来回复新入网的节点系统当前的模式;节点控制帧用于控制节点的行为动作;模式设置帧和连锁控制帧用来进行模式设置和连锁控制,并对cID的低12位进行如下的定义,高字节的低4位为控制方向(1为进入,0为退出),低字节为控制号,表示当前控制类型下的控制号。如0x0105为进入第5种模式,0x0005为退出第5种模式;0x1103为进入第一种连锁,0x1003为退出第3种连锁。
表5 协调器无线发送数据帧
(2)系统控制
在协调器和终端都定义一个函数指针数组
task00至taskFF为表1中每个对应设备的应用处理函数,在协调器端表现为接收到对应设备数据后的相关处理。
将终端设备分为控制型设备和输入型设备,对于控制型终端设备M,其功能执行函数taskM为收到协调器的控制信息后的操作。以16种模式为例,在终端节点程序中定义uint16的全局变量fmode(每一位表示一种模式,1表示模式被设置,0表示模式被清除),当终端节点收到协调器发来的无线数据时,如果是模式设置帧则按照控制方向和控制号更新fmode中相应的模式位,然后调用process_task[fID]((pkt->clustered)>>12,(pkt->clustered)&0x00FF)来进行相应的操作。
在taskM中定义一个uint16的常量modeM,每一位表示一种模式,modeM含义为当此变量中为1的位所对应的模式至少有一种被设置时此设备打开,否则此设备关闭。当收到模式设置帧时,进行判断if(modeM&fmode),成立时打开设备,否则关闭设备,连锁控制用相同的方法实现;如果是入网回复帧,则记录下系统当前的模式值fmode;如果是节点控制帧则直接调用process_task[fID]((pkt->clustered)>>12,(pkt->clustered)&0x0FFF)进行相应的控制。
输入型设备N又可分为开关量输入和数据输入。以烟雾传感器为例,其输入到终端的信号为高或低电平表示是否有火警信号,此类输入为开关量输入,用外部中断来读取,在协议栈的中断处理函数HAL_ISR_FUNCTION中利用osal_set_event()函数来触发应用层的事件。以温湿度传感器为例,其输入到终端的信号为温湿度数据,需要控制器定期读取传感参数,此类输入为数据输入,用定时器中断来读取,在协议栈中利用osal_start_timerEx();当外部中断产生或定时时间到都会在应用层触发相应的自定义事件。所以在应用层的任务处理函数中去查询事件进行响应:
为避免和控制型设备M的控制类型(0~3)重合而导致的程序混乱,输入型设备N的功能执行函数taskN中的控制类型由4开始递增。
用通用节点连接不同的传感器和控制设备搭建的智能家居演示系统如图4所示,系统配套的Android APP通过连接网关可实现监控ZigBee智能家居网络的功能,Android APP界面如图5所示。
图4 智能家居演示系统实物图
图5 智能家居系统Android APP监控界面
本文介绍的基于ZigBee的智能家居通用节点的设计方案降低了智能家居系统开发和维护成本,满足了智能化的家居系统控制要求,可以快速地实现设计方案到可执行代码的转化。同时该方法具有一定的通用性,也适用于基于ZigBee的智能大棚监管系统等类似系统的开发。
[1] 高守纬,吴灿阳.ZigBee技术实践教程:基于CC2430/31的无线传感器网络解决方案[M].北京:北京航空航天大学出版社,2009.
[2] 王小强,欧阳俊,黄宁淋.ZigBee无线传感器网络设计与实现[M].北京:化学工业出版社,2012.
[3] 周 游,方 滨,王 普.基于ZigBee技术的智能家居无线网络系统[J].电子技术应用,2005,31(9):37-40.