通过Internet控制旧式电子设备

2020-11-02 01:02:09

我对智能消费电子产品的想法很着迷。当谈到我在日常生活中使用的工具时,我有点像一个控制狂,喜欢在任何我能用到的地方尽可能多地使用它们。不幸的是,这些工具中有一些是传统的电子产品,比如我的空调,我根本不想花钱买一台新的智能空调,因为这一台工作得很好。因此,很长一段时间以来,我一直在想,是否有一种方法可以让我的空调变得更具成本效益。然后,上周我意识到,我有一辆树莓PI,还有一辆Adafruit的Circuit Playround Express,这是我在办公桌抽屉里作为会议礼品的一部分得到的。这些小野兽本质上是在乞求被利用来做一些好事,因为我没有和它们玩太多。

我注意到Circuit Playround Express有一个嵌入式红外收发器。虽然它没有自己的操作系统和互联网连接,但我想我可以在某种程度上用它来替代我的交流遥控器。很快,我也意识到互联网连接的空白可以由树莓PI来填补!接下来我所知道的就是,我仔细研究了这些电路板的规格,试图设计出一种将它们结合使用的方法,以使我的AC变得更聪明。在这个问题上花了几天时间(有些问题非常非常令人沮丧)之后,我终于能够实现我想要的了!

作为第一步,我做的第一件事就是建立了一种远程打开我的AC的方法-我说的远程是指从世界的任何地方!在本文中,我将演示如何使用少量开源工具和前述主板将Internet的力量带到我的传统空调上,它除了红外线之外没有其他I/O方式。

现在,如果您没有Circuit Playround Express(CPX),您可以将其替换为任何IR模块,如下所示。我用CPX是因为我已经有了。此外,我们要做的不是资源密集型的,所以任何有基本规格的云盒都可以工作,包括免费的第一层(事实上,我为此使用的是自由层的AWS EC2盒)。

在软件方面,我们将需要以下工具(我将在本文后面解释它们的用法):

IOS上的快捷键应用程序/Android上的IFTTT(我只描述了iOS上的步骤,但Android上的步骤几乎相同)。

为了让我们能够从CPx打开交流电源,我们首先需要看看遥控器是如何做到这一点的。当然,它会向交流电中的接收器发送红外信号,但我们需要知道这个信号是什么样子,这样我们才能在CPX上模仿它。

弄清楚这一点对我来说可能是最困难的部分,因为Adafruit官方教程和网上的许多其他教程都假设我们正在使用的设备遵循NEC红外协议。不幸的是,我的情况并非如此,在痛苦地挠了4个小时的头之后,我意识到了这一点。不同的公司使用不同的协议,富士通通用不使用NEC。然后,我试图直接从Arduino库的文档中获得我的AC型号的IR代码,但要破译它们就更难了。

很久以后,我想-如果我不试图从IR脉冲中获得解码序列,而是直接模拟脉冲会怎么样?为此,我试验了Pulseio CPX库(预装在电路板上),发现用这种方式模仿我的交流遥控器要容易得多-此外,这种方法还适用于所有红外协议,而不仅仅是NEC!

在通过USB将CPX连接到我的笔记本电脑之后,我首先导入了所需的库,并在Mu-Editor‘s REPL中设置了IR接收器。然后我把我的交流遥控器对准CPx板,按下了上面的电源按钮。CPx收到遥控器发送的IR脉冲,然后我将其打印在屏幕上:

我忽略了杂散值(通常长度较短),并复制了Remote将开机信号发送到CPx之后立即出现的大斑点。

我重复了这个过程,以检查值是否始终相同。请注意,每个传输的单个脉冲的数字略有不同,但正如我们稍后将看到的那样,只要它们在一起,它们就可以很好地工作。您在上面看到的唯一重要的脉冲阵列是当我不小心从遥控器发出断电信号而不是开机时。

然后,我复制了通电信号的脉冲阵列,并将其存储在单独的位置(笔记本电脑上的Notes应用程序)。

