Skip to content

lyming531/AirHome

 
 

Repository files navigation

AirHome 智能控制系统通信协议的实现

项目概述

  本项目是一个采用C#语言实现的智能家居控制系统通信协议。其适用于智能控制系统中智能设备模块(如WIFI、ZigBee、蓝牙和红外等)与远程服务器或本地智能设备(如手机、平板电脑、PC等)之间进行数据透明传输,协议定义了消息的功能和通信报文格式。

建议

  1. 为了数据的一致性,每条消息都需要进行回复,即有控制就有反馈、有请求就有响应。
  2. 在通信方式上终端模块与服务器采用TCP连接,而本地APP或PC端软件控制采用UDP通信。

约定

  1. 协议中所有编码方式采用UTF-8(8-bit Unicode Transformation Format)可变长度字符编码。
  2. 所有报文数据中的十六进制字符串均使用大写形式,即除09外,其他字母使用AF的大写形式。
  3. 消息头定义中的“消息体长度”不包括自定义转义字符ESC的长度,同时CRC不会对自定义转义字符ESC进行校验,而是对原字符进行校验,这与消息生成和解析的步骤有关。
  4. 由于存在转义字符的原因,相关字节长度会有相应的增加。如灯具色温调节代码0X1002由原来的2个字节变3个字节的0X101BE7,解析时请先替换回原字符。
  5. 对于灯具设备,如果有亮度调节、色温调节或RGB调节等功能,执行这些功能时将会使用继电器(如果有的话)自动打开。
  6. 为了实现灯具设备状态的记忆功能,同时区别最小亮度调节关闭灯具设备功能,约定1%为最小的调光等级,具体实现效果由灯具设备决定。

定义

  1. 设备ID:设备ID有时也称为UID,每个通信模块出厂时可以人为给定一个编号并烧录到模块中,作为通信模块的唯一标识符。
  2. 通道编号:如果一个设备ID所对应的模块可以控制多个子设备,那么每个子设备通过一个通道编号来标识。需要注意的时,每个子设备可能拥有不同的功能,具体的功能将会在搜索设备时由底层(终端执行控制设备)反馈给上层(服务器或APP等)。
  3. 消息类型:用于表示报文传输的方向和类型,目前支持以下四种,即服务器或APP客户端到终端设备、终端设备到服务器或APP客户端、终端设备主动上报到服务器或APP客户端,以及服务器或APP客户端响应终端设备的上报中告警。
  4. 消息ID:它是一个功能消息的唯一标识。如果一个消息ID为0X0000,那么该消息可能具有多个功能。
  5. 消息参数:由参数类型、参数值长度和参数值组成。此参数可以根据所需功能无限扩展。
  6. 设备功能:即是每个设备(或子设备)所具有的功能,将来可以通过功能代码继续扩展。

缩写

  1. STX:通讯专用字符即文始字符,其全称为Start Of Text,ASCII码值为0X02,它标志着传送正文(数据块)的开始。
  2. ETX:通讯专用字符即文终字符,其全称为End Of Text,ASCII码值为0X03,它标志着一个数据块的结束。
  3. ESC:Escape的简写,也称转码字符,ASCII码值为0X1B,本文用于对数据帧起始符和结束符之间出现的STX、ETX以及自身ESC的转义。
  4. CRC:循环冗余校验(Cyclic Redundancy Check),它是一种常用的差错校验码,用于确保数据传输的正确性和完整性。本文使用的是CRC16查表算法。

分区及功能

  每个家庭单元可能拥有一个住所,也有可以拥有多个不同的住所,如一个常住的住所和一个用于度假的别墅。这些依据住所之间可能相距很远,但他们都属于同一个家庭。每个住所由多个房间组成,这些房间可能还会分上下楼,具体的分区由用户自己决定,每个家庭的房间也有所不同。

PartitionTier

分区层级

  1. 家庭作为整个分组的根, 其包含一个或多个住所。
  2. 住宅是包含一个或多个区域的住所,一个家庭可能拥有多个住所,例如一个主要的住宅和一个度假的别墅。一般而言,一个家庭至少包含一个住所,这个住所也可以不在同一个地方,但在逻辑上它是一体的。
  3. 区域是房间和场所的集合,比如“楼上”、“楼下”和“车库”等。每个住所包含一个或多个区域、每个区域由一个或多个房间或场所组成。
  4. 房间是分区的最小单位,每个住所包含一个或多个房间。

