房永兴
摘 要:通过在云主机上开发微信公众号,搭建UDP服务器,在车库使用树莓派接收并处理请求,利用GPIO接口通过继电器控制车库电机,实现了车库门的遥控及状态监控功能。为自己搭建简易家庭物联网提供了思路。
关键词:公众号;树莓派;遥控;车库
中图分类号:TP872 文献标志码:A 文章编号:2095-2945(2019)26-0086-02
Abstract: Controlling a garage door remotely and monitoring its condition can become reality by developing a WeChat public platform on cloud hosting, setting up a UDP server, installing a Raspberry Pi which is used to receive and process requests, and controlling the garage motor by GPIO interface. All the work provides ideas for constructing a simple IOT for families.
Keywords: WeChat Official Accounts; Raspberry Pi; remote control; garage
1 概述
随着电子与网络技术的发展,越来越多的设备都有了接入网络的能力。还有一些简单易用的开发板,不但具有网络功能,还会提供一些接口用于扩展和开发。利用这一点,我们可以实现在任何时间任何地点对远程设备进行监测和控制,搭建成一个简易的家庭物联网。本文将使用一些简单的设备,开发少量代码,使用微信公众号完成车库门的远程遥控、监测功能。
2 功能设计
微信是这些年最流行的网络通信工具之一,随着公众号功能的推出,企业和个人开发者都可以针对公众号接口来开发网络应用。该实验主要实现的两个功能,都是通过与微信公众号进行交互来实现:(1)车库门的打开和关闭;(2)车库门开关状态监测。
2.1 设计思路
在微信公众号上输入文本消息,服务器根据消息内容,更改服务器上的数据库中数据表的字段记录,车库里的设备远程连接到服务器,获取消息指令:如果是开关指令,就通过继电器操作车库电机,实现车库门的开关;如果是查询指令,就获取车库里的门磁传感器状态,并返回结果,把车库门状态写入数据库中。
具体的消息流程是:微信公众号上发送指令→服务器接收并转发指令→车库里的设备响应指令→操作继电器或查询传感器状态→向服务器返回操作或查询的结果。
因此该实验需要做好如下准备:申请一个微信公众号、有一台公网IP的主机、带有无线网络功能的树莓派(或类似設备)、小型继电器、4G无线WIFI、门磁传感器。
2.1.1 微信公众号
微信公众号主要用于打开和关闭车库门的指令发送和车库门状态消息的接收。微信公众号分为个人和企业号,企业号支持更多的开发功能,拥有更多的权限,但是个人申请比较麻烦。不过本实验只是利用微信公众号的消息收发功能,只需要申请个人公众号即可。
2.1.2 公网IP服务器
做微信公众号接口的开发,需要使用一个公网IP的80或443端口,所以这里使用了一个阿里云的ECS服务器,当然也可以使用其它具有公网IP的主机来代替,该服务器的主要作用是接收和转发指令消息,并对消息来源进行安全验证。该实验使用的是阿里云的云主机。
2.1.3 树莓派和继电器
树莓派和继电器的作用是接收主机发来的指令消息,并根据消息内容来操控车库电机或是获取车库门的开关状态。
树莓派是一款基于ARM的微型电脑主板,具备所有PC的基本功能,它可以安装多种Linux系统,带有网络和USB接口,另外还有可控制的GPIO接口。本实验使用python编程语言在树莓派上开发SOCKET程序,接收并转发本地及远程的消息指令,利用GPIO模块对GPIO接口进行高低电平的控制与状态读取,进而实现车库门电机的开关及传感器模块状态的读取。
继电器是一种电控制器件,分被控端和控制端,是一种用小电流去控制大电流动作的自动开关。被控端与车库电机相连,控制端与树莓派的GPIO接口连接。
2.1.4 4G无线路由器
另外车库里一般没有有线网络,家用无线路由器的无线信号可能也覆盖不到,所以这里使用了4G无线WIFI来实现网络的接入,使树莓派联网接收服务器下发的指令。选用了带无线网络功能的树莓派,可以避免布线的麻烦,否则还要加一个无线网络接收设备把无线信号转为有线信号。树莓派的1、2代产品没有无线网络功能,也可以加一个USB无线网卡来实现无线接入。
2.1.5 门磁传感器
要想监控车库门的开关状态,还需要一个门磁传感器,这是一个很简单的开关量传感模块,模块内部有两个离得很近的金属弹片,在靠近磁铁的地方,两个弹片合并,线路连通,远离磁铁时线路断开。
2.2 网络拓扑图
根据设计思路,整个实验的网络拓扑图如图1。
3 功能实现
3.1 微信公众号的设置
首先在微信公众平台的官方网站申请一个微信公众号,申请成功以后,可以参考开发者文档,按照接入指南的说明,依次添入URL、Token和EncodingAESKey,然后选择消息加密方式。这里需要注意的是,URL填入的是自己的公网IP服务器的IP地址,必需以HTTP或HTTPS开头,该服务器需要开启80或443端口。
3.2 验证微信服务器的GET请求
由于所有网络用户都可以通过WEB方式来访问这个服务器,所以需要确保WEB服务器能够分辨并处理微信服务器发来的消息,这一步就需要在公网IP服务器上面编写代码,根据官方文档的要求,处理微信服务器发送的GET请求,验证请求中带的随机数、字符串和时间戳等参数。
3.3 处理并响应微信公众号发送的消息
接下来,需要在公网IP服务器上开发代码,处理公众号上发送过来的文本消息,通过消息内容向车库里的树莓派发送操作指令。
这里还需要考虑三个问题:(1)由于车库里的树莓派是通过4G联网的,没有公网IP,所以服务器无法直接向树莓派发送指令,必须由树莓派不断的访问服务器,获取消息指令,如果没有指令,就不做操作。因此服务器上可以安装一个数据库,里面存储最新的操作指令。(2)树莓派采用4G联网的方式,虽然能联网,但是流量是有限的,在与服务器交互时,要尽量减少流量消耗,所以应该采用SOCKET方式UDP协议来通信,并在程序中设定好循环访问的间隔时间,本实验的时间周期为3秒。(3)公网IP服务器开启UDP服务,接收树莓派发来的SOCKET请求,查询数据库里的最新指令,并返回消息给树莓派。(4)为了避免公网IP服务器开放的UDP端口被网络上的无关信息干扰,还可以在SOCKET通信的两端加上随机数验证。
3.4 树莓派联网
设置好4G无线路由器,然后在树莓派上设置网络连接,使它连接到4G无线路由器上,用ping命令来测试是否可以访问服务器的IP。
3.5 树莓派处理指令消息
在树莓派上需要编写代码运行UDP客户端程序,周期性访问服务器,以获取操作指令。另外,要在树莓派上安装GPIO模块,用于操作继电器和获取门磁传感器的开关状态。编写相关代码,对GPIO接口进行状态读取和电平控制。
3.6 安装门磁传感器
门磁传感器分为两部分,有线的一端安装在固定处,也就是门框上,把无线的一端(磁铁)安装在门上。在车库门闭合时,两个模块的距离要足够近,这样才能保证线路的连通。然后按照树莓派的GPIO接口文档,用跳线把树莓派的GPIO接口和门磁传感器有线的一端连接起来。
3.7 继电器的连接
不同的品牌或型號的车库电机有着不同的接口,本实验使用的型号是SuperMaster GDM600N。该型号电机的接线端子有11个接口,经测度,如果把最后的两个接口短接一下,就会使电机运行,拉起或放下车库门。利用信号线把继电器的被控端与电机的最后两个接口连接,继电器的控制端与树莓派的GPIO接口连接。
4 实验结果
通过微信公众号发送特定的文本指令,车库门的开关和状态查询成功。
由于程序中设计的消息传递周期为3秒,所以操作指令发过去以后,一般会有0~3秒的延迟,但是不影响使用。
通过一段时间的观察,流量的消耗也很少,平均每分钟只需要1K的流量,一年也只需要500多M流量。
其实开发SOCKET代码时,也可以使用TCP长连接方式,由树莓派发起连接请求后,一直保持TCP连接,这样服务器就可以直接向树莓派发送指令消息了,而且数据流量也会大大降低。不过由于4G网络可能不是很稳定,TCP长连接很容易断开,当然也可以开发相关代码实现心跳监测机制,那就不是本文要讨论的内容了。
另外,微信公众号也可以接收语音消息,而且会自动把语音转换成文本,所以也可以在开发过程中,验证语音消息中包含的文字,实现语音遥控,使用起来更方便。
5 结束语
本实验使用微信公众号和树莓派等设备,实现了车库门远程遥控的功能,为自己搭建简易家庭物联网提供了一个基本的思路。实验中,由于微信公众号的开放性,所有人都可以通过此公众号发送操作指令来遥控车库门,这是非常不安全的,要避免这个问题,可以在程序中根据微信用户的OpenId进行验证,做成类似白名单的功能。
参考文献:
[1]郑世珏,徐虹.基于RaspberryPi的远程监测系统的设计与实现[J].微型机与应用,2014(19):105-107.
[2]李龙棋,方美发,唐晓腾.树莓派平台下的实时监控系统开发[J].闽江学院学报,2014(05):67-72.
[3]张永安.基于树莓派的智能家居系统[J].电子世界,2016(15):53.