这一点要容易得多。在u编辑器REPL中,我将开机脉冲数组存储为变量(与我之前复制的脉冲数组相同)。然后对CPx板上的红外发射器进行初始化和配置。标准传输频率为38 kHz,信号占空比(“ON-Time”)为32768,或2?⁵。在发送脉冲之前,该库要求将其转换为半字,这可以通过预装的阵列库本身来完成。

对我来说,关键时刻是在Pulseout.send(Power_On_Sig)行之后终于按了Enter键。按Enter键后,我立即听到交流电源发出滴答声,它确实打开了!🥳。

一个不错的、巧妙的小把戏可以试一试,那就是看到CPX通过一个超慢镜头发送红外脉冲。由于红外脉冲发送速度极快,因此肉眼看不到,因此您可以用视频捕获它们,并以慢镜头播放以查看实际情况-请注意电路板中央闪烁的白点:

既然我的解决方案的核心功能已经弄清楚了,剩下的步骤就相对流畅了。接下来要了解如何向CPx自身发出信号,以向AC发射这些IR脉冲。有趣的是,为CPX通电的USB电缆也可以用作串行输入输出外围设备。因此,我决定通知CPx何时发送IR脉冲的一种简单方法是通过USB发送表示字符串的字节(";On";on";On";on";on)。CPx将在每次从其迷你USB端口接收到此字节序列时触发IR脉冲。我还决定在CPx上的LED上增加一个绿色的闪烁,作为确认接收到打开交流的命令的一种很酷的方式。这方面的总体代码相当简单:

这就是CPX处理串行输入和红外输出的方式。现在我需要一种通过互联网向CPX发送命令的方式,这样我就可以间接地远程控制我的交流。这就是树莓派的用武之地。我通过SSH连接到我的PI,通过Python的包管理器pip在上面安装了Flask,然后编写了一个简单的服务器,它通过USB发送表示命令的字节。我设想的是,每当我向该服务器发出GET/SWITCH/ON请求时,它应该通过USB将字节发送到CPX,CPX再将相应的IR信号发送到我的AC以打开它自己。以下是服务器的大部分不言自明的代码:

在通过USB将CPX连接到我的Raspberry PI之后,我通过python3命令_sender.py在PI上启动了这个服务器。接下来,我从我的笔记本电脑向我的PI(通过家庭LAN)发送了一个cURL GET请求,如下所示:

再一次,我一按回车键,我的AC就优雅地打开了!这是我的代码在第一次运行😄时能够正常工作的极少数情况之一。但是这种快乐并没有持续很长时间,因为我即将走进一条死胡同。

如果我不能通过互联网访问,我试图建立的系统就不会有太大的用处。它一直工作到现在,因为我在同一个家庭Wifi网络上向树莓Pi发送命令。

虽然使PI可以通过公共Internet访问的直接方法是在我的家庭路由器上启用端口转发,但我不想这样做,主要是因为两个原因:

我不想暴露我的家庭网络的公共IP(我不是安全专家,但我只是觉得这样做不安全)。

我的ISP可以在不通知我的情况下更改我家的公共IP地址,这可能会导致头痛和不必要的重新配置。

预见到这种方法的不可靠性,我决定寻找替代方法。我知道反向代理是解决这类问题的常用方法,因为它们不需要处理路由器配置,而且相对安全,因为连接总是从网络内部发起的。我熟悉的一个很酷的反向代理解决方案是ngrok,但ngrok的问题是免费版本只允许连接8小时。还有另一个专门为Raspberry Pi构建的解决方案是dataplicity,但是它的终端界面有一些错误,而且免费版本非常有限,就像ngrok一样。此外,我希望尽可能多地避免外部依赖。

“在计算机网络中,反向代理是代表客户端从一个或多个服务器检索资源的一种代理服务器。然后这些资源被返回给客户端,看起来好像它们来自服务器本身。“-维基百科。

在Web上搜索了一段时间后,我发现了一个称为FRP的免费开源工具,它是“快速反向代理”的缩写,可以设置为反向代理服务器,并且有大量可用的配置。我修修补补了一会儿,发现它非常适合我的需要。利用它的力量,我决定采用以下方法:

我会在AWS上设置一个面向公共互联网的盒子,作为反向代理服务器。这意味着我将把我的AC控制请求发送到这个盒子的IP,然后它会将该请求转发给我家里的PI。这比进行端口转发要好,因为每次ISP更改我家庭网络的公用IP时,我都不必弄乱我的路由器设置和更改配置。它也更安全,因为我可以微调对家庭网络中设备的访问,远远超出大多数家庭路由器提供的基本安全配置。在此堆栈溢出答案中可以找到使用反向代理的更多好处。

正如我前面所说的,我使用AWS来配置机箱,但是任何其他云提供商都会工作得一样好。配置后,我通过SSH连接到机箱并在其上下载了FRP。服务器端配置很简单,我只需向frps.ini文件添加几行:

FRP将使用此端口(7000)与客户端(本例中为PI)进行内部通信。

接下来,我安装了tmux,然后触发了tmux会话。然后我从里面启动了FRP服务器。在那之后,我与会话分离,以便反向代理会话即使在我与计算机断开连接后也能继续运行:

然后,我再次通过SSH连接到我的Raspberry PI,在上面下载了FRP,并按如下方式配置了frpc.ini文件:

[常用]我的AWS EC2实例的服务器地址=<;公网IP>;服务器端口=7000[web]type=TCP LOCAL_IP=127.0.0.1 LOCAL_PORT=5000 REMOTE_PORT=6000。

这里,server_port与我在server-7000上设置的bind_port相同。现在,REMOTE_PORT和LOCAL_PORT值意味着反向代理服务器将接受端口6000上的请求,并将它们转发到PI上的端口5000。我还修改了EC2实例安全组的入站设置,以便可以访问端口7000和8000。

接下来,我也在PI上安装了tmux,在打开tmux会话之后,我启动了命令发送器Flask服务器(请注意,我没有设置生产服务器,而是开发服务器,因为我仍在进行实验)以及FRP客户端,最后从该会话分离并断开与PI的连接:

我的大部分设置都是在这一点上完成的。我把我的笔记本电脑连接到我的移动数据上,然后打了以下卷发电话:

…。而空调又一次呼唤着生命,这一次是通过公共互联网发送的信号!

剩下的唯一一件事就是设置一种方法,方便地从我的手机调用这个API来打开AC-我不想记住我的EC2机器的IP地址,所以我最终决定把手机上的快捷方式应用程序投入一些用途,因为这是另一个我现在很少使用的东西,我真的很想尝试一下。

打开快捷方式APP&>创建快捷方式&>添加操作&>Web&>URL&>单击+添加我的API调用&>以添加另一个操作&>获取URL的内容(这将生成对上一操作中配置的URL的实际GET请求)。

当我还在使用我的移动数据时,我打开了手机上的快捷键应用程序,点击了我刚刚创建的快捷键。事情是这样发生的:

所以我就是这样让我的空调可以远程访问的。它现在只能通电,但现在可以很容易地添加其他功能,因为基本设备已经设置好了。我创建的AWS机器可以充当与传统电子产品之间的所有通信的单一集线器。我不仅可以向AC发送命令,还可以获取其状态并为智能温度系统创建受控反馈回路-可以实现很多事情!

FRP还提供了一个控制面板来监控流量,您可以通过将以下行添加到frps.ini文件来启用它:

不要忘记为此端口(本例中为9000)创建入站规则,以便可以访问仪表板。它看起来像这样:

我希望这篇文章能启发您使用Raspberry Pi、Circuit Playround Express和传统设备进行自己的DIY项目!请在评论中告诉我您的想法和反馈!