功能结构

FunctionStructure

  1. 设备:此处的设备即为智能产品,其拥有一个或多个通道,具有一个或多个功能,支持WiFi或蓝牙等通信方式进行连接。
  2. 通道:通道也称为回路,每个通道对应一个“子设备”,并可能拥有不同的功能。例如一个智能设备中可能由灯具、摄像头、电机和各种传感器等组成,要想只通过一个WIFI模块控制这些“子设备”,就必须分多路进行操作,而且每一路均有自己的功能特点和控制方式。回路也称为通道,一个回路对应一个“子设备”,如果回路编号为0X00,表示所有回路。
  3. 功能:设备拥有的功能是由设备特性所决定的,例如灯具产品可能拥有开关、亮度调节、色温调节、色彩调节和模式切换等功能,而空调可以进行开关、温度调节以及各种模式切换等。
  4. 数据点:数据点是对功能的细化,每个功能对应一个或多个数据点。例如开关功能对应一个开或关状态的数据点,亮度调节功能对应该一个亮度值数据点;而色温调节功能需要冷色温值和暖色温值两个数据点来实现;色彩调节功能需要红光、绿色和蓝光三个数据点才能实现。

设备功能

  1. 配置功能:配置功能用于对设备的信息进行设置操作,如搜索设备、定位设备、设备分组、设置设备名称、设置备注信息、设置定时任务时间、同步时间和恢复出厂设置等。
  2. 控制功能:控制操作会改变设备的工作状态,如电气参数、物理状态等,灯具常用的控制操作如打开或关闭、调节灯具亮度、调节灯具色温、调节灯具RGB等。
  3. 数据采集:为了查看设备当前的运行状态,可以使用数据采集命令到获取,灯具常用的状态包括开关、亮度、色温和RGB等;同时也可以使用该命令来获取设备分组、名称以及备注等信息。
  4. 主动请求:设备根据预先设置的地址主动进行请求,如上电后自动登录到服务器以及定时向服务器发送心跳包等。
  5. 事件上报:当设备检测到事件报警或设备的某此参数超过设定的阈值时,就会触发事件上报。该功能可能需要相关传感器的支持。
  6. 数据点功能:数据点功能是相关功能的细化,它可以用于扩展新功能。

通信流程

消息下发与回复流程

  服务器或APP客户端向终端设备发送报文消息,终端设备在一定时间内收到该消息后应返回相关的报文消息作为回复。

  若服务器或APP客户端在T1秒时间内收到终端设备回复的报文消息,那么说明消息发送成功;但如果服务器或APP客户端在该时间内未收到终端设备的回复消息,将重新发送该报文消息。

  若重发N1次后服务器或APP客户端仍然没有收到终端设备的回复消息,那么将认为报文消息发送失败。其中时间间隔T1和重发次数N1都是可配置的参数,该参数由服务器或APP客户端配置到终端设备进行保存;T1推荐值为5秒,N1推荐值为2次。

MessageSend

事件上报与响应流程

  当终端设备某一参数达到阈值或传感器触发报警,就是主动上报事件告警,服务器或APP客户端收到事件消息后,会在一定时间内做出响应。

  如果终端设备在T2秒内收到了来自服务器或APP客户端的响应消息,则认为事件告警上报成功;与消息下发流程类似,如果终端设备在该时间内没有收到来自上层的响应消息,那么终端设备应该重新发送事件上报消息。

  在重新发送事件上报消息之前,应该判断消息重发次数是否大于N2次。若重发次数已经大于该次数,则认为事件上报消息发送失败。其中时间间隔T2和重发次数N2都是可配置的参数,该参数由服务器或APP客户端自动保存;T2推荐值为5秒,N2推荐值为2次。

EventReport

