首页 > 服务中心 > 晶控课堂 >

KC868-H8_H32智能家居控制盒通信协议详解

2018-12-23 16:32
分享到:
通过阅读第一期文章——《第一个打开/关闭电灯的Hello World小程序》,相信你已经可以通过电脑写个简单的PC程序来控制一个灯泡的开与关,一定很兴奋了吧。恭喜,你已经跨入物联网的第一道大门,今天我们将对KC868-H8智能控制盒的通信协议做一下全面的分析与学习,这样,你就可以充分发挥自己的想象力,对控制盒进行本地、远程、智能化的控制甚至是联动控制,真正接触到他的强大所在,给你绝对的DIY灵活度。

  物联网将万物进行互联,在整个系统中,有云端,有客户端,有硬件底层端,之前我们之前是独立存在的,互相之间就是彼此陌生的,只要大家遵循统一的标准,这样每个局部都可以听懂得对方,甚至可以进行交流。比如:咱们各地的人当地的方言,外地的听不懂,这时候如果大家都讲普通话,所有的人都可以明白大家想表达的意思了。通信协议在整个体系中,就起到了标准化的关键作用,从而让所有的设备能够懂对方。

  下面,我们来一起学习一下KC868-H8智能控制盒的通信协议,看看他是如何和其它设备进行交流的。注:通信协议中有出现KC868-H8和KC868-H32两种型号,KC868-H8是带8路继电器开关的智能控制盒;KC868-H32是带32路继电器开关的智能控制盒,这是两种不同配置的产品,不同的继电器路数可以适用不同的使用场景。

kc868-h8
KC868-H8 外形图片

32路继电器板
KC868-H32 外形图片

  首先,我们列出所有的通信协议内容,以下所有的内容,当智能控制盒通过以太网配置工具,把自己设置成“TCP服务器”模式下,均可通过客户端,如PC端进行命令的收发实现交互通信,控制盒默认的IP和端口参数是IP地址:192.168.1.200,端口:4196
  通信协议的学习与调试,我们可以使用网络调试助手软件,也可以从杭州晶控电子官网进行下载使用。
网络配置

1.查询智能控制盒设备型号:
发送:RELAY-SCAN_DEVICE-NOW
返回:RELAY–SCAN_DEVICE–CHANNEL_8/CHANNEL_32,OK/ERROR
 
  这是一条查询设备类型的指令,我们想获得当前连接的设备类型时,可以发送以上参数。目前智能控制盒有两种不同配置的型号,即命令下发后,如果获取成功会返回:“RELAY–SCAN_DEVICE–CHANNEL_8,OK” 或 “RELAY–SCAN_DEVICE–CHANNEL_32,OK”这两种类型的字符串。返回值最后面的数字“8”代表该控制类型为KC868-H8,“32”代表该控制类型为KC868-H32。

智能家居通信协议

2.智能控制盒服务器工作模式开启:
发送:RELAY-TEST-NOW
返回:RELAY-TEST-START
 
  这是一条智能控制盒的初始化命令,当控制盒处于“TCP服务器”模式时,需要发送这条初始化命令让控制盒进入工作状态,该工作模式开启后,后续所有通信协议中的“包序号”参数均可使用固定的数值即可,我们在后面的协议解析中会再说明一下。

智能家居协议

3.KC868-H8设备初始化命令集:
发送:RELAY–SCAN_DEVICE–NOW
发送:RELAY-TEST-NOW
 
  这是作为智能控制盒的初始化命令集,每一次设备上电或重新上电后,必须首先发送这两条命令来进行设备的初始化工作,具体命令的返回值,前面已讲。待“RELAY-TEST-NOW”这条命令发送后,有返回“RELAY-TEST-START
”字符串后,我们就可以进行自由地使唤控制盒了。
 
4.单独控制某一路继电器的开与关:
发送:RELAY-SET-x(1字节pack_num),x(1字节继电器序号),x(1字节动作0/1)
返回:RELAY-SET-x(1字节pack_num),x(1字节继电器序号),x(1字节动作0/1),OK/ERROR

  这条命令是我们在第一期文章中所介绍到的核心指令,也是最让人兴奋的一条硬件版的Hello World指令,它可以控制某一路继电器的打开或关闭,指令非常简单,通俗易懂。首先,第一个参数pack_num,我们已经有前面讲到过,当控制盒在“TCP服务器”模式下,该参数已经没有意义,比如:我们可以设置成数字“1”固定不变。但你可能会问,既然没有用的参数,为什么还要放在指令中作为参数呢,那不是挺麻烦?呵呵,“包序号”的真正意义将会在远程控制模式中体现出来,只是我们的教程现在还没有讲到,我们将会在后期的“远程控制模式”教程中使用到它。协议中的第3个字节参数——“动作0/1”的意义在于,“0”表示“关闭”;“1”表示“打开”。我们举个例子来看一下,比如:我们要打开第1路继电器,我们可以发送命令“RELAY-SET-1,1,1”,第1个参数“1”表示固定的包序号;第2个参数的“1”表示第1路继电器,第三个参数“1”表示“打开”。如果我们要关闭第1路继电器,我们可以发送命令“RELAY-SET-1,1,0”,第1个参数“1”表示固定的包序号;第2个参数的“1”表示第1路继电器,第三个参数“0”表示“关闭”。如果我们要打开第2路继电器,我们可以发送命令“RELAY-SET-1,2,1”,第1个参数“1”表示固定的包序号;第2个参数的“2”表示第2路继电器,第三个参数“1”表示“打开”。看到这里,你应该感觉控制继电器原来是那么容易吧。略有点小成就感吧:)

