射頻開關是通過射頻信號控制電源開關的一種東東,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 )