心跳包处理流程

  终端设备在与远程服务器通信时,为了确保双方相互知道对方的在线状态,采用相互发送心跳包的方式来解决。例如在服务器端,可能需要开启一个线程来检测是否有新的数据发送过来,如果检测到通信链路收到数据,那么就会等待T3秒,然后再次检测是否收到数据;如果没有检测到通信链路收到数据,服务器就会向终端设备发送一个心跳数据。

  心跳数据发出之后,服务器会等待T4秒钟,看是否收到终端设备的响应。如果此间服务器收到了终端设备的响应,则继续等待T3秒,然后再次检测是否收到新数据。当然,如果T4秒之后仍然没有收到终端设备的响应,那么服务器将重新发送心跳数据。

  若重发心跳数据重发N3次后还是未收到终端设备的响应,则应该认为终端设备已经离线,此时应释放与此终端设备的通信连接。上述提到的等待时间T3、时间间隔T4和重发次数N3都应该是可配置的参数,该参数在服务器、APP客户端和终端设备都需要保存;T3推荐值为100秒,T4推荐值为5秒,N3推荐值为3次。

HeartbeatPacket

  对于下位机而言,处理上述复杂的心跳包流程可能有些困难,此时可以使用较为简单的方式予以实现。例如在下位机上电之后,等待T3秒后向服务器发送一次心跳包指令,然后继续等待T3秒,又向服务器发送一次心跳包指令,如此循环即可。

HeartbeatPacket

报文格式

  为了生成和解析消息具有一致性,并且方便后续扩展新的功能,所有消息数据均采用十六进制形式表示,所有功能指令均进行参数化处理。

消息格式定义

  消息报文格式的定义由起始符、消息头、消息体和结束符组成,其具体长度随消息体长度的改变而变化。

起始符消息头消息体结束符
表示STXHEADBODYETX
长度1Byte12Byte可变1Byte
取值0X020X03

转义字符定义

  当数据帧起始符和结束符之间(即消息头和消息体中)出现STX,ETX或ESC时,需要进行转义。

  • STX转义为ESC和0XE7,即02->1BE7
  • ETX转义为ESC和0XE8,即03->1BE8
  • ESC转义为ESC和0X00,即1B->1B00

消息头定义

  消息头的长度总共有12个字节,依次定义了1个字节的消息类型、2个字节的消息体长度、4个字节的消息序号、3个字节的预留字段和2个字节的消息体CRC校验。

消息类型消息体长度消息序号预留CRC校验
长度1Byte2Byte4Byte3Byte2Byte
取值00~FF0000~FFFF00000000~FFFFFFFF0000000000~FFFF

消息类型:表示消息在设备与服务器或APP之间关系。
消息体长度:可变消息体所占的字节数。
消息序号:取值范围为0~232-1,达到最大值后自动返回从0开始。
CRC校验:对消息体的CRC校验,采用CRC16算法。

消息体定义

  消息体定义了消息ID、设备ID和参数列表,其中参数列表由多个参数依次排列,每个参数由参数类型、参数值长度和参数值组成。消息体的长度由参数值长度及参数个数不同而不固定。

消息ID设备ID参数列表
参数1类型参数1值长度参数1值参数2...
长度2Byte8Byte2Byte1Byte可变
取值

消息ID:报文消息的代码。
设备ID:用于标识设备唯一性的UID,分配方式待定,如果全为0表示广播。兼容其他厂商时,若超过8个字节,取其低(右边)8个字节;若小于8个字节,左边使用0填充。
参数类型:参数的类型代码。
参数值长度:表示某个参数值的字节数,该值不应超过它的类型规定的最大取值。
参数值:长度可变的字符串十六进制表示。

消息类型

代码含义备注
0X00表示服务器或APP客户端到终端设备
的配置、控制和获取状态操作。
0X01表示终端设备反馈相关信息到服务器
或APP客户端。
即反馈0X00操作执行的结果。
0X02表示终端设备主动请求或上报自己的
状态或告警到服务器或APP客户端。
0X03表示服务器或APP客户端响应终端设
备的状态上报或告警。
即响应0X1BE7请求或上报
操作执行的结果。
0X04预留

消息ID

