Kami menggunakan saklar nirkabel 433MHz untuk mengontrol PC

Halo Geektimes Habr.

Di tempat saya beberapa switch nirkabel pada 433 MHz terakumulasi di rumah, menjadi menarik apakah mereka dapat digunakan untuk tugas apa pun, misalnya, untuk mengendalikan komputer atau untuk mengintegrasikan "rumah pintar" ke dalam sistem.

Sakelar ini nyaman untuk biaya rendah dan operasi yang stabil, mereka terlihat seperti ini:



Cara kerjanya, dan apa yang bisa dilakukan dengan mereka (hussars diam :), detail di bawah potongan.

Teori


Saya harus mengatakan langsung bagaimana saklar seperti itu bekerja, saya tidak tahu, meskipun saya kira begitu. Jadi, Anda perlu melakukan sedikit rekayasa terbalik.

Pertama-tama, sinyal harus diterima, yang kami gunakan penerima RTL-SDR yang sudah terkenal, sering disebut hanya "peluit" untuk amatir radio. Perangkat ini, dengan harga hanya $ 10, memungkinkan Anda untuk menerima sinyal radio dalam kisaran sekitar 50 hingga 1250 MHz, untuk kami apa yang kami butuhkan. Topiknya sudah tua, tetapi jika seseorang belum membacanya, bacalah .

Kami mengambil langkah pertama analisis - kami hati-hati melihat sakelar. Kami menemukan bahwa di bagian belakang case tertulis "Made in China" (siapa sangka?) Dan, yang lebih penting, frekuensi 433 MHz diindikasikan. Sekarang Anda dapat menghubungkan penerima SDR, mulai SDR # dan pastikan bahwa data memang dikirim.



Simetri sinyal pada spektrum menunjukkan adanya modulasi AM. Omong-omong, sinyal "alien" yang lebih lemah terlihat di sebelah kanan - mereka juga dapat diterima dan didekodekan, mereka akan dibahas secara lebih rinci secara terpisah. Namun, kembali ke sinyalnya. Kami merekamnya dalam format WAV biasa dan menekan tombol pada remote control - misalnya, saya menekan tombol ON dan OFF pada saluran "1".

Buka file suara di editor audio apa pun, dan gunakan alat analitik profesional lain, Paint, untuk membandingkan sinyal. Kami menempatkan 2 sinyal dari tombol yang berbeda satu di atas yang lain untuk melihat perbedaannya:



Sangat mudah untuk melihat bahwa kita memiliki urutan bit yang biasa, perbedaan di mana hanya dalam satu bit, sesuai dengan tombol ON atau OFF. Ketika tombol ditekan, saklar secara siklik mengulangi urutan ini di udara dengan kecepatan 20 kali per detik. Murah dan mudah, bahkan jika satu urutan terdistorsi selama transmisi, yang lain akan diterima.

Dari sini, omong-omong, satu kesimpulan penting dapat dibuat - sinyal dari saklar semacam itu (kita berbicara tentang model murah) ditransmisikan "apa adanya" tanpa otentikasi, perlindungan atau enkripsi. Sakelar atau outlet nirkabel dengan sakelar semacam itu tidak boleh digunakan untuk beberapa fungsi penting, misalnya untuk menyalakan pemanas yang kuat atau bahkan lebih untuk membuka pintu depan atau garasi. Ini bahkan bukan masalah peretas (kemungkinan seseorang akan meretas rumah saya secara nirkabel, saya perkirakan kurang dari kemungkinan jatuh ke rumah ISS saya), tetapi seorang tetangga secara tidak sengaja dapat membeli sakelar yang sama, dan kodenya mungkin cocok ( Namun pada saklar ada pilihan antara 4 saluran). Dalam pengalaman saya menggunakannya, 2-3 kali setahun pemutus sirkuit menyalakan "itu sendiri", baik penghalang, atau sinyal jauh dari model yang sama benar-benar diterima.

Tentu saja, ini tidak berlaku untuk sistem yang lebih kompleks, seperti Lora atau Philips Hue, semuanya baik-baik saja dengan enkripsi.

Namun, kembali ke tugas kita. Anda dapat menulis sendiri decoder sinyal tersebut, tetapi untungnya, ini telah dilakukan sebelum kami, dalam proyek yang disebut "rtl_433". Program ini awalnya dibuat untuk Linux, versi Windows dapat diunduh di versi Linux dapat diunduh dari GitHub .