智能家居通信协议

硬件控制电灯

5.单独查询某一路继电器当前开关状态:
发送:RELAY-READ-x(1字节pack_num),x(1字节继电器序号)
返回:RELAY-READ-x(1字节pack_num),x(1字节继电器序号),x(1字节状态0/1),OK/ERROR
 
  当我们时不时控制继电器的“打开”、“关闭”、再“打开”、再“关闭”........,等时间久了,我们可能已经不知道控制盒上继电器当前的工作状态了,有时候我们在做控制之前,还是需要知道他们的当前设备的,目前是“打开”的,还是“关闭”的。这时候,我们便可以使用继电器的查询命令来进行查询了。比如:我们要查询第1路继电器现在是处于“打开”还是“关闭”状态,我们可以发送:“RELAY-READ-1,1”,第1个参数“1”表示固定的包序号;第2个参数“1”表示需要查询的路数。此时,查询成功后,控制盒会返回“RELAY-READ-1,1,OK”,第2个参数“1”表示现在的状态为“打开”状态,如果是“0”表示现在的状态为“关闭”状态。想查询第几路继电器,直接将路数参数更改即可。

智能家居二次开发

6.查询触发输入端状态:
发送:RELAY-GET_INPUT-x(1字节pack_num)
返回:RELAY-GET_INPUT-x(1字节pack_num),x(1字节状态),OK/ERROR
 
注:当控制盒触发输入端被触发时,会主动上报一条命令,格式为:RELAY-ALARM-X,X代表被触发的路数。
 
  触发输入端是控制盒用来接开关量传感器的输入端子,如图中控制盒的一侧,由高位和低位组合成一组开关量输入端,他有多元化的实际应用方式,比如:你可以接手动开关,软件中可以定义好,当手动按下开关后,输出端的继电器会执行哪些动作;当有线开关量的传感器信号接入时,软件中可以定义好,当传感器被触发时,输出端的继电器会执行哪些动作,这就是我们通常说的智能联动,也是智能家居中最广泛的应用方法之一。联动的自动化控制过程中,第一步就需要我们去获得触发事件的状态,即什么时候被触发,哪路传感器被触发。此时,我们可以使用触发输入端的查询命令发给控制合,如:“RELAY-GET_INPUT-1”,查询成功后,控制盒会返回:“RELAY-GET_INPUT-1,255,OK”,第2个参数“255”即是8路触发端的状态字节。我们用8位二进制来表示8路输入端状态。用“0”表示“触发”,用“1”表示“未触发”。如果当前8路状态全部是“未触发”的话,那么8路输入端的状态为 11111111,注意,这是二进制的8个“1”,然后我们将其转换为十进制数,为“255”。如果当前8路状态全部是“触发”的话,那么8路输入端的状态为 00000000,注意,这是二进制的8个“0”,然后我们将其转换为十进制数,为“0”。如果当前8路状态是1-4路是“未触发”,5-8路为“触发”的话,那么8路输入端的状态为 00001111,注意,这是二进制的“00001111”,然后我们将其转换为十进制数,为“15”。在程序中,我们不需要不断的循环去查询状态,可以利用触入端被触发器的主动上报命令进行配合而进行查询,当触发信号产生时,客户端接收到“RELAY-ALARM-X”的指令串时,再发送一条“RELAY-GET_INPUT-x”进行查询。如下图所示,当我们用镊子手动短接第一路的输入端时,则控制盒会主动上报字符串“RELAY-ALARM-1”到PC客户端,这时,我们发送查询第1路输入端的命令后,返回字符串“RELAY-GET_INPUT-1,254,OK”,我们将数字十进制数“254”转换为二进制数为“11111110”,所以可以得知第1路输入端被触发。

智能家居调试

智能家居开发

十进制数

二进制数

