摘 要 智能家居虽然起源很早,但是一直没有广泛的推广应用,其中主要的瓶颈之一在于没有将所有家电进行统一控制的通讯协议.本文设计了一种适用于所有家用设备的控制协议,在下位机编写发送接收响应程序,实现与所有家用设备的监控.
【关 键 词 】监控 通讯协议 接收程序 发送程序
1.引言
随着互联网技术的发展,构建高效的住宅设施与家庭日程事务的管理系统已经成为不可逆转的趋势.智能家居通过物联网技术将家中的各种设备连接到一起,提供家电控制、照明控制、窗帘控制、远程控制、室内外遥控、防盗报警、环境监测等多种功能和手段.智能家居虽然起源很早,但是一直没有广泛的推广应用,其中主要的瓶颈之一在于没有将所有家电进行统一控制的通讯协议.
本文针对这种情况设计了一种使用于所有家用设备的通讯控制协议,通过对通讯控制协议的解析,设计了用于接收发送该协议的程序, 从而实现了对所有家电的控制.
2.控制协议的定义
协议是计算机之间传输数据的一些规范.计算机之间相互通信需要共同遵守的约定和规则.控制协议可以简单地理解为一个由特定数据按照特定格式组织的、 在特定网络系统中传输的字符串. 它由多个字段组成 ,每个字段表示特定含义,并且字段之间的顺序在设计时已经固定不可调换.控制数据帧数据时,两端可以根据事先定义的协议字段含义及顺序解析出数据进行相应处理.
这种控制协议要有如下特点:条理清晰、精确度高、易管理、拓展性强、复用性高.遵照这些特点,自定义协议既要有清晰明确的字段定义,又要有合理规范的格式,既方便程序处理,又方便理解;既没有冗余数据,还要有一定的扩展余地,并且不能使整个协议系统过于庞大;既保证快速的传输数据,又具有高可靠性.一个好的控制协议体系 ,对于整个智能家居系统性能的提高具有至关重要的意义.
3.控制协议的结构
本文这种控制协议设计思想基于帧传输的方式,即在发送数据时是一帧一帧地发送.所有数据帧采用统一的数据帧格式.
数据帧格式:本控制协议帧只有控制命令帧和应答帧两种.这两种数据帧采用统一格式.这种格式如下:引导字节 、起始字节、设备编码、地址、识别码、数据长度、数据、校验码、结束符.其中数据区随数据长度的变化而变化.具体结构如图1所示.
3.1 引导字节
用于检测一个数据帧的开始,设计为固定字节FEH.其数量不固定,可用于唤醒休眠设备.
3.2 起始字节
用于标记引导字节的结束,有效数据的开始,设计为固定字节68H.
3.3 设备编码
占用一个字节,用于标记家中的各种设备,每一种设备都有自己对应的唯一编码.
3.4 地址
用于区别相同设备,对于相同设备实现精确控制.
3.5 识别码
用于识别数据的用途,是命令还是应答数据等等,根据不同的标识数据区具有不同的意义.主动发送帧的识别码取值范围为00H-7FH,应答帧的识别码为发送码的最高位置1.
3.6 数据长度
用于标记数据区的数据长度.
3.1.7 数据
控制的内容以应答的内容等等,数据区内容的具体含义需要根据不同的设备编码和识别码而定.
3.8 校验码
从起始符开始一直到数据的最后一位的所有加和,然后取后八位.
3.9 结束符
标记数据帧的结束,固定字节16H.
4.接收发送程序设计
数据帧按照字节逐个进行接收,首先检测引导字节,引导字节正确则检测起始字节,起始字节正确后继续往下接收,若错误则返回到检测引导字节,这样能够最大程度上满足数据帧接收的准确性与稳定性.具体的接收流程如图2所示.
数据帧中的引导字节、起始字节、结束符都是固定的内容,不需要再定义变量进行存储,其中的校验码只是在接收和发送数据时需要,也不需要放在需要处理的程序中.
4.1 数据帧的数据类型定义
typedef struct
{
unsigned char EquipmentType,
unsigned char EquipmentAddr,
unsigned char EquipmentCmd,
unsigned char EquipmentDataLen,
Unsigned char EquipmentData[64],
}Buf_TypeDef,
4.2 接收程序
首先定义两个全局变量用于记录接收字节的状态以及计算校验值.
unsigned char State等于0,
unsigned char CheckSum等于0,
下面是接收程序,可以放在系统接收数据的程序内即可,具有通用性.
Buf_TypeDef ReceiveBuf,
void ReceiveData(unsigned char ch)
{unsigned char i,switch(State){
case0:if(ch 等于等于 0xFE){State 等于 1,}break,
case 1:if(ch 等于等于 0x68){CheckSum 等于 0x68,
State 等于 2,}else if(ch !等于 0xFE){State 等于 0,}
break,case2:ReceiveBuf.EquipmentType等于ch,CheckSum +等于 ch,i 等于 0,State 等于 3,break,
case 3:ReceiveBuf.EquipmentAddr[i]等于ch,
CheckSum +等于 ch,i++,if(i >等于 4){State 等于 4,
}break,case 4:ReceiveBuf.EquipmentCmd 等于 ch,CheckSum +等于 ch,State 等于 5,break,case 5:ReceiveBuf.EquipmentDataLen 等于 ch,
CheckSum +等于 ch,i 等于 0,State 等于 6,break,
case 6:ReceiveBuf.EquipmentData[i]等于ch,
CheckSum +等于 ch,i++,if(i>等于ReceiveBuf.
EquipmentDataLen){ i 等于 0, State 等于 7,}
break,case 7:if(CheckSum 等于等于 ch)
{State 等于 8,}break,case 8:if(ch等于等于0x16)
{State等于0,//此处添加处理标志}break,
default:State 等于 0,break,}}
4.3 发送程序
使用发送函数之前首先要实现发送一个字节的函数SendOneChar(),并且将数据赋予Buf_TypeDef类型的变量.然后调用该函数就可以按照格式把数据帧发送出去.
void SendData(Buf_TypeDef *SendBuf){
unsigned char i等于0,
unsigned char CheckSum等于0,
for(i等于0,i<6,i++){SendOneChar(0xFE),}SendOneChar(0x68),CheckSum=0x68,
SendOneChar(SendBuf->EquipmentType),CheckSum +等于 SendBuf->EquipmentType,
for(i等于0,i<6,i++)
{SendOneChar(SendBuf->EquipmentAddr[i]),CheckSum +等于 SendBuf->EquipmentAddr[i],}
SendOneChar(SendBuf->EquipmentCmd),
CheckSum +等于 SendBuf->EquipmentCmd,
SendOneChar(SendBuf->EquipmentDataLen),CheckSum +等于 SendBuf->EquipmentDataLen,
for(i等于0,i
SendOneChar(CheckSum),SendOneChar(0x16),}
5.实际应用
该套智能家居协议已经用到局域网控制空调、电灯、电源等设备.春兰集团变频一级e星空物联网智能空调的柜机和挂机就是采用本协议,实际控制效果良好稳定.实际应用时可以根据不同的设备定义不同设备编码.该套协议适合通过手机、平板电脑控制控制家中的设备.通过他们向家中的设备发送命令数据帧,设备接收到命令数据帧后会返回应答数据帧,完全实现对所有设备的控制.
6.结束语
本文介绍了一种通用性的智能家居控制协议方案,理论上能够适用于所有的家电,在此协议框架的基础上完成上位机与家中设备之间的数据和控制指令的传输,能够有效的解决智能家居中对不同家电的控制.