Kami memulai program dari baris perintah: "rtl_433.exe -F json"



Kami mendapatkan data, masih menulis program untuk diproses.

Raspberry pi


Hal pertama yang menarik untuk dipertimbangkan adalah Raspberry Pi. Untuk menginstal rtl_433 pada Raspbian, buka paket arsip dan jalankan perintah berikut.

sudo apt-get install libtool libusb-1.0.0-dev librtlsdr-dev rtl-sdr build-essential autoconf cmake pkg-config cd rtl_433/ autoreconf --install ./configure make make install 

Langkah kedua adalah menulis program yang akan menerima data ini, dan bergantung padanya, lakukan tindakan yang diperlukan. Kode python cukup mudah:

 from __future__ import print_function import os, sys, io import json import subprocess print("RTLSDR listening started") transmitter_name = "Waveman Switch Transmitter" transmitter_channel = 1 proc = subprocess.Popen(["rtl_433 -F json"], stdout=subprocess.PIPE, shell=True) while True: try: line = proc.stdout.readline().encode('ascii','ignore') proc.poll() data = json.loads(line) print(data) m,st,ch,btn= data['model'],data['state'],data['channel'],data['button'] if m==transmitter_name and ch==transmitter_channel and btn==1 and st=='on': print("ON") elif m==transmitter_name and ch==transmitter_channel and btn==1 and st=='off': print("OFF") except KeyboardInterrupt: break except: pass print("RTLSDR listening done") 

Untuk menjalankan kode, Anda perlu menyimpannya dalam file (misalnya rtl_listen.py) dan menjalankan perintah "python rtl_listen.py".

Seperti yang Anda lihat, program memulai proses menggunakan subproses. Buka dan baca data dari itu. Maka semuanya sederhana, kodenya cukup mudah dibaca, dan tidak akan sulit untuk melakukan perubahan. Dalam contoh ini, ketika tombol "1" ditekan, pesan cetak ("ON") ditampilkan, sebagai gantinya, Anda dapat melakukan sesuatu yang lain, misalnya, mengaktifkan pin GPIO, menghidupkan relai, mengirim data ke server, dll. Sebelum menggunakannya, Anda harus mengubahnya pada waktu yang bersamaan. namai nama pemancar dalam nama model konsol yang akan digunakan.

Omong-omong, penerima RTL-SDR itu sendiri, dibandingkan dengan Raspberry Pi, terlihat seperti ini:



Windows


Sayangnya, di bawah Windows 10, kode di atas tidak berfungsi. Tetapi seperti yang disarankan oleh pencarian di github, pembacaan data yang tidak sinkron dari aliran yang terpisah berfungsi. Mengapa demikian, terlalu malas untuk mengetahuinya, saya hanya akan membawa kode kerja di bawah spoiler.

Kode sumber
 from __future__ import print_function import os, sys import subprocess import time import threading import Queue import json class AsynchronousFileReader(threading.Thread): # Helper class to implement asynchronous reading def __init__(self, fd, queue): assert isinstance(queue, Queue.Queue) assert callable(fd.readline) threading.Thread.__init__(self) self._fd = fd self._queue = queue def run(self): # The body of the tread: read lines and put them on the queue. for line in iter(self._fd.readline, ''): self._queue.put(line) def eof(self): # Check whether there is no more content to expect return not self.is_alive() and self._queue.empty() def replace(string): while ' ' in string: string = string.replace(' ', ' ') return string def read_rtl_data(): process = subprocess.Popen(["rtl_433.exe", "-F", "json"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # Launch the asynchronous readers of stdout and stderr. stdout_queue = Queue.Queue() stdout_reader = AsynchronousFileReader(process.stdout, stdout_queue) stdout_reader.start() stderr_queue = Queue.Queue() stderr_reader = AsynchronousFileReader(process.stderr, stderr_queue) stderr_reader.start() transmitter_name = "Waveman Switch Transmitter" transmitter_channel = 1 # Check the queues if we received some output while not stdout_reader.eof() or not stderr_reader.eof(): # Show what we received from standard output. while not stdout_queue.empty(): line = stdout_queue.get() print("Line1:", repr(line)) data = json.loads(line) # print("Data:", repr(line)) m,st,ch,btn= data['model'],data['state'],data['channel'],data['button'] if m==transmitter_name and ch==transmitter_channel and btn==1 and st=='on': print("ON") elif m==transmitter_name and ch==transmitter_channel and btn==1 and st=='off': print("OFF") # Show what we received from standard error. while not stderr_queue.empty(): line = replace(stderr_queue.get()) print("Line2:", line) # Sleep a bit before asking the readers again. time.sleep(0.1) stdout_reader.join() stderr_reader.join() # Close subprocess' file descriptors. process.stdout.close() process.stderr.close() if __name__ == '__main__': print("RTLSDR listening started") read_rtl_data() print("RTLSDR listening done") 


Dengan kode ini kita dapat menggunakan tindakan apa pun di handler, logikanya sama dengan kode pada Raspberry Pi.

Contoh : misalkan kita memiliki komputer yang didedikasikan untuk home theatre, dan kami ingin mematikannya dengan menekan tombol pada remote control. Ganti kode 'print ("OFF")' dengan

  os.system('shutdown -s') sys.exit(0) 

Setelah itu, komputer akan mati dengan menekan tombol yang sesuai. Tentu saja, selain "shutdown -s," Anda dapat menggunakan perintah Windows lainnya, Anda hanya perlu mempertimbangkan bahwa perintah akan dikirim berulang kali, sementara tombol remote control ditekan, untuk menghindari duplikasi seperti itu, Anda perlu meningkatkan kode.

Kesimpulan


Seperti yang Anda lihat, semuanya cukup sederhana, dan ada ruang untuk eksperimen. Akhirnya, bonus kecil bagi yang sudah membaca sampai di sini. Pada 433 MHz ada sejumlah besar perangkat berbeda yang dapat didekodekan oleh rtl_433, Anda cukup membiarkan program bekerja selama beberapa jam, dan lihat apa yang “menangkap”. Di bawah spoiler, contoh log semacam itu, yang direkam sebelumnya:

Log
2018-01-10 21:15:17 : Prologue sensor : 5 : 15
Channel: 1
Battery: OK
Button: 0
Temperature: 6.00 C
Humidity: 11 %

2018-01-10 21:15:28 : inFactory sensor
ID: 71
Temperature: 6.67 °C
Humidity: 99 %

2018-01-10 21:16:07 : Toyota : TPMS : 61511475 : 60e5006b : CRC

2018-01-10 21:20:33 : Prologue sensor : 5 : 15
Channel: 1
Battery: OK
Button: 0
Temperature: 6.00 C
Humidity: 11 %
: Waveman Switch Transmitter
id: A
channel: 2
button: 1
state: on
: Waveman Switch Transmitter
id: A
channel: 2
button: 1
state: on
: Waveman Switch Transmitter
id: A
channel: 2
button: 1
state: on

2018-01-10 21:21:21 : Akhan 100F14 remote keyless entry
ID (20bit): 0x41
Data (4bit): 0x4 (Mute)
: Waveman Switch Transmitter
id: A
channel: 2
button: 1
state: off

2018-01-10 21:32:31 : Ford : TPMS : 00268b1f : a34a0e : CHECKSUM
2018-01-10 21:32:32 : Ford : TPMS : 00268a5c : 9c440e : CHECKSUM
2018-01-10 21:32:37 : Ford : TPMS : 016dbfce : 99430e : CHECKSUM
2018-01-10 21:32:39 : Ford : TPMS : 002671a0 : 9c4a0e : CHECKSUM


Ada data yang menarik, misalnya, tekanan ban mobil tetangga (TPMS, sistem pemantauan tekanan ban), atau suhu luar +6 dari sensor orang lain. Ini memungkinkan misalnya, menampilkan suhu luar jika tetangga secara tidak sengaja memiliki stasiun cuaca yang kompatibel dengan protokol ini.

Semua percobaan berhasil.

Penafian : Jelas, menggunakan SDR dan pemrosesan digital untuk membaca sinyal modulasi OOK pada dasarnya adalah senjata yang menembaki burung gereja. Mungkin di aliexpress ada receiver yang dijual seharga $ 1-2 yang melakukan hal yang sama, dengan biaya lebih rendah dan konsumsi daya lebih sedikit. Jika ada yang tahu model seperti itu, tulis di komentar.

Source: https://habr.com/ru/post/id414285/


All Articles