Hola
Geektimes Habr.
En mi casa, varios interruptores inalámbricos a 433 MHz acumulados en el hogar, se hizo interesante si se pueden usar para cualquier tarea, por ejemplo, para controlar una computadora o para integrar una "casa inteligente" en el sistema.
Estos interruptores son convenientes por su bajo costo y operación estable, se ven así:

Cómo funciona y qué se puede hacer con ellos (los húsares se quedan callados :), detalles debajo del corte.
Teoría
Tengo que decir de inmediato cómo funciona un interruptor así, no lo sé, aunque supongo que sí. Por lo tanto, tendrá que hacer un poco de ingeniería inversa.
En primer lugar, se debe recibir la señal, para lo cual utilizamos el ya conocido receptor RTL-SDR, a menudo llamado simplemente un "silbato" para los radioaficionados. Este dispositivo, con un precio de solo $ 10, le permite recibir señales de radio en el rango de aproximadamente 50 a 1250 MHz, para nosotros lo que necesitamos. El tema es antiguo, pero si alguien no lo ha leído,
léalo .
Tomamos el primer paso del análisis: observamos cuidadosamente el interruptor. Encontramos que en la parte posterior del estuche dice "Hecho en China" (¿quién lo hubiera pensado?) Y, lo que es más importante, se indica la frecuencia de 433 MHz. Ahora puede conectar el receptor SDR, iniciar SDR # y asegurarse de que los datos se transmitan.

La simetría de la señal en el espectro sugiere la presencia de modulación AM. Por cierto, una señal "alienígena" más débil es visible a la derecha: también se pueden recibir y decodificar, se discutirán con más detalle por separado. Sin embargo, volvamos a la señal. Lo grabamos en el formato WAV habitual y presionamos los botones del control remoto; por ejemplo, presioné los botones ON y OFF en el canal "1".
Abra el archivo de sonido en cualquier editor de audio y use otra herramienta de análisis profesional, Paint, para comparar señales. Colocamos 2 señales de diferentes botones uno encima del otro para ver la diferencia:

Es fácil ver que tenemos la secuencia de bits habitual, cuya diferencia es solo en un bit, correspondiente al botón ON u OFF. Mientras se presiona el botón, el interruptor simplemente repite cíclicamente esta secuencia en el aire a una velocidad de 20 veces por segundo. Barato y fácil, incluso si una secuencia se distorsiona durante la transmisión, la otra será aceptada.
A partir de esto, por cierto, se puede llegar a una conclusión importante: las señales de tales interruptores (estamos hablando de modelos baratos) se transmiten "tal cual" sin ninguna autenticación, protección o cifrado. Tal interruptor o una toma de corriente inalámbrica con dicho interruptor no debe usarse para algunas funciones importantes, por ejemplo, para encender calentadores potentes o incluso más para abrir la puerta principal o el garaje. Ni siquiera se trata de piratas informáticos (la posibilidad de que alguien piratee mi casa de forma inalámbrica, calculo menos que la posibilidad de caer en mi casa de la EEI), sino que un vecino pueda comprar accidentalmente el mismo interruptor, y los códigos pueden coincidir ( sin embargo, en el conmutador hay una opción entre 4 canales). En mi experiencia de usarlo, 2-3 veces al año el interruptor de circuito se encendió "en sí mismo", ya sea realmente un obstáculo o una señal distante del mismo modelo.
Por supuesto, esto no se aplica a sistemas más complejos, como Lora o Philips Hue, todo está bien con el cifrado.
Sin embargo, volvamos a nuestra tarea. Puede escribir un decodificador de tales señales usted mismo, pero afortunadamente, esto ya se ha hecho antes que nosotros, en un proyecto llamado "rtl_433". El programa fue creado originalmente para Linux, la versión de Windows se puede descargar
en la versión de Linux se puede descargar desde
GitHub .
Iniciamos el programa desde la línea de comando: "rtl_433.exe -F json"

Obtuvimos los datos, queda por escribir un programa para su procesamiento.
Raspberry pi
Lo primero que es interesante considerar es la Raspberry Pi. Para instalar
rtl_433 en Raspbian, desempaquete el
archivo y ejecute los siguientes comandos.
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
El segundo paso es escribir un programa que reciba estos datos y, dependiendo de ello, realizar las acciones necesarias. El código de Python es bastante sencillo:
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")
Para ejecutar el código, debe guardarlo en un archivo (por ejemplo, rtl_listen.py) y ejecutar el comando "python rtl_listen.py".
Como puede ver, el programa inicia el proceso usando un subproceso. Abre y lee datos de él. Entonces todo es simple, el código es bastante legible y no será difícil hacer cambios. En este ejemplo, cuando se presiona el botón "1", se muestra el mensaje de impresión ("ON"), en su lugar puede hacer otra cosa, por ejemplo, activar el pin GPIO, encender el relé, enviar datos al servidor, etc. Antes de usarlo, deberá cambiarlo al mismo tiempo nombre del transmisor_nombre en el nombre del modelo de la consola que se utilizará.
Por cierto, el receptor RTL-SDR en sí, en comparación con el Raspberry Pi, se ve así:

Ventanas
Desafortunadamente, en Windows 10, el código anterior no funcionó. Pero como sugirió una búsqueda en github, la lectura asíncrona de datos de una secuencia separada funciona. Por qué, fue demasiado flojo descubrirlo, solo pondré el código de trabajo debajo del spoiler.
Código fuente from __future__ import print_function import os, sys import subprocess import time import threading import Queue import json class AsynchronousFileReader(threading.Thread):
Con este código podemos usar cualquier acción en el controlador, la lógica es la misma que en el código de la Raspberry Pi.
Ejemplo : supongamos que tenemos una computadora dedicada a un sistema de cine en casa y queremos apagarla presionando el botón del control remoto. Reemplace el código 'print ("OFF")' con
os.system('shutdown -s') sys.exit(0)
Después de lo cual, la computadora se apagará presionando el botón correspondiente. Por supuesto, además de "shutdown -s", puede usar cualquier otro comando de Windows, solo debe tener en cuenta que los comandos se enviarán repetidamente, mientras se presiona el botón del control remoto, para evitar dicha duplicación, debe mejorar el código.
Conclusión
Como puede ver, todo es bastante simple y hay espacio para la experimentación. Finalmente, un pequeño bono para aquellos que han leído hasta aquí. A 433 MHz hay una gran cantidad de dispositivos diferentes que rtl_433 puede decodificar, simplemente puede dejar el programa funcionando durante varias horas y ver qué "atrapa". Debajo del spoiler, un ejemplo de tal registro, registrado anteriormente:
Registro2018-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
Hay datos interesantes, por ejemplo, la presión de los neumáticos del automóvil de un vecino (TPMS, sistema de monitoreo de la presión de los neumáticos) o la temperatura exterior +6 del sensor de otra persona. Esto permite, por ejemplo, mostrar la temperatura exterior si los vecinos accidentalmente tienen una estación meteorológica compatible con este protocolo.
Todos los experimentos exitosos.
Descargo de responsabilidad : Obviamente, usar SDR y procesamiento digital para leer las señales de modulación OOK es esencialmente un disparo de pistola en gorriones. Quizás en aliexpress hay receptores disponibles por $ 1-2 que hacen lo mismo, con menor costo y menor consumo de energía. Si alguien conoce tales modelos, escriba los comentarios.