代码范围功能备注
0X0000配置指令包含多个功能
0X0001设置模块或通道分区代码
0X001BE7设置模块或通道分区名称
0X001BE8设置模块或通道名称
0X0004设置模块或通道描述信息
0X0005设置模块或通道图片名称或地址
0X0006设置模块的时区默认为东八区
0X0007同步时间到模块中需要有时钟功能
0X0008设置模块或通道定时任务时段如对灯具进行定时打开、关闭
以及调光等,也可以设置触发
报警的时间段。可以只有开始
时间,也可以包含开始时间和
结束时间。若开始时间大于结
束时间,则表示结束时间为第
二天;若包含两个以上的参数,
则表示设置多个时段。
0X0009
0X000A
...
0X0010设置模块的型号通过配置工具进行配置,一般
情况下在出厂时配置,后继不
能随意更改。
...
0X00B0设置串口波特率
0X00B1设置串口数据位
0X00B2设置串口停止位
0X00B3设置串口校验位
0X00B4
...
0X00C0设置WiFi模块的运行模式如User、AP或一键配置模式
0X00C1设置模块的SSID,即无线网络名称如果模块运行在服务模式,则建
立一个该名称的无线网络;如果
模块运行在客户端模式,则尝试
加入该名称的无线网络
0X00C2设置模块的WiFi密码
0X00C3设置模块的IP地址
0X00C4设置模块的网关地址
0X00C5设置模块的子网掩码
0X00C6设置模块的DNS地址
0X00C7设置模块的DHCP功能
0X00C8设置DHCP地址池起始地址
0X00C9设置DHCP地址池结束地址
0X00CA设置模块的MAC地址一般不用设置
0X00CB设置模块网络协议
0X00CC设置TCP端口
0X00CD设置UDP端口
0X00CE设置HTTP端口
0X00CF
...
0X00D0设置访问服务器的IP地址二者选其中一个
0X00D1设置访问服务器的域名
0X00D2设置访问服务器的端口
0X00D3设置访问服务器的用户名
0X00D4设置访问服务器的密码
0X00D5
...
0X00E0设置事件上报等待时间T2
0X00E1设置事件上报重发次数N2
0X00E2设置心跳包间隔时间T3
0X00E3设置心跳包等待时间T4
0X00E4设置心跳包重发次数N3
0X00E5
...
0X00FF恢复出厂设置慎用
...
0X0000控制定位设备或通道继电器开关、亮度、颜色、声音
等状态变化来进行定位响应
0X1001打开或关闭设备
0X101BE7调节灯具亮度
0X101BE8调节灯具色温
0X1004调节灯具RGB
0X1005
...
0X2000数据采集搜索模块及通道设备登录后服务器进行查询
0X2001发送心跳包服务器向设备
0X201BE7获取模块或通道的开关状态
0X201BE8获取模块或通道的亮度
0X2004获取模块或通道的色温
0X2005获取模块或通道的RGB
0X2006获取模块或通道的分区代码
0X2007获取模块或通道的分区名称
0X2008获取模块或通道的名称
0X2009获取模块或通道的备注
0X200A获取模块或通道的图片名称或地址
0X200B
...
0X2010获取模块型号可在一定程度上代替搜索
指令
...
0X20C0获取设备通信类型如WIFI、GPRS、3G、4G、
ZigBee、蓝牙和红外等
0X20C1获取WiFi模块的运行模式
0X20C2获取SSID无线网络名称和信号强度模块本身或接入路由器的
SSID
0X20C3获取模块周围无线网络的名称和
信号强度
可以包括多个无线网络名称
和信号强度
0X20C4获取设备的IP地址
0X20C5获取设备的网关地址
0X20C6获取设备的子网掩码
0X20C7获取设备的DNS地址
0X20C8获取设备的MAC地址
0X20C9
...
0X3000主动请求登录到服务器设备到服务器,上电后自动
连接服务器
0X3001发送心跳包设备向服务器
0X301BE7
0X301BE8
0X3004
...
0X4000事件上报
0X4001
0X401BE7
0X401BE8
0X4004
...
0XE000数据点功能

参数类型

