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

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

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

kc868-h8
KC868-H8 外形图片

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

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

1.单独控制某一路继电器的开与关:
发送:RELAY-SET-255,x(1字节继电器序号),x(1字节动作0/1)
返回:RELAY-SET-255,x(1字节继电器序号),x(1字节动作0/1),OK/ERROR

  这条命令是我们在第一期文章中所介绍到的核心指令,也是最让人兴奋的一条硬件版的Hello World指令,它可以控制某一路继电器的打开或关闭,指令非常简单,通俗易懂。协议中的第1个字节永远固定成数字"255";协议中的第3个字节参数——“动作0/1”的意义在于,“0”表示“关闭”;“1”表示“打开”。我们举个例子来看一下,比如:我们要打开第1路继电器,我们可以发送命令“RELAY-SET-255,1,1”,第1个参数“255”固定;第2个参数的“1”表示第1路继电器,第三个参数“1”表示“打开”。如果我们要关闭第1路继电器,我们可以发送命令“RELAY-SET-255,1,0”,第1个参数“255”固定;第2个参数的“1”表示第1路继电器,第三个参数“0”表示“关闭”。如果我们要打开第2路继电器,我们可以发送命令“RELAY-SET-255,2,1”,第1个参数“255”固定;第2个参数的“2”表示第2路继电器,第三个参数“1”表示“打开”。看到这里,你应该感觉控制继电器原来是那么容易吧。略有点小成就感吧:)

硬件控制电灯

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

3.查询触发输入端状态:
发送:RELAY-GET_INPUT-255
返回:RELAY-GET_INPUT-255,x(1字节状态),OK/ERROR
 
注:当控制盒触发输入端被触发时,会主动上报一条命令,格式为:RELAY-ALARM-X,X代表被触发的路数。
 
  触发输入端是控制盒用来接开关量传感器的输入端子,如图中控制盒的一侧,由高位和低位组合成一组开关量输入端,他有多元化的实际应用方式,比如:你可以接手动开关,软件中可以定义好,当手动按下开关后,输出端的继电器会执行哪些动作;当有线开关量的传感器信号接入时,软件中可以定义好,当传感器被触发时,输出端的继电器会执行哪些动作,这就是我们通常说的智能联动,也是智能家居中最广泛的应用方法之一。联动的自动化控制过程中,第一步就需要我们去获得触发事件的状态,即什么时候被触发,哪路传感器被触发。此时,我们可以使用触发输入端的查询命令发给控制合,如:“RELAY-GET_INPUT-255”,查询成功后,控制盒会返回:“RELAY-GET_INPUT-255,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-255,254,OK”,我们将数字十进制数“254”转换为二进制数为“11111110”,所以可以得知第1路输入端被触发。

智能家居调试

十进制数

二进制数

4.一次控制多路继电器的开与关:
 
KC868-H2/4/8:
发送:RELAY-SET_ALL-255,D0
返回:RELAY-SET_ALL-255,D0,OK/ERROR
 
KC868-H16:
发送:RELAY-SET_ALL-255,D1,D0
返回:RELAY-SET_ALL-255,D1,D0,OK/ERROR

KC868-H32:
发送:RELAY-SET_ALL-255,D3,D2,D1,D0
返回:RELAY-SET_ALL-255,D3,D2,D1,D0,OK/ERROR
 
  之前所介绍的通信协议中,我们已经可以分别对每一个继电器进行“打开”和“关闭”的操作了,这里,我们再介绍一条多路继电器同时进行控制的指令,他们是区别在哪里呢?前面我们所讲的控制继电器都是针对某一个的,如果要控制多个继电器开关,就是需要发送多条控制命令,需要若干时间去执行。这里,我们介绍的指令,可以实现一次性控制多路继电器开关,如“全开”、“全关”,或者某几路“打开”,某几路“关闭”的操作,只需要一条指令,多路控制速度非常快。我们可以看到命令中,除了“包序号”参数之外,只有一个字节的参数了,这一个字节就代表了8路继电器想进行控制的状态设置,用“1”表示“打开”,用“0”表示“关闭”,同样,也是用8位二进制来表示各路继电器的状态,再转成十进制数。如:我们要将8路继电器全部打开,则可以发送命令“RELAY-SET_ALL-255,255”,我们要将8路继电器全部关闭,则可以发送命令“RELAY-SET_ALL-255,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个字节,多了几个参数。

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


6.一次性打开所有的继电器
发送:RELAY-AON-255,1,1
返回:RELAY-AON-255,1,1,OK
所有参数全部固定不变即可.该指令适用于各型号的控制器.
 

7.一次性关闭所有的继电器
发送:RELAY-AOF-255,1,1
返回:RELAY-AOF-255,1,1,OK
所有参数全部固定不变即可.该指令适用于各型号的控制器.
 

8.将某一路继电器状态进行翻转操作
发送:RELAY-KEY-255,x,1 (x is the channel of Relay)
返回:RELAY-KEY-255,x,1,OK (x is the channel of Relay)
对某一路继电器执行状态翻转的控制输出操作.如:当前状态是"开"的,发命令过去,继电器会变成"关";当前状态是"关"的,发命令过去,继电器会变成"开"

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