7.查询智能控制盒序列号:
发送:RELAY-HOST-NOW
返回:HOST-CHKLIC-8a2af927888793c9a22280b8(返回控制盒序列号)
 
  每一台控制盒设备都有一个唯一的标识符,类似于每个人的身份证号码一样,为了做好设备的维护和管理工作,也不例外,如发送:“RELAY-HOST-NOW”命令后,将返回“HOST-CHKLIC-8a2af927888793c9a22280b8”,其中最后一个“-”后面的一长串数字、字母的组合,即为设备的序列号,“8a2af927888793c9a22280b8”是设备的序列号,序列号将用于后期关于远程控制的教程中使用。同时,这也是一条设备继电器的测试命令,如果发送此命令给控制盒,控制盒的第1-8路继电器会依次打开,然后第1-8路继电器再依次关闭,作为一条简单的继电器测试命令。

智能家居系统

8.一次控制多路继电器的开与关:
 
KC868-H8:
发送:RELAY-SET_ALL-x(1字节pack_num),D0
返回:RELAY-SET_ALL-x(1字节pack_num),D0,OK/ERROR
 
KC868-H32:
发送:RELAY-SET_ALL-x(1字节pack_num),D3,D2,D1,D0
返回:RELAY-SET_ALL-x(1字节pack_num),D3,D2,D1,D0,OK/ERROR
 
  之前所介绍的通信协议中,我们已经可以分别对每一个继电器进行“打开”和“关闭”的操作了,这里,我们再介绍一条多路继电器同时进行控制的指令,他们是区别在哪里呢?前面我们所讲的控制继电器都是针对某一个的,如果要控制多个继电器开关,就是需要发送多条控制命令,需要若干时间去执行。这里,我们介绍的指令,可以实现一次性控制多路继电器开关,如“全开”、“全关”,或者某几路“打开”,某几路“关闭”的操作,只需要一条指令,多路控制速度非常快。我们可以看到命令中,除了“包序号”参数之外,只有一个字节的参数了,这一个字节就代表了8路继电器想进行控制的状态设置,用“1”表示“打开”,用“0”表示“关闭”,同样,也是用8位二进制来表示各路继电器的状态,再转成十进制数。如:我们要将8路继电器全部打开,则可以发送命令“RELAY-SET_ALL-1,255”,我们要将8路继电器全部关闭,则可以发送命令“RELAY-SET_ALL-1,0”,如果要将1-4路继电器打开,5-8路继电器关闭,那么参数是这样定义的,二进数表示:00001111,转换为十进制数为“15”,最终发送命令为“RELAY-SET_ALL-1,15”。在协议内容中,我们看到还有KC868-H32型号的控制盒,即他有32路继电器可以让我们进行控制,所以,他是用4个字节来表示所有继电器的状态的,1-8路继电器用D0字节表示;9-16路继电器用D1字节表示;17-24路继电器用D2字节表示;25-32路继电器用D3字节表示,每一个字节的含义和KC868-H8控制盒的表达方式一样,只是将32路划分成4个字节,多了几个参数。

智能家居二次开发

9.一次读取多个继电器当前开关状态:
发送:RELAY-STATE-x(1字节pack_num)
返回:
KC868-H32:RELAY-STATE-x(1字节pack_num),D0,OK/ERROR
KC868-H8:RELAY-STATE-x(1字节pack_num),D3,D2,D1,D0,OK/ERROR
 
  同样的情况,前面我们已经看了查询继电器状态的通信协议,那是按某一路进行查询的。我们也可以进行一次读取多个继电器状态的方式来进行查询。比如:发送“RELAY-STATE-1”,那么根据控制盒不同型号的情况,会有两种返回状态的字符串,如果控制盒是KC868-H8的型号,那会返回“RELAY-STATE-1,255,OK”,“255”则表示控制盒8路继电器的当前状态,将十进制数“255”转成二进制数为“11111111”,“1”表示“打开”状态,前面我们已经提到过,所以,这8路继电器的当前状态均为“打开”。同样,如果得到的数转成二进制后,某一位是数字“0”的话,那么代表该路的继电器当关的状态为“关闭”状态。

读继电器状态

  到止,我们已经全面学习并掌握了智能控制盒的输出和输入资源的控制与状态获取,是不是感觉一下子有很多资源可以来使用了,不仅可以控制继电器开关,也可以进行一些传感器状态的获取,这样就可以发挥自己的创意来实现一些定时、自动或具有AI人工智能方面的应用了。具体的功能是什么,如何去实现,可以解决哪些生活及工具应用场景的痛点问题,就看你的程序代码来怎么写了。我们对通信协议的本地化调用,已经给大家做了全面的介绍,在今后的连载教程中,我们还会为大家介绍到如何突破本地局域网内控制的地理范围限制,真正实现Internet级的无距离限制的远程控制方法,相信会激起大家足够强烈的兴趣感。