代码取值最
大长度
含义取值备注
0X00001Byte无参数0X00用于占位
0X00011Byte通道数量0X01~0XFF表示一个设备中控制模块
所能控制的“子设备”的数
量,每个“子设备”的功能
可能不一样。
0X001BE71Byte通道编号0X01~0XFF表示一个设备中控制模块
所能控制的“子设备”的编号。
0X00表示所有通道。
0X001BE84Byte模块或通道分区代码0X00000000~
0XFFFFFFFF
0X000000表示所有区
第1个Byte预留
第2个Byte表示住宅
第3个Byte表示区域
第4个Byte表示房间
0X000450Byte模块或通道分区名称
0X00051Byte模块及通道功能表示设备具有的功能。
一个功能与一个“子设备”
对应,每个子设备可能有
多个功能。
0X000650Byte模块或通道名称
0X0007100Byte模块或通道描述信息
0X0008100Byte模块或通道图片的
名称或地址
0X00094Byte时区表示方式:±HHmm00
第1个Byte表示时区
 0X00表示东时区,
 0X01表示西时区
第 2个Byte表示时区小时量
第3个Byte表示时区分钟量
第4个Byte预留
例如0X00080000表示东八区
0X000A8Byte日期时间例如
0X07DE0C04
0B1E0000
表示
2014-12-04
11:30:00
第1~2个Byte表示年
第3个Byte表示月
第4个Byte表示日
第5个Byte表示小时
第6个Byte表示分钟
第7个Byte表示秒钟
第8个Byte预留
0X000B4Byte日期时间
(另一种形式)
0X00000000~
0XFFFFFFFF
表示格林威治标准时间
(GMT)1970年1月1日
0时0分0秒到当前时间所
间隔的秒数
0X000C2Byte时间间隔0X0000~
0XFFFF
单位为秒
0X000D1Byte次数0X01~0XFF一个字节的标量数值
0X000E
...
0X00101Byte模块型号0X00~0XFF通过此型号可以知道模块
所具有的功能
...
0X00A0
...
0X00B03Byte波特率0X000000~
0XFFFFFF
0X00B11Byte数据位0X05~0X08
0X00B21Byte停止位0X00~0X030X00表示None
0X01表示One
0X1BE7表示Two
0X1BE8表示OnePointFive
0X00B31Byte校验位0X00~0X040X00表示无
0X01表示奇校验
0X1BE7表示偶校验
0X1BE8表示标志校验
0X04表示空检验
0X00B4
...
0X00C01ByteWiFi模式0X00~0XFF0X00表示服务器模式
0X01表示客户端模式
0X00C132ByteSSID无线网络名称
0X00C264ByteWiFi密码
0X00C31Byte加密方式0X00~0X070X00表示NONE
0X01表示WEP
0X1BE7表示WPA_TKIP
0X1BE8表示WPA_AES
0X04表示WPA2_TKIP
0X05表示WPA2_AES
0X06表示WPA2_MIXED
0X07表示AUTO
0X00C41Byte信号强度0X00~0XFF只读属性
0X00C515Byte模块IP地址如:192.168.1.100
0X00C615Byte模块网关地址如:192.168.1.1
0X00C715Byte模块子网掩码如:255.255.255.0
0X00C815Byte模块DNS地址如:192.168.1.1
0X00C91Byte模块是否启用
DHCP模式
0X00表示禁用
0X01表示启用
0X1BE7
 表示创建DHCP服务器
0X00CA17Byte模块MAC地址如:AA-BB-CC-DD-EE-FF
0X00CB1Byte网络协议0X00~0XFF0X01表示TCP
0X00表示UDP
0X1BE7表示HTTP
0X00CC2ByteTCP端口0X0000~
0XFFFF
0X00CD2ByteUDP端口0X0000~
0XFFFF
0X00CE2ByteHTTP端口0X0000~
0XFFFF
默认80
0X00CF
...
0X00D015Byte服务器IP地址
0X00D150Byte访问服务器的域名
0X00D22Byte服务器监听的端口号0X0000~
0XFFFF
0X00D320Byte登录服务器的用户名默认为admin
0X00D432Byte登录服务器的密码默认为空。32位MD5加密,
为空时不加密。
0X00D5
...
0X10001Byte打开或关闭0X00、0X010X00表示关
0X01表示开
0X10011Byte亮度0X01~0XFF0X01表示1%亮度
0XFF表示100%亮度
0X101BE71Byte冷色温分量0X00~0XFF 与灯具设备有关,取值表
示冷色温分量,暖色温分量
由单片机处理。
公式:
冷色温+暖色温=当前亮度
 此作法是为了使调节色
