射頻開關是通過射頻訊號控制電源開關的一種東東,433mhz的開關有效遙控距離約為30公尺,假設乙個場景,一間別墅,樓下的電風扇正插著射頻插座在工作,樓上的老王想關掉樓下的電風扇,可是他又不想跑下樓,如果射頻遙控器在他旁邊,他就可以通過射頻遙控器關掉射頻開關的電源,從而關掉電風扇。
通常來說,乙個433mhz的射頻接收模組可以接收所有433mhz射頻發射器發出來的訊號,也就是說,如果你家在用射頻開關,那麼我如果知道你遙控器發出來的編碼後,我可以用發射模組發射出一串同樣的編碼去控制你家的電源。是不是有種防火防盜防鄰居的感覺。
我手裡頭進手了一套射頻開關,乙個遙控器和4個射頻插座。我的目標就是在raspberry pi裡編寫一段程式,然後通過控制射頻發射模組去控制4個射頻插座的電源。it took me 4 days.
控制射頻需要用到rcswitch這個庫,這個庫可以控制gpio介面上的發射模組發射訊號編碼。最開始用rcswitch官方的demo時,連上ardudio發現以下**只能控制電源的關閉,並不能控制開啟。哦,對了,忘了說遙控器有4行2列,每行都有個開關鍵,電源插座需要進行初始化學習才能進行控制,也就是長按插座按鈕,在紅色燈閃時按住遙控器的某個鍵,那麼接下來就可以用遙控器上那一行的開關鍵進行控制。
用ardudio控制射頻的**如下,引腳接10:
#includercswitch myswitch =rcswitch();上面**執行並且射頻開關學習後發現只能控制關,並不能控制開,後面研究發現,發射模組發射出一串編碼,不管編碼如何,插座都會接收並且學習,但是學習後只能控制關,也就是說,上面的**並不是射頻遙控器8個控制按鈕中的任何乙個。後面發現,插座只學習了myswitch.send(5393,24);這個發射的編碼,其他編碼都被忽略了。後來參考了國外一篇文件(果然技術內的東西都要找英文~~),發現編碼的規律是,舉個例子:void
setup()
void
loop()
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,對應乙個開編碼,如下:
這樣每個開關就對應了唯一一套編碼開和關了。經過實驗發現,確實是這樣的。於是,不用遙控器,我們就可以直接通過程式去控制發射模組來控制電源開關。**就不貼了,好簡單,主要是思想問題,你如果知道如何控制開關,**的編寫也就是幾分鐘的事情!
記一次面試經歷
今早七點半的巴士從中山趕到廣州面試php開發助理,以前面的都是十來人 幾十人的小公司,不少還是培訓公司,坑的一逼!這次的公司不錯,比較正規,好歹上百人了,只是筆試題做得一般,題目有的雖有學過,但忘了,好吧!這就是沒準備充分的緣故!下面羅列下我還記得的題目 有些漏了就沒辦法了 之後hr面試聊了下,雖然...
記一次重構經歷
起因 最近因為公司內部對各個業務線的使用者業務進行統一剝離,形成使用者中心,所有使用者相關的業務和資料都落地到使用者中心,各個業務線以rpc的的形式依賴使用者中心的服務。結果 因為我的疏忽,造成了兩個bug沒有被測試出來。總結改進 這兩個bug的產生的原因都是因為我錯誤地估計了回歸測試的範圍,我的想...
記一次打包aar經歷
之前維護的乙個直播專案,公司決定抽取其中的直播房間功能給公司的其他專案。因為考慮到使用的功能中包含ui 我們決定使用aar 的方式 jar包中只包含class檔案和清單檔案 專案中library庫在rebuild的完成後,會在build output aar目錄下生成對應的aar檔案。所以首先要做的...