Olá,
Geektimes Habr.
Na minha casa, vários comutadores sem fio de 433 MHz acumulados em casa, tornou-se interessante se eles podem ser usados para qualquer tarefa, por exemplo, controlar um computador ou integrar uma “casa inteligente” ao sistema.
Esses comutadores são convenientes por seu baixo custo e operação estável, eles se parecem com isso:

Como funciona e o que pode ser feito com eles (os hussardos ficam calados :), detalhes sob o corte.
Teoria
Eu tenho que dizer imediatamente como essa opção funciona, eu não sei, embora eu pense sobre isso. Então você precisará fazer um pouco de engenharia reversa.
Primeiro de tudo, o sinal deve ser recebido, para o qual usamos o já conhecido receptor RTL-SDR, geralmente chamado simplesmente de "apito" para radioamadores. Este dispositivo, ao preço de apenas US $ 10, permite receber sinais de rádio na faixa de 50 a 1250 MHz, para nós o que precisamos. O tópico é antigo, mas se alguém não o leu,
leia-o .
Damos o primeiro passo da análise - analisamos cuidadosamente o interruptor. Nós achamos que no verso do case diz “Made in China” (quem teria pensado?) E, mais importante, a frequência 433 MHz é indicada. Agora você pode conectar o receptor SDR, iniciar o SDR # e garantir que os dados sejam realmente transmitidos.

A simetria do sinal no espectro sugere a presença de modulação AM. A propósito, um sinal "alienígena" mais fraco é visível à direita - eles também podem ser recebidos e decodificados, serão discutidos em mais detalhes separadamente. No entanto, de volta ao sinal. Gravamos no formato WAV usual e pressionamos os botões no controle remoto - por exemplo, pressionei os botões ON e OFF no canal “1”.
Abra o arquivo de som em qualquer editor de áudio e use outra ferramenta de análise profissional, o Paint, para comparar sinais. Colocamos 2 sinais de botões diferentes, um acima do outro, para ver a diferença:

É fácil ver que temos a sequência de bits usual, cuja diferença é de apenas um bit, correspondente ao botão ON ou OFF. Enquanto o botão é pressionado, o interruptor repete ciclicamente essa sequência no ar a uma velocidade de 20 vezes por segundo. Barato e fácil, mesmo que uma sequência seja distorcida durante a transmissão, a outra será aceita.
A partir disso, a propósito, uma conclusão importante pode ser feita - os sinais de tais comutadores (estamos falando de modelos baratos) são transmitidos "no estado em que se encontram" sem autenticação, proteção ou criptografia. Esse comutador ou uma tomada sem fio com esse comutador não deve ser usado para algumas funções importantes, por exemplo, para ligar aquecedores potentes ou mais ainda para abrir a porta da frente ou a garagem. Não é apenas uma questão de hackers (a chance de alguém invadir minha casa sem fio, eu estimo menos do que a chance de cair na minha casa da ISS), mas um vizinho pode comprar acidentalmente o mesmo switch e os códigos podem corresponder ( no entanto, no switch, há uma escolha entre 4 canais). Na minha experiência de usá-lo, 2-3 vezes por ano, o disjuntor se ligava "em si", um obstáculo ou um sinal distante do mesmo modelo era realmente recebido.
Obviamente, isso não se aplica a sistemas mais complexos, como Lora ou Philips Hue, tudo está bem com a criptografia.
No entanto, voltemos à nossa tarefa. Você mesmo pode escrever um decodificador desses sinais, mas, felizmente, isso já foi feito antes de nós, em um projeto chamado "rtl_433". O programa foi originalmente criado para Linux, a versão do Windows pode ser baixada
na versão do Linux pode ser baixada do
GitHub .
Iniciamos o programa na linha de comando: "rtl_433.exe -F json"

Temos os dados, resta escrever um programa para o processamento deles.
Raspberry pi
A primeira coisa que é interessante considerar é o Raspberry Pi. Para instalar o
rtl_433 no Raspbian, descompacte o
arquivo e execute os seguintes 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
O segundo passo é escrever um programa que receba esses dados e, dependendo deles, execute as ações necessárias. O código Python é bem direto:
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 executar o código, você precisa salvá-lo em um arquivo (por exemplo, rtl_listen.py) e executar o comando “python rtl_listen.py”.
Como você pode ver, o programa inicia o processo usando subprocess.Popen e lê os dados a partir dele. Então tudo é simples, o código é bastante legível e não será difícil fazer alterações. Neste exemplo, quando o botão "1" é pressionado, a mensagem de impressão ("ON") é exibida. Em vez disso, você pode fazer outra coisa, por exemplo, ativar o pino GPIO, ligar o relé, enviar dados para o servidor, etc. Antes de usá-lo, será necessário alterá-lo ao mesmo tempo nome transmitter_name no nome do modelo do console que será usado.
A propósito, o próprio receptor RTL-SDR, em comparação com o Raspberry Pi, fica assim:

Windows
Infelizmente, no Windows 10, o código acima não funcionou. Mas, como sugeriu uma pesquisa no github, a leitura assíncrona de dados de um fluxo separado funciona. Por que foi tão preguiçoso para descobrir, vou colocar o código de trabalho embaixo do spoiler.
Código fonte from __future__ import print_function import os, sys import subprocess import time import threading import Queue import json class AsynchronousFileReader(threading.Thread):
Com esse código, podemos usar qualquer ação no manipulador, a lógica é a mesma do código no Raspberry Pi.
Exemplo : suponha que tenhamos um computador dedicado a um home theater e queremos desligá-lo pressionando o botão no controle remoto. Substitua o código 'print ("OFF")' por
os.system('shutdown -s') sys.exit(0)
Depois disso, o computador será desligado pressionando o botão apropriado. Obviamente, além de “shutdown -s”, você pode usar qualquer outro comando do Windows, basta considerar que os comandos serão enviados repetidamente, enquanto o botão do controle remoto for pressionado, para evitar essa duplicação, é necessário melhorar o código.
Conclusão
Como você pode ver, tudo é bem simples e há espaço para experimentação. Finalmente, um pequeno bônus para quem leu até aqui. Em 433 MHz, há um grande número de dispositivos diferentes que o rtl_433 pode decodificar, basta deixar o programa para trabalhar por várias horas e ver o que "captura". Sob o spoiler, um exemplo desse registro, registrado anteriormente:
Log2018-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
Existem dados interessantes, por exemplo, a pressão dos pneus do carro de um vizinho (TPMS, sistema de monitoramento de pressão dos pneus) ou a temperatura externa +6 do sensor de outra pessoa. Isso permite, por exemplo, exibir a temperatura externa se os vizinhos tiverem acidentalmente uma estação meteorológica compatível com este protocolo.
Todas as experiências bem sucedidas.
Exoneração de responsabilidade : Obviamente, o uso de SDR e processamento digital para ler sinais de modulação OOK é essencialmente uma arma disparada contra pardais. Talvez no aliexpress existam receptores de prateleira por US $ 1 a 2 que fazem a mesma coisa, com menor custo e menor consumo de energia. Se alguém conhece esses modelos, escreva nos comentários.