温时功率(表现为亮度)
不变,同理调节功率(表现
为亮度)时也要求色温不变。
0X101BE84ByteRGB0X00000000~
0XFFFFFFFF
第1个Byte表示红分量
第2个Byte表示绿分量
第3个Byte表示蓝分量
第4个Byte表示白光。
 00表示暖白,FF表示冷白
0X1004
...
0XE0001Byte布尔类型参数
0XE0011Byte枚举类型参数
0XE01BE71Byte数字类型参数
0XE01BE84Byte扩展类型参数
0XE004100Byte
...
0XFFFF1Byte响应码0X00~0XFF0X00表示成功,
其他代码表示错误。

设备功能

代码含义备注
0X00具有时钟功能的设备拥有定时和同步时间功能
0X01支持本地语音控制的设备用于扩展的功能,可为上层
APP界面提供数据来源
0X1BE7支持电话指令控制的设备
0X1BE8支持手机短信控制的设备
0X04可随音乐变换场景的设备
0X05可随影片变换场景的设备
0X06可随图片颜色变换场景的设备
0X07支持IFTTT功能的设备
0X08支持HomeKit平台的设备
0X09支持微信设备功能的设备
0X0A支持QQ物联平台的设备
0X0B支持阿里智能云物联平台的设备
0X0C支持京东微联的设备
0X0D支持海尔U+平台的设备
0X0E
...
0X20支持WPS功能的WIFI设备
0X21支持EasyLink功能的WIFI设备
0X22支持AirKiss功能的WIFI设备
0X23支持AirLink功能的WIFI设备
0X24支持SmartLink功能的WIFI设备
0X25支持AirSync功能的蓝牙设备
0X26
...
0X30具有开关功能的灯具操纵继电器开关
0X34具有亮度调节功能的灯具
0X32具有色温调节功能的灯具
0X33具有RGB调节功能的灯具
0X34
...
0X40具有开关功能的摄像头操纵继电器开关
0X41具有拍照功能的摄像头
0X42具有录像功能的摄像头
0X43具有远程监控功能的摄像头
0X44具有语音对讲功能的摄像头
0X45具有人脸检测功能的摄像头
0X46具有人脸识别功能的摄像头
0X47具有行为分析功能的摄像头
0X48具有安防功能的摄像头设防和撤防功能
0X49具有分贝报警功能的摄像头
0X4A具有区域检测功能的摄像头
0X4B具有划界报警功能的摄像头
0X4C具有焦距调节功能的摄像头
0X4D具有云台调节功能的摄像头
0X4E
...
0X60门锁窗帘
...
家电等
0X80
...
传感器类
0XE0温度传感器
0XE1湿度传感器
0XE2亮度传感器
0XE3照度传感器
0XE4风速传感器
0XE5PM2.5传感器
0XE6雨水传感器
0XE7烟雾传感器
0XE8有毒气体传感器
...

响应代码

代码描述备注
0X00成功
0X01命令格式错误
0X02CRC校验错误
0X03不支持该类型的命令例如消息类型未定义
0X04不支持该操作例如消息ID未定义
0X05命令无法执行例如参数类型未定义
0X06参数个数错误例如与消息ID所需要对应的参数不一致
0X07参数格式错误例如参数值长度与参数值的字节数不对应
0X08
...
0XFF未知错误

消息处理机制

  为了统一消息生成和解析的机制,更好的理解和处理消息体长度、消息体CRC校验以及消息头和消息体中的转义字符,故引入了消息的生成步骤和解析步骤。
  下面将以调节灯具设备的色温(1002)为例,说明消息生成和解析的步骤。灯具设备的ID为00…00(具体设备ID位数和数值视实际情况而定),调节其通道1(0002 01 01)为偏冷的色温(1002 01 FF)。

MessageExample

  此例中消息类型为00,表明此消息由服务器或APP客户端发送至终端执行设备;消息体长度为0012,即18个字节;消息序号为00000000,表示此消息流水号为0;预留字段建议以全0填充;消息体CRC校验为14CD。

