本文转自阿莫论坛,作者:jk36125.
原文链接:
https://www.amobbs.com/thread-5596868-1-1.html
前言
在很早之前,我就想过利用网络远程控制家里的空调。夏天,能够回到家里就一阵凉爽的赶脚是一个原因。另外一个更为重要的原因是,冬天的时候,开启了空调的暖气以后,需要二十分钟左右才能达到设定的温度。所以如果能够提前打开暖气,会是十分惬意的一件事。于是这篇文章记载了我想要在每天到家之前,就能把空调远程打开所做出的努力。包括对空调遥控器的红外解码,空调编码的发送和网页远程控制界面的设计等等。想想为了回家打开门那清爽的一瞬间,我也是蛮拼的,嘿嘿。
对于所有的红外解码过程,我尽量附上了采集到的原始数据,以方便其他人参考。
1 空调遥控器的红外解码
1.1 Arduino红外解码库
这就是我家的空调遥控器,型号是:三菱电机KP06AS:
想要远程控制空调,有几种方法:
雇一个菲佣在家里,然后打电话叫她开空调
设计一个可以远程控制的机器人,然后让它去按空调遥控器
设计一个可以远程控制的空调遥控器
相信正常人都会说:“去你妹的远程机器人和菲佣,当然是选3啊.”
要制作能够控制空调的红外遥控器,首先要了解空调的红外编码。例如在饭店里,如果想叫服务员点单,你就必须说出他能够听懂的命令,比如:“靓仔,再不过来点单我会削你哦”。同样,空调是通过红外线来遥控的,为了能让它听话,就要使用红外线发送它“听”的懂的语言。所以,我们就要对原配的空调遥控器进行分析,弄懂空调的红外“语言”。
比较麻烦的地方是,不同于电视或者机顶盒的遥控器。空调遥控器的编码常常又臭又长,并且是厂家自定义的独特规范,因此学习型的万能空调遥控器常常不能正常使用。只有在完全了解我的空调的红外编码的情况下,我才敢用自己自制的遥控器来操作空调。不然,现在的空调那么复杂,空调主机又不能显示绝大多数的运行状态。对遥控器来说,空调主机就是一个黑箱。万一弄错了哪个编码,把空调都搞坏,就得不偿失了。
要分析,找工具。有现成的分析工具总是最方便的。Arduino有一套红外接收程序库,能够将红外遥控器发送的数据解码以后,通过串口打印出来。使用的器件是一体化红外接收器,通过AVR的IO来进行解码。
参考这篇文章:《Arduino練習:紅外線傳送與接收》我使用了Arduino来尝试解码空调遥控数据。
愿望很美好,结局很悲惨。我拿着空调遥控器对着一体化接收器按了好几下,当然,只有按开机键,遥控器的其它状态,例如风速等等,完全没有变化。对于同一个空调按键,Arduino解码出来的数据每一次都不相同,软件也不能分析出红外编码的类型,简单来说,就是数据一塌糊涂完全不能看。
Figure 1-1. Arduino空调红外解码数据
这样乱七八糟的数据,根本无法放心的拿来分析。因为空调有许多不同的状态组合,所以相同的按键在不同的状态下,发送的红外编码可能都不一样。并且由于空调的一次按键中,需要包含较多的状态,因此数据量也比电视遥控器大的多。Arduino解码出的数据一团糟,说明空调遥控器发送的红外编码,已经超出了Arduino能够解码的范围,我只能使用其它的方式来解码空调遥控器的数据了。
1.2 红外接收二极管和示波器
其实,网络上是有卖现成的红外遥控分析器。但我只想分析下一个空调遥控器而已,能够正常开关机就够了。花几百块买一个红外分析器,只用一两次然后丢在那里吃灰,实在不是一件划算的事情。所以我自己设计了一个简单实用的红外接收设备,然后使用我手边有的逻辑分析仪来捕捉空调遥控器发送的红外数据:
Figure 1-2. 红外接收装置原理图
这个红外接收器构造很简单,只使用了一个红外接收二极管和一个100欧姆的电阻。这一个红外接收装置的原理是:
当红外接收二极管照射到红外线时,它的反向电阻急剧减小,接收装置输出高电平。
当红外接收二极管没有红外照射时,它反向截止,装置输出低电平。
刚开始的时候,我使用的是10K的电阻,但是由于电阻的阻值太大,因此对于红外信号常见的38K频率,没有办法快速的把电平信号拉低。因此我做了几次尝试,最后发现100欧姆的阻值,对于38K的红外频率有着较好的输出效果。红外二极管需要在反向电压的情况下来使用。因为没有任何放大电路,所以使用的时候,为了达到好的输出效果,需要将红外遥控器的发射端二极管,尽可能的和红外接收二极管接近并且对正。这和某些“学习型”的红外遥控器很相似。不管怎样,对于红外信号分析来说,能够获取红外线的信号才是关键,距离限制什么的倒是完全没有关系。
这个接收器虽然简单,但因为对原始的红外信号做出反应,可以同时还原红外信号的所有信息,包括载波频率,载波占空比等等。这是一体化红外接收头没有办法做到的。一体化红外接收器会过滤掉载波的部分信息,这对于读取红外数据来说或许方便,但对于红外数据分析不是一件好事了。
下面是使用示波器和上面制作的红外接收器,捕获空调遥控器的开机按键红外编码:
Figure 1-3. 使用示波器查看空调红外编码
通过示波器的波形可以看出,一次按键的数据分为独立的两个帧,每帧的长度大约为162毫秒,两帧间隔大约为15毫秒。从示波器上暂时还看不出来两帧数据之间的关系。这两帧数据有可能是为了效验而相互取反的,也有可能是完全相同的数值。只有通过进一步的数据分析才能得出结论。
到目前为止,可以确定的事情只有:
空调遥控一次按键操作会发出两帧红外码
两帧红外码加上间隔时间的总长度为339毫秒左右
1.3 逻辑分析仪捕获的数据
虽然使用示波器能够获取红外遥控的波形,但示波器一次能够记录的数据却很有限。如果将示波器的量程调节到可以看清载波频率,就没有办法看到完整的波形了。如果将量程调节到可以捕捉完整的波形,却又看不清波形的细节。
这个时候就要靠逻辑分析仪了,通过示波器的观察,自制接收器的输出电平已经达到了CMOS的标准,所以可以直接将接收器连接到逻辑分析仪上,而不用添加额外的放大电路。额外的电路,意味着可能添加额外的噪音。简单是最好了。下面是使用逻辑分析仪捕获的红外数据:
Figure 1-3. 逻辑分析仪捕获的数据
从逻辑分析仪软件上可以测量出,采集的数据总长度大约为320毫秒,可以清晰看到两个独立的帧数据。这和示波器上采集到的波形一样。和示波器不同的是,逻辑分析仪的数据包含遥控器一次发送的红外编码的所有信息,我可以通过逻辑分析仪软件,放大查看波形的每一个细节,也可以缩小查看整个完整的波形,完全可以随心所欲的处理数据。所以我觉得,逻辑分析仪是除了示波器和可调电源以外的必备调试工具。
1.4 红外数据的解码
1.4.1 常见的红外编码格式
到网上搜索了一番红外数据编码规范以后,我照着一番比较,发现所捕获的空调遥控红外编码和网上所列出的红外编码规则都不完全相同。但还是可以看出一些通用的编码规律。例如,每一帧的数据都有一个比其它结构都要长出很多的起始位:
Figure 1-4. 红外波形的起始位(StartBit)
数据由不断重复的两种波形结构组成:
Figure 1-5. 红外波形种的两种基本结构
这两种波形结构在其它红外编码规范中经常出现,因此可以合理的类比假设,“结构1”代表逻辑“0”,“结构2”代表逻辑“1”。
每一帧的结尾有一个结束位:
Figure 1-6. 红外波形的结束位(StopBit)
知道了数据的比特位信息,我感觉解码红外数据胜利就在前方,于是兴冲冲的开始人肉解码的工作:数一数逻辑分析仪软件上的波形数据,然后在纸上写下解码的逻辑位。
Figure 1-7. 人肉数据解码
我写出了两组数据以后,发现这样行不通,因为我还不知道红外数据的编码方式是LSB(Least Significant Bit-低位在前格式)还是MSB(Most Significant Bit-高位在前格式)。这样算下来,能够产生的组合数据量太大了,没一会我就数的头昏眼花了。并且我发现,空调遥控器的同一个按键发送的红外数据,一直在随时间不断的变化!
1.4.2 让计算机来数数
计数的工作,作为普通人类的我,当然是没有计算机效率高。所以我用VC编写了一个软件来代替我分析取逻辑分析仪保存下来的数据。根据上面对起始位,逻辑“0”,逻辑“1”,结束位的波形假设,对数据进行分析,列出载波的频率,原始的比特值,并且按照LSB和MSB两种方式解码数据等。
Figure 1-7. 对逻辑分析仪数据的自动解码输出
有了这个工具,我就不用对着逻辑分析的软件一个一个数比特位了。这样一来工作效率提高了不少呢。
1.4.3 对效验值的猜测
有了自动解码工具以后,我抓取了两组数据来进行观察按键的编码规律:
Figure 1-8. PowerOn, 13:26, Cold, 26Degree 红外数据
Figure 1-9. PowerOn, 14:00, Cold, 26Degree 红外数据
对比两次采集的数据,可以发现大部分的数据都相同,只有两个字节的数据不一样。实际上,通过进一步比较不同编码值可以发现,只要编码的数据有变化,不管有多少个数据是相同的,最后一个字节的数据必定也跟着变化,因此合理的猜测是,这个值是某种算法产生的效验值。数据末尾加一个效验值也是常用的编码方法。但我并不知道具体的效验算法,也不知道数据是LSB还是MSB编码的。所以我在红外解码程序中同时尝试了3种常见的效验方式:累加和,异或,以及CRC7。加上LSB和MSB两种编码方式,因此总共可以得到6个计算结果。
Figure 1-10. 效验值的三种尝试
结果是,最简单的累加和效验命中!同时我们也知道,数据的编码格式为LSB(低位在前,高位在后)。
另外一个方面,空调遥控器一次按键操作,发送的前后两帧数据,经过解码以后发现是完全相同的,并不像我原先预计的那样,是某种取反之后的比较值。
1.4.4 不断改变的红外数据
知道了红外数据的编码和效验,下一步就要分析红外编码随时间变化的原因。因为红外遥控器的同一个按钮,发送的红外数据一直在变化。这一款空调遥控器的控制面板上,又有时间的显示和设定。所以可以假设,在红外数据中有一个或者几个字节是和时间有关的变量。
为了证明这个假设,在不改变遥控器任何设置的情况下,我每隔几分钟就抓取一次遥控器开机的红外数据,并且用上面写的软件分析出编码数值。这个时候因为可以计算数据的效验码,所以我对数据的正确性有相当的信心。
Table 1-1. 随时间变化的红外数据
23,cb,26,01,00,20,58,0a,06,50,40,00,00,80,10,00,00,bd // 10:40
23,cb,26,01,00,20,58,0a,06,50,40,00,00,80,10,00,00,bd // 10:41
23,cb,26,01,00,20,58,0a,06,50,40,00,00,80,10,00,00,bd // 10:42
23,cb,26,01,00,20,58,0a,06,50,40,00,00,80,10,00,00,bd // 10:45
23,cb,26,01,00,20,58,0a,06,50,41,00,00,80,10,00,00,be // 10:52
23,cb,26,01,00,20,58,0a,06,50,41,00,00,80,10,00,00,be // 10:54
23,cb,26,01,00,20,58,0a,06,50,41,00,00,80,10,00,00,be // 10:55
23,cb,26,01,00,20,58,0a,06,50,42,00,00,80,10,00,00,bf // 11:01
23,cb,26,01,00,20,58,0a,06,50,42,00,00,80,10,00,00,bf // 11:09
23,cb,26,01,00,20,58,0a,06,50,43,00,00,80,10,00,00,c0 // 11:10
23,cb,26,01,00,20,58,0a,06,50,4e,00,00,80,10,00,00,cb // 13:00
对比表格中的数据,可以看到:
前三次的数据是相同的。
到了10:52分的时候,数据中的第11个字节增加了1。
10:52到10:55之间的三次数据完全相同。
到11:00时,数据的第11个字节再次增加了1。
所以规律就十分的明显了:每隔10分钟,红外数据当中的第11字节就会增加1。这样,假设第11个字节的数据是表示当前的时间,以10分钟为计数单位,从每天的零点开始算起。以24小时制来说的话:
第11个字节数据 = (取整数部分)[小时数H / 6 + 分钟数M / 10]
以上是我假设得到的数据,要证明我的假设是正确的,就必须能够根据这个公式,计算出其它时间点上,红外编码中第11个字节数据的值。
根据公式,在18:25时,第11个字节应该是:
18 * 6 + 25 / 10 = 110.5 取整数为110 = 0x6e
在23:55分的数据中,第11个字节应该是:
23 * 6 + 55 / 10 = 143.5 取整数为143 = 0x8f
为了验证结果的对错,我把空调遥控器上的时间调整成了18:25和23:55,然后分别截取了两次开机按钮的红外数据。
Figure 1-11. 18:25 空调开机红外数据
Figure 1-12. 23:55 空调开机红外数据
注意上图中软件输出的解码值中红圈的部分,就是第11个字节的数据,和推算的数值完全相同!
1.4.5 温度,制冷,制热和开关机
已经确定了红外编码中的两个变量:时间和效验值。因此,可以很方便的分析出其它的变化量。窍门是,每次只改变一个遥控器的状态,而保持其它的状态不变,就能很容易的看出编码的变化规律。简单说来,我找出了下面四个我感兴趣的变化规律:
对于温度数据:
第8个字节 = 设定温度 - 16
对于制冷模式:
第7个字节 = 0x58
对于制热模式:
第7个字节 = 0x48
对于开关机
第6个字节 = 0x20(开机),0x00(关机)
到这里为止,所有我感兴趣的红外遥控键值都已经解码出来了。对于空调的风向控制,体感测温方向等等,我不打算在远程遥控当中实现。我都已经不在家里了,难道还在乎空调风往哪里吹么?对于远程开关空调来说,只要能够开启制冷26度和制热22度两种模式,并且可以正常开关机。我认为就已经足够实用了。
2 用ARDUINO进行测试
2.5 发射电路
既然已经完全了解了空调的红外遥控编码,下一步就是试着用分析出的编码来发射红外线信号咯。
实现这个目的有很多种方法,不过我只是为了验证一下我分析出的遥控编码是不是正确的。最快的方法就是实用Arduino了发射红外线啦。
当然,我也没有直接将做好的设备拿去对着空调一通乱按。我先使用了上面自制的红外接收器和分析软件,看看自制的红外遥控器发出的编码,经过我自己的解码器以后,是不是和原装的遥控器发送的编码完全相同。算是一种交叉检验吧。(不,我不是处女座,只是有一点完美癖好)。
Figure 2-1. Arduino红外发射测试:
硬件的连接方式相当的简单:
红外LED正极 -> 5V
红外LED负极 -> 引脚2
2.6 Arduino源代码
操作的方式是,使用Arduino的串口工具,发送字符“s”,就发送制冷26度的空调红外开机命令。发送其它任意字符,就发送停机的红外命令
原配的遥控器编码中具有时间变量。Arduino无法获得当前的时间参数,所以遥控的时间参数被硬编码为18:25。当时的时间是18:21,几分钟之后,我使用Arduino发送了自己编制的红外代码(制冷26度开机):
0x23,0xcb,0x26,0x01,0x00,0x20,0x58,0x0a,0x06,0x50,0x54,0x00,0x00,0x80,0x10,0x00,0x00,0xd1
当听到空调主机发出一声”滴“的响声,表示成功接收了红外遥控信息的时候,真是十分的开心啊。
使用Arduino测试的结果:
自制的红外编码可以对空调正常操作
编码中的时间参数随意设定的话,也可以正常开关机,但我还是决定要加入真实的时间信息,完全保持和原装空调一模一样的编码来发送(不,我不是处女座,已经说过一次了)
3 制作USB红外发射器
3.1 发射电路
我不想把Arduino长时间的用来控制空调,所以需要重新制作一个新的硬件。设计一个新的硬件还是一件相对简单的事情。但是我实在是很讨厌画PCB啊。而且作电路板比较花时间,所以我直接用了上一次自己制作的USBWireless(USB to 2.4G控制器)的硬件,手动增加一个红外发送的接口,做成了一个USB to IR的设备。简单来说,就是可以通过USB接口,发送红外控制信号的东西。节省下来的时间,当然是拿来泡茶吃差点了哈哈。
3.2 可变更的红外参数
考虑到将来或许有更换空调的可能,但我不想那时候再重新把固件的代码重新拿出来编译烧写一次。所以我将USB红外发射器做成了参数可配置的。
通过变更不同的参数,就可以发射出不同格式红外编码。这样,兼容新的遥控编码就不用重新编译USB红外发射器的固件,直接编写新的shell脚本设置参数就OK啦。
更好玩的是,通过逻辑分析检测其它电器的遥控器,获取它们的编码规律以后。只要增加几个shell脚本,这个USB红外设备就可以控制电视或者机顶盒啦!
可变更的参数使用结构体的方式来表示:
typedef struct {
uint16_t forestClocks;
uint16_t flatTime;
} bit_time_t;
typedef struct {
uint16_t carrierClockHighDelayUs;
uint16_t carrierClockLowDelayUs;
uint16_t isLSB;
uint16_t sendStartBit;
uint16_t sendStopBit;
bit_time_t startBit;
bit_time_t stopBit;
bit_time_t logicalBit1;
bit_time_t logicalBit0;
} ir_code_t;
3.3 红外数据输入格式
一个完整的红外控制信号通常包括几个帧。像上面的空调遥控器,就包含完全相同的两个帧数据。而有些电视遥控器,却具有取反效验的两个或者三个不同帧。因为很难计算一个红外数据帧发送完成的时间,所以在shell脚本里面来做红外数据中帧和帧之间的延时会不准确。
解决的方法是,将所有要发送的数据,包括数据的比特数,发送完成以后的延时等信息全部发送到USB红外发送器来进行处理
红外数据在USB设备中的处理:
bits = usbDataBuffer[index]; // 第一个字节为数据总比特数
delayMs = usbDataBuffer[index + 1]; // 第二个字节为数据发送完成以后的延时(毫秒)
IRWrite(&usbDataBuffer[index + 2], bits); // IR数据从第三个字节开始
delay_ms(delayMs); // 一帧数据以后的延时
index += (2 + bits / 8 + ((bits % 8) ? 1 : 0)); // 转跳到下一帧数据
4 RASPBERRYPI服务器
将USB红外发送器插在Linux主机上,我们就可以通过Linux来发送红外控制信号了。这个Linux主机就是RaspberryPi啦。
因为我的这个主机有做其它的用途,比如设置为我的在线鱼缸视频服务器,以及我的个人网站等等。所以已经配置了好apache和php,以及mjpeg-streamer等等。也安装了ddns的软件来维持外部网络的访问。
所以,只要在网络服务器上增加远程控制USB红外发送器的接口,我们就能够通过网络,远程的操控空调啦!
5 LINUX下的软件和脚本
5.1 u2w软件
Linux上的控制软件,使用前作(USB to 2.4G控制器)的软件来进行改装,相比较重新写一个,这样省事多了。增加了"-ac"选项来控制空调器的运作。软件的源代码可在文章最后下载。下面列出几个通过命令行发送空调红外编码的范例:
设定空调开机的范例1:
sudo ./u2w -ac -on -cold -t 26
设定空调开机的范例2:
sudo ./u2w -ac -on -hot -t 22
设定空调关机的范例:
sudo ./u2w -ac -off -cold -t 26
5.2 shell脚本的使用
使用命令行还不够灵活,需要编写控制空调的shell脚本,这样,即使以后命令行的参数有变化,也只需要改动shell脚本就可以,而且能够少打很多自负啊:
#!/bin/bash
if sudo /home/pi/usb2wireless/u2w -ac -$1 -$2 -t $3 | grep -q "[ok]" ; then
exit 0
else
exit 1
fi
调用的方式:
./ac.sh on cold 26
./ac.sh off hot 22
这里碰到一个问题,在windows下编辑过shell脚本以后,可能会出现错误:
/bin/bash^M: bad interpreter: No such file or directory
解决的方法是使用dos2unix进行结束符号的转换:
dos2unix open.sh
6 再见命令行-使用网页远程控制
6.1 界面设计
使用命令行来发送红外控制信号真是向前进了一步,但如果自己出门在外,拿出手机调用命令行实在是不方便。所以必须增加一个GUI的控制接口。
我选择使用网页的形式来进行远程控制,由于我的Linux主机已经运行了我的个人网站,所以增加一个页面来远程控制空调很方便。
使用网页来控制,也不要手机或者电脑安装额外的软件。也不需要关心是安卓手机还是苹果手机,总之,是各种方便就对了。
因为觉得用html的button控件看上去很丑啊,所以我使用iDraw来设计了一个简单的在线空调遥控器控制界面:
6.2 给图片添加按钮功能
接下来就是需要让图片上画出来的按钮变成能够点击的,真正的按钮。可以使用html的area标签,对遥控器控制图片添加HOT模式,COLD模式,以及电源按键三个按钮(因为显示问题,下面的area标签删除了标签符号‘<>’):
area
shape="rect"
coords="80,40,120,90" // 图像左上角为坐标原点
href="javascript:void(0)"
onclick="ACCommand(1)"
alt="coldMode"
area
shape="rect"
coords="160,40,200,90"
href="javascript:void(0)"
onclick="ACCommand(3)"
alt="hotMode"
area
shape="rect"
coords="50,280,390,380"
href="javascript:void(0)"
onclick="ACCommand(1)"
alt="powerOnOff"
6.3 javascript
到了这一步,按钮已经可以点击了。我们需要在点击按钮执行的函数中,使用javascript发送按键值给mjpeg-streamer服务器,来发送“快开启空调吧”这样的讯息。毕竟,是mjpeg-streamer在一直侦听和处理发往服务器的命令:
function ACCommand(value) {
var cmd_line;
var msg;
cmd_line='./echo.php?cmd=ac_ctrl&value=' + value;
if( (value == 0) || (value == 2) ) {
msg = "确认要关闭空调吗?";
} else if (value == 1) {
msg = "确认要开启制冷模式吗?";
} else if (value == 3) {
msg = "确认要开启制热模式吗?";
} else {
msg = false;
}
if(msg != false) {
if(confirm(msg)) { //点击确定按钮返回true
AJAX_get(cmd_line); // 发送给mjpeg-streamer
}
} else {
document.write("page error");
}
}
function AJAX_response(text) { // 返回值通过echo.php重新输出
location.reload(true); // 从服务器重载页面
alert("操作完成"); // 确认对话框
}
6.4 保存上次的状态
保存空调遥控器上一次的运行状态是很有必要的,不然,有可能需要不必要的多次操作空调,带来额外的损耗。所以,需要在服务器上保存空调上一次的操作状态。
在页面载入的时候读取服务器上的上一次运行状态的php代码,使用文件简单的保存数据:
if (file_exists('acstatus.php') == false) {
$fh = fopen('acstatus.php', "w");
fprintf($fh, "%s %s", "off", "cold");
fclose($fh);
}
// status = image file name
$fh = fopen('acstatus.php', "r");
fscanf($fh, "%s %s", $statusOnOff, $statusColdHot);
fclose($fh);
在服务器接收mjpeg-streamer的返回值的php代码中,保存上一次操作的状态:
if ($cmd == 'ac_ctrl') {
$fh = fopen('acstatus.php', "w");
switch($value) {
case 0:
fprintf($fh, "%s %s", "off", "cold");
break;
case 1:
fprintf($fh, "%s %s", "on", "cold");
break;
case 2:
fprintf($fh, "%s %s", "off", "hot");
break;
case 3:
fprintf($fh, "%s %s", "on", "hot");
break;
default:
fprintf($fh, "%s %s", "off", "cold");
}
fclose($fh);
}
6.5 mjpeg-streamer的修改
因为实际对USB红外设备进行操作的是mjpg-stramer。当然,为了能够增加新的功能,就必须对它的源代码进行一定的扩展和修改。以下是具体的修改步骤。
在plugins/input.h中,修改枚举_in_cmd_t,增加新的命令类型:IN_CMD_AC_CTRL
在plugins/output_http/httpd.h中,修改in_cmd_mapping结构体数组,将新增加的IN_CMD_AC_CTRL映射到http字符串命令“ac_ctrl"上
在plugins/input_uvc/input_uvc.c中,修改int input_cmd(in_cmd_type, int)函数,增加处理IN_CMD_AC_CTRL命令的代码
在处理IN_CMD_AC_CTRL的代码中,使用system()函数调用shell脚本来完成空调控制
7 完成!
经过一些细微的调整以后,这就是最后的结果了!
Figure 7-1. 最后的成品:
虽然界面简单,但因为是自己设计的,还是各种看的顺眼。
在iPhone上添加了这个网页的快捷方式,只要按下一个按钮,不管身在何处,都可以开启家里的空调啦。当然这个页面只有具有密码的管理员才能看到。我可不想任何人都能控制我家的空调。
8 工程文档和源代码
所有工程以及源代码下载,公众号后台回复关键词:014,或者远程空调,即可获得下载链接。