通过阅读第一期和第二期的文章,我们已经学习了KC868-H8智能控制盒的通信协议,同时,也在局域网模式中,可以对控制盒进行了继电器的开、关操作。之前,我们也有提到过,一些关于远程控制时,所用到的指令参数区别,今天我们将为控制盒插上远程控制的翅膀,让你能够在任何有网络环境的情况下,可以灵活操控控制盒,实现继电器开关的控制,以及输入状态的读取。

  首先,我们来看一下通信原理,我们之前是在局域网内来控制控制盒,我们把控制盒的网络参数设置成“TCP服务器”模式,从字面理解,控制盒作为服务器使用,客户端通过点对点的方式来和控制盒建立连接,并进行数据交互的通信。但由于我们接入公网时的IP地址被ISP所分配到的都是动态的,所以,没办法长时间让通信双方可以建立长久的连接(除非你分配给控制盒的连接公网的IP地址是固定的),因此,我们通过云服务器的架设,让控制盒和客户端之间能够架起一道桥梁,进行远程的数据交互通信。客户端通过网络和云服务器相连;控制盒硬件设备也通过网络和云服务器相连,因此,控制盒和客户端彼此都可以通过云服务器实现相互之间的数据通信了。

  接下来,我们就来看一下,当控制盒处于远程控制模式时,它的一些网络参数以及通信协议指令,会有哪些区别。

  首先,我们将控制盒的网络参数中的“工作模式”进行修改,设置成“UDP模式”,同时,将“目的IP或域名”这栏设置成我们的云服务器地址“sdk.hificat.com”,“目的端口”为“5555”,控制盒的“IP模式”建议可以设置成“动态获取”,即由路由器DHCP动态分配IP地址,前提是路由器上要开启“DHCP动态分配IP”的服务,一般路由器默认都是开启的。
智能家居网络配置

  设置完成网络参数后,控制盒上电,就会自动连接到云服务器上,连接成功后,网口灯会变成“绿色”。

智能家居通信

  然后,我们就可以使用命令来进行相关的控制了。我们举个最简单的例子,我们通过网络浏览器发送http命令串来打开第一路继电器开关。首先,我们看一下通过远程方式发送http命令串的命令结构。.
 
  接口地址:http://sdk.hificat.com:8080/smarthome.IMCPlatform/device/v1.0/sendCommand.action
 
  接口参数:
deviceCode - KC868-H8/KC868-H32智能控制盒序列号
command - 要传送的通信协议命令
 
  示例:
  HTTP 请求:
  http://sdk.hificat.com:8080/smarthome.IMCPlatform/device/v1.0/sendCommand.action?deviceCode=56a890e6888793c97ed33f17&command=RELAY-SET-1,1,1
  云服务器返回:
  {
    "message":"Command: RELAY-SET-1,1,1 was sent to device:
    56a890e6888793c97ed33f17 successfully.",
    "result":"RELAY-SET-1,1,1,OK\u0000",
    "status":"0"
  }
 
deviceCode为智能控制盒的序列号,外壳上会有粘二维码和序列号,如果找不到序列号,也可以使用读取序列号的通信协议来获得。
Command 后面跟的协议命令就是我们之前所讲的控制盒通信协议,包括控制继电器开关,查询继电器状态以及读取输入端状态的协议内容。

  注意:当我们在进行http协议远程控制控制盒的时候,之前我们介绍的控制盒通信协议中,凡是有“包序号”的字节参数,在每次发命令是,参数进行自增赋值,范围为1--255。如第一条命令发送的参数为1,第二条为2,第三条为3,以此类推,刚参数为255时,下一个参数为1开始,继续进行自增。

  下面是我们在网络浏览器中输入命令串,执行后的实际效果,可以看到浏览器的有数据返回,同时,控制盒第1路所接的灯泡被点亮。

http协议

硬件控制电灯

  我们例举几条常用的通信协议命令,如:
 
1.单独控制某一路继电器的开与关:
发送: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
 
远程控制命令串为:
http://sdk.hificat.com:8080/smarthome.IMCPlatform/device/v1.0/sendCommand.action?deviceCode=56a890e6888793c97ed33f17&command=RELAY-SET-1,1,1  表示远程控制打开第1路继电器,注意:包序号为1
http://sdk.hificat.com:8080/smarthome.IMCPlatform/device/v1.0/sendCommand.action?deviceCode=56a890e6888793c97ed33f17&command=RELAY-SET-2,1,0  表示远程控制关闭第1路继电器,注意:包序号为2,进行了自增
 
2.单独查询某一路继电器当前开关状态:
发送:RELAY-READ-x(1字节pack_num),x(1字节继电器序号)
返回:RELAY-READ-x(1字节pack_num),x(1字节继电器序号),x(1字节状态0/1),OK/ERROR
 
远程控制命令串为:
http://sdk.hificat.com:8080/smarthome.IMCPlatform/device/v1.0/sendCommand.action?deviceCode=56a890e6888793c97ed33f17&command=RELAY-READ-3,1  表示远程查询第1路继电器状态,注意:包序号为3
 
3.查询触发输入端状态:
发送:RELAY-GET_INPUT-x(1字节pack_num)
返回:RELAY-GET_INPUT-x(1字节pack_num),x(1字节状态),OK/ERROR
 
远程控制命令串为:
http://sdk.hificat.com:8080/smarthome.IMCPlatform/device/v1.0/sendCommand.action?deviceCode=56a890e6888793c97ed33f17&command=RELAY-GET_INPUT-4  表示远程查询触发输入端状态,注意:包序号为4
 
4.一次控制多路继电器的开与关:
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
 
远程控制命令串为:
http://sdk.hificat.com:8080/smarthome.IMCPlatform/device/v1.0/sendCommand.action?deviceCode=56a890e6888793c97ed33f17&command=RELAY-SET_ALL-5,255  表示远程控制8路继电器全部为“打开”,注意:包序号为5
 
5.一次读取多个继电器当前开关状态:
发送: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
 
远程控制命令串为:
http://sdk.hificat.com:8080/smarthome.IMCPlatform/device/v1.0/sendCommand.action?deviceCode=56a890e6888793c97ed33f17&command=RELAY-STATE-5  表示远程查询8路继电器的当前状态,注意:包序号为5
 
前面我们已经看了查询继电器状态的通信协议,那是按某一路进行查询的。我们也可以进行一次读取多个继电器状态的方式来进行查询。比如:发送“RELAY-STATE-1”,那么根据控制盒不同型号的情况,会有两种返回状态的字符串,如果控制盒是KC868-H8的型号,那会返回“RELAY-STATE-1,255,OK”,“255”则表示控制盒8路继电器的当前状态,将十进制数“255”转成二进制数为“11111111”,“1”表示“打开”状态,前面我们已经提到过,所以,这8路继电器的当前状态均为“打开”。同样,如果得到的数转成二进制后,某一位是数字“0”的话,那么代表该路的继电器当关的状态为“关闭”状态。

到止,我们已经全面学习并掌握了智能控制盒的远程控制及查询状态的方法,通过写程序可以对异地的设备实现远程控制,在今后的连载教程中,我们会为大家介绍一下如果通过输入端获取状态从而实现智能化联动控制的实例,这也是智能家居目前比较常见的应用,也是人工智能的基础功能。