消息生成步骤

  若想创建一条消息报文,需要经过以下几个步骤,即组织消息体、计算消息体、组织消息头、转义特殊字符以及添加起止符等。

GenerateMessage

  • 组织消息体

消息体的内容包括消息ID、设备ID和参数列表,参数列表由参数值长度、参数类型和参数值组成,详见第5.4节消息体的定义。

1003 00…00 0002 01 01 1002 01 FF

  • 计算消息体

  通过消息的内容可以方便的计算出消息体长度和消息体CRC校验,本例中假设消息长度为0012,消息体CRC校验为14CD

  • 组织消息头

  根据实际情况得到消息类型和消息序号,结合上述消息体计算出来的消息体长度和消息体CRC校验,最终得到消息头的内容如下所示:

00 0012 00000000 000000 14CD

  • 转义特殊字符

  此步骤是对消息头和消息体中出现的STX、ETX或ESC字符进行转义替换。最终转义后的消息头和消息体的内容如下所示:

00 0012 00000000 000000 14CD

101BE8 00…00 001BE7 01 01 1200 01 FF

  • 添加起止符

  最后一步是在消息两端添加起始符和结束符,一条完整的消息报文就创建好了。具体消息报文内容如下所示:

02

00 0012 00000000 000000 14CD

101BE8 00…00 001BE7 01 01 1002 01 FF

03

消息解析步骤

  解析消息首先需要通过判断起止符,从而得到一条完整的消息报文;然后去除消息报文两端的起止符,得到转义后的消息头和消息体;再将转义字符替换回原字符,此时就得到了原始的消息头和消息体;再通过读取消息头并获取消息体长度、消息体CRC校验等信息,通过这些信息就可以获取到消息体内容;最后通过对消息体的内容进行CRC校验,并将其与消息头中的CRC校验进行对比,如果两者相同,说明消息有效,进而进行消息体各参数的解析操作。

ParseMessage

  • 判断起止符

  进行消息解析的第1步是通过判断起始符和结束符,得到一条完整的消息报文内容。完整报文的详细信息如下所示:

02

00 0012 00000000 000000 14CD

101BE8 00…00 001BE7 01 01 1002 01 FF

03

  • 去除起止符

  得到完整的消息报文内容之后,第2步就可以去掉消息报文两端的起始符和结束符,获得消息头和消息体组成的内容。内容如下所示:

00 0012 00000000 000000 14CD

101BE8 00…00 001BE7 01 01 1002 01 FF

  • 去除转义字符

  上述消息头和消息体组成的内容包含了特殊字符的转义,需要将其替换回原字符,以便于后继数据的读取。替换回原字符后得到的内容如下所示:

00 0012 00000000 000000 14CD

1003 00…00 0002 01 01 1002 01 FF

  • 读取消息头

  由于消息头长度为12个字节,故可以方便地从上述内容中获取消息头的信息;同理消息头中包含的消息类型、消息体长度、消息序号和消息体CRC校验等信息也可以轻松的获取到。消息头的内容如下所示:

00 0012 00000000 000000 14CD

  • 获取消息体

  这一步可以通过上述消息头中获取到的消息体长度来获取消息体的内容。消息体的内容具体如下所示:

1003 00…00 0002 01 01 1002 01 FF

  • 消息体CRC校验

  将消息体进行CRC校验,并与消息头中的CRC进行比较,如果通过消息体的内容计算出来的CRC数据与消息头中包含的CRC数据一致,说明此消息报文有效,可以进行下一步的数据读取。

  • 读取消息体数据

  如果来到了这一步,那说明上述消息报文是有效的,可以读取消息体中的消息ID、设备ID、参数列表等信息,然后通过参数列表解析出参数类型和参数值。

  • 处理相关逻辑

  通过上述步骤,已经获得了消息ID、设备ID以及所需的参数列表,接下来就可以进行相应的逻辑操作了,如将数据保存到数据库、执行相关操作、返回相关数据等。

About

这是一个基于C#的智能家居控制系统通信协议的实现。

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C# 100.0%