Hallo
Geektimes Habr.
Bei mir zu Hause haben sich mehrere Funkschalter mit 433 MHz angesammelt. Es wurde interessant, ob sie für Aufgaben verwendet werden können, zum Beispiel zur Steuerung eines Computers oder zur Integration eines „Smart Home“ in das System.
Diese Schalter sind praktisch für ihre geringen Kosten und ihren stabilen Betrieb. Sie sehen ungefähr so aus:

Wie es funktioniert und was mit ihnen gemacht werden kann (Husaren schweigen :), Details unter dem Schnitt.
Theorie
Ich muss sofort sagen, wie ein solcher Schalter funktioniert, ich weiß es nicht, obwohl ich es vermute. Sie müssen also ein wenig Reverse Engineering durchführen.
Zunächst muss das Signal empfangen werden, für das wir den bereits bekannten RTL-SDR-Empfänger verwenden, der für Funkamateure oft einfach als „Pfeife“ bezeichnet wird. Mit diesem Gerät für nur 10 US-Dollar können Sie Funksignale im Bereich von etwa 50 bis 1250 MHz empfangen, was wir brauchen. Das Thema ist alt, aber wenn jemand es nicht gelesen hat,
lesen Sie es .
Wir machen den ersten Schritt der Analyse - wir schauen uns den Schalter genau an. Wir finden, dass auf der Rückseite des Gehäuses „Made in China“ steht (wer hätte das gedacht?). Und was noch wichtiger ist, die Frequenz 433 MHz ist angegeben. Jetzt können Sie den SDR-Empfänger anschließen, SDR # starten und sicherstellen, dass die Daten tatsächlich übertragen werden.

Die Symmetrie des Signals im Spektrum deutet auf das Vorhandensein einer AM-Modulation hin. Übrigens ist rechts ein schwächeres „Alien“ -Signal sichtbar - sie können auch empfangen und dekodiert werden, sie werden separat näher erläutert. Zurück zum Signal. Wir nehmen es im üblichen WAV-Format auf und drücken die Tasten auf der Fernbedienung - zum Beispiel habe ich die EIN- und AUS-Tasten auf Kanal „1“ gedrückt.
Öffnen Sie die Audiodatei in einem beliebigen Audio-Editor und vergleichen Sie die Signale mit einem anderen professionellen Analysetool, Paint. Wir platzieren 2 Signale von verschiedenen Tasten übereinander, um den Unterschied zu sehen:

Es ist leicht zu erkennen, dass wir die übliche Bitfolge haben, deren Unterschied nur in einem Bit liegt und der EIN- oder AUS-Taste entspricht. Während die Taste gedrückt wird, wiederholt der Schalter diese Sequenz einfach zyklisch in der Luft mit einer Geschwindigkeit von 20 Mal pro Sekunde. Günstig und einfach, auch wenn eine Sequenz während der Übertragung verzerrt ist, wird die andere akzeptiert.
Daraus kann übrigens eine wichtige Schlussfolgerung gezogen werden: Die Signale solcher Switches (es handelt sich um billige Modelle) werden "wie sie sind" ohne Authentifizierung, Schutz oder Verschlüsselung übertragen. Ein solcher Schalter oder eine Funksteckdose mit einem solchen Schalter sollte nicht für einige wichtige Funktionen verwendet werden, z. B. zum Einschalten leistungsfähiger Heizungen oder noch mehr zum Öffnen der Vordertür oder der Garage. Es geht nicht einmal um Hacker (die Wahrscheinlichkeit, dass jemand drahtlos in mein Haus eindringt, schätze ich weniger als die Wahrscheinlichkeit, auf mein ISS-Haus zu fallen), sondern dass ein Nachbar versehentlich denselben Schalter kaufen kann und die Codes möglicherweise übereinstimmen ( Am Schalter besteht jedoch die Wahl zwischen 4 Kanälen. Nach meiner Erfahrung hat der Leistungsschalter 2-3 Mal im Jahr „sich selbst“ eingeschaltet, entweder ein Hindernis oder ein entferntes Signal vom selben Modell wurde tatsächlich empfangen.
Dies gilt natürlich nicht für komplexere Systeme wie Lora oder Philips Hue. Mit der Verschlüsselung ist alles in Ordnung.
Zurück zu unserer Aufgabe. Sie können einen Decoder solcher Signale selbst schreiben, aber zum Glück wurde dies bereits vor uns in einem Projekt namens "rtl_433" durchgeführt. Das Programm wurde ursprünglich für Linux erstellt, die Windows-Version kann unter Linux heruntergeladen werden. Die Version kann von
GitHub heruntergeladen werden.
Wir starten das Programm über die Kommandozeile: "rtl_433.exe -F json"

Wir haben die Daten, es bleibt ein Programm für deren Verarbeitung zu schreiben.
Himbeer pi
Das erste, was interessant ist, ist der Raspberry Pi. Um
rtl_433 auf Raspbian zu installieren, entpacken Sie das
Archiv und führen Sie die folgenden Befehle aus.
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
Der zweite Schritt besteht darin, ein Programm zu schreiben, das diese Daten empfängt, und abhängig davon die erforderlichen Aktionen auszuführen. Python-Code ist ziemlich einfach:
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")
Um den Code auszuführen, müssen Sie ihn in einer Datei (z. B. rtl_listen.py) speichern und den Befehl "python rtl_listen.py" ausführen.
Wie Sie sehen können, startet das Programm den Prozess mit subprocess.Popen und liest Daten daraus. Dann ist alles einfach, der Code ist gut lesbar und es wird nicht schwierig sein, Änderungen vorzunehmen. Wenn in diesem Beispiel die Taste „1“ gedrückt wird, wird der Nachrichtendruck („EIN“) angezeigt. Stattdessen können Sie etwas anderes tun, z. B. den GPIO-Pin aktivieren, das Relais einschalten, Daten an den Server senden usw. Bevor Sie ihn verwenden können, müssen Sie ihn gleichzeitig ändern Name Sendername im Namen des Modells der Konsole, die verwendet werden soll.
Übrigens sieht der RTL-SDR-Empfänger selbst im Vergleich zum Raspberry Pi folgendermaßen aus:

Windows
Leider hat der obige Code unter Windows 10 nicht funktioniert. Wie eine Suche in Github nahe legt, funktioniert das asynchrone Lesen von Daten aus einem separaten Stream. Warum so, es war zu faul, um herauszufinden, ich werde nur den Arbeitscode unter den Spoiler bringen.
Quellcode from __future__ import print_function import os, sys import subprocess import time import threading import Queue import json class AsynchronousFileReader(threading.Thread):
Mit diesem Code können wir alle Aktionen im Handler verwenden. Die Logik ist dieselbe wie im Code auf dem Raspberry Pi.
Beispiel : Angenommen, wir haben einen Computer für ein Heimkino und möchten ihn durch Drücken der Taste auf der Fernbedienung ausschalten. Ersetzen Sie den Code 'print ("OFF")' durch
os.system('shutdown -s') sys.exit(0)
Danach schaltet sich der Computer durch Drücken der entsprechenden Taste aus. Zusätzlich zu "shutdown -s" können Sie natürlich auch jeden anderen Windows-Befehl verwenden. Sie müssen lediglich berücksichtigen, dass die Befehle wiederholt gesendet werden, während die Fernbedienungstaste gedrückt wird. Um solche Duplikate zu vermeiden, müssen Sie den Code verbessern.
Fazit
Wie Sie sehen, ist alles ziemlich einfach und es gibt Raum zum Experimentieren. Zum Schluss noch ein kleiner Bonus für diejenigen, die bis hierher gelesen haben. Bei 433 MHz gibt es eine große Anzahl verschiedener Geräte, die rtl_433 dekodieren kann. Sie können das Programm einfach mehrere Stunden lang laufen lassen und sehen, was „fängt“. Unter dem Spoiler ein Beispiel für ein solches Protokoll, das zuvor aufgezeichnet wurde:
Protokoll2018-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
Es gibt interessante Daten, zum Beispiel den Reifendruck des Autos eines Nachbarn (TPMS, Reifendrucküberwachungssystem) oder die Außentemperatur +6 vom Sensor eines anderen. Dies ermöglicht beispielsweise die Anzeige der Außentemperatur, wenn die Nachbarn versehentlich eine mit diesem Protokoll kompatible Wetterstation haben.
Alle erfolgreichen Experimente.
Haftungsausschluss : Offensichtlich ist die Verwendung von SDR und digitaler Verarbeitung zum Lesen von OOK-Modulationssignalen im Wesentlichen ein Schuss auf Spatzen. Vielleicht gibt es bei aliexpress handelsübliche Empfänger für 1 bis 2 US-Dollar, die das Gleiche tun, mit geringeren Kosten und geringerem Stromverbrauch. Wenn jemand solche Modelle kennt, schreibe in die Kommentare.