标签:
射频开关是通过射频信号控制电源开关的一种东东,433MHz的开关有效遥控距离约为30米,假设一个场景,一间别墅,楼下的电风扇正插着射频插座在工作,楼上的老王想关掉楼下的电风扇,可是他又不想跑下楼,如果射频遥控器在他旁边,他就可以通过射频遥控器关掉射频开关的电源,从而关掉电风扇。
通常来说,一个433MHz的射频接收模块可以接收所有433MHz射频发射器发出来的信号,也就是说,如果你家在用射频开关,那么我如果知道你遥控器发出来的编码后,我可以用发射模块发射出一串同样的编码去控制你家的电源。是不是有种防火防盗防邻居的感觉。
我手里头进手了一套射频开关,一个遥控器和4个射频插座。我的目标就是在Raspberry Pi里编写一段程序,然后通过控制射频发射模块去控制4个射频插座的电源。It took me 4 days.
控制射频需要用到RCSwitch这个库,这个库可以控制GPIO接口上的发射模块发射信号编码。最开始用RCSwitch官方的Demo时,连上Ardudio发现以下代码只能控制电源的关闭,并不能控制打开。哦,对了,忘了说遥控器有4行2列,每行都有个开关键,电源插座需要进行初始化学习才能进行控制,也就是长按插座按钮,在红色灯闪时按住遥控器的某个键,那么接下来就可以用遥控器上那一行的开关键进行控制。
用Ardudio控制射频的代码如下,引脚接10:
#include<RCSwitch.h> RCSwitch mySwitch = RCSwitch(); void setup() { Serial.begin(9600); mySwitch.enableTransmit(10); } void loop() { mySwitch.switchOn("11111",4); delay(1000); mySwitch.switchOff("11111",4); delay(1000); mySwitch.send(5393,24); delay(1000); mySwitch.send(5396,24); delay(1000); mySwitch.send("000000000001010100010001"); delay(1000); mySwitch.send("000000000001010100010100"); delay(1000); mySwitch.sendTriState("00000FFF0F0F"); delay(1000); mySwitch.sendTriState("00000FFF0FF0"); delay(1000); }
上面代码运行并且射频开关学习后发现只能控制关,并不能控制开,后面研究发现,发射模块发射出一串编码,不管编码如何,插座都会接收并且学习,但是学习后只能控制关,也就是说,上面的代码并不是射频遥控器8个控制按钮中的任何一个。后面发现,插座只学习了mySwitch.send(5393,24);这个发射的编码,其他编码都被忽略了。后来参考了国外一篇文档(果然技术内的东西都要找英文~~),发现编码的规律是,举个例子:
101010101010101000001000
前20位为地址位,后四位为数据位,也就是说后4位的编码直接控制是开还是关,于是最没有技术含量的行为出现了,我在猜测后四位数据,哈哈哈。很严肃的说一件事!!!破解靠的是技术加运气,运气也是很重要的。在尝试了许多数据之后,发现1100可以控制射频开,但是关的编码又是什么呢?之前可以控制关不能控制开,现在可以控制开了,又不能控制关。那么后四位是控制开关的,我们既然在电源开着的情况下,是否可以穷举关的编码呢,俗称暴力破解。我们构造一串编码,后四位for(int i=0;i<=1111;i++);然后前面的余位补0,发现1000是关的编码(我不会告诉你其实1000也是我猜出来的,只是后来发现暴力破解可以实现,所以可以技术实现的东西就不写猜了)。1100是开,1000是关,这是一组开关的编码,但是还有剩下3个插座。脑洞大开的地方就在这里了,1100的十进制是12,1000的十进制是8,我在想,12减去两位,变成1010(10),是否可以控制开呢?实验发现可以,12、10、8,这三个数是不是很有规律,等差数列,于是10、12、14都是可以控制开的,但是,控制关的编码只有一个1000,遥控器的每个按钮都可以控制指定的电源的,并不是一按关闭按钮之后就全部关闭,而且这里只有3个控制开的编码,但是插座有4个。前面说过前20位是地址位,解决方法在地址位上,前20位,我每在一个0位上补1,对应一个开编码,如下:
地址位:1110101010对应1110、1000
地址位:1111101010对应1100、1000
地址位:1111111010对应1010、1000
地址位:1110101010对应1100、1000
这样每个开关就对应了唯一一套编码开和关了。经过实验发现,确实是这样的。于是,不用遥控器,我们就可以直接通过程序去控制发射模块来控制电源开关。代码就不贴了,好简单,主要是思想问题,你如果知道如何控制开关,代码的编写也就是几分钟的事情!
(微信公众号申请了一年都有了,但是这是公众好的处女作,以后有空也会在公众号里贴点心得以及发表些文章,欢迎关注:iamprogramyuan )
标签:
原文地址:http://www.cnblogs.com/blogchina/p/5838698.html