piątek, 13 kwietnia 2018

Odczytywanie nieznanych kodów 433 MHz - cz II

Dziś druga część jak poradzić sobie (lub nie) z nieznanymi kodami transmisji urządzeń bezprzewodowych w paśmie 433 MHz. Czyli opowieść o wszystkoczytającym łamaczu kodów.






Na stole pozostał trzeci najbardziej oporny do zdekodowania dzwonek firmy ELHOME.


Zarówno biblioteka RCSwitch autorstwa SUI77 jak i zmodyfikowana przez Martin-Laclaustra są całkowicie ślepe a może raczej głuche na transmisję wysyłaną przez dzwonek. To trochę dziwne bo Analizator Protokołu  coś tam jednak pokazać powinien. Ale nie pokazuje. Trudno .

Znalazłem kiedyś na sieci monitor czytający wszytko jak leci co jest widziane przez odbiornik 433 MHz autorstwa bal00. Kod jest uniwersalny i nie korzysta z przerwań dzięki czemu można go zaimplementować na dowolny mikrokontroler.

A to efekt jego działania - zostawiam  tylko jedną powtarzającą się sekwencję sygnałów

int intervals[] = {984, 349, 1983, //  351, 10310, 1027, 307, 360, 973, 1024, 310, 357, 976, 1023, 310, 1021, 314, 1019, 314, 1018, 316, 351, 982, 352, 982, 1017, 316, 1018, 315, 351, 982, 1018, 315, 351, 982, 1019, 315, 351, 982, 351, 983, 350, 982, 352, 981, 1019, 314, 353, 980, 353, 980, 352, 1982, // 352, 10310, 1028, 304, 362, 972, 1027, 306, 361, 973, 1026, 307, 1026, 309, 1023, 309, 1023, 311};
Signal captured with 180 edges

Wykres tego przebiegu ma postać


Wielkości wynikające z RAW data:
- długość impulsu synchronizacji ok 10030 us
- dł. podstawowa impulsu danych coś ok 333 us 
- dł drugiego impulsu danych ok 1000 us
- stosunek czasów 1 i 0 to 3:1 (lub 1:3 bo nie wiem co jest zerem a co jedynką)
- stosunek impulsu synchronizacji do impulsu podstawowego ok 30

Tak na oko ten kod niczym specjalnym się nie wyróżnia poza jedną nietypową rzeczą - na końcu sygnału pojawia się znak o podwójnej długości dłuższego czasu danych  (ok 2000 us). Ale poza tym pełen standard.

Jest to raczej przebieg nieodwrócony i kodem dzwonka jest najprawdopodobniej

1010 1111 0011 0101 0000 100D S
gdzie D oznacza długi impuls podobny do 0 ale o czasie 2000 us
a S impuls synchronizacji o czasie 10000 us.

Jak dla mnie jest to na zwykły 24 bitowy kod stały z zepsutym (powiększonym 2x ) ostatnim impulsem zera oznaczającym koniec kodu. No to będzie chyba mały problem.

Zastosuję najpierw metodę brute force - wyślę do dzwonka to co wydaje się być jego kodem. Na końcu monitora wszystkoczytającego jest mały fragment programu wysyłającego odebrane dane. Na tej podstawie stworzyłem swój własny programowy "przycisk dzwonka" wysyłający odczytany wcześniej kod.

int timings[] = { 350, 1982, 353, 10307, 1032, 303, 363, 971,
                  1024, 312, 356, 977, 1022, 312, 957, 377,
                  1019, 315, 1018, 314, 354, 980, 353, 979,
                  1020, 314, 1019, 316, 352, 980, 1019, 314,
                  353, 979, 1020, 316, 351, 982, 351, 982, 352,
                  981, 351, 982, 1018, 316, 351, 981, 352, 981
                };
int edges = 49;
#define led 13

void setup() {
  Serial.begin(115200);
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
}
void loop() {
  Serial.print("send data");
  int licz = 15;
  for (int k = 0; k <= licz; k++) {
    boolean high = false;
    for (int i = 0; i <= edges; i++)
    {
      if (high) {
        digitalWrite(led, LOW);
        high = false;
      }
      else {
        digitalWrite(led, HIGH);
        high = true;
      }
      delayMicroseconds(timings[i]);
    }
  }
  digitalWrite(led, LOW);
  Serial.println("...sent");
  delay(15000);
}

W tablicy timings[] zawarte jest 50 kolejnych sygnałów powtarzających się cyklicznie w odebranym kodzie. Pomny doświadczeń z poprzednim dzwonkiem dałem na początek bardzo dużą liczbę powtórzeń - 30 razy (zmienna "licz"). Doświadczalnie ustaliłem potem, że liczba 15 powtórzeń gwarantuje pewność zadziałania dzwonka

Kod zadziałał prawie natychmiast - musiałem tylko jedną daną z tabeli sygnałów z początku przesunąć na koniec. Tym sposobem "odwróciłem" fazę nadawanego sygnału bo pierwotna była zła.

Niestety wysyłanie do dzwonka 'standardowych" kodów biblioteką rc-switch.h zakończyło sie niepowodzeniem. Urządzenie nie reaguje na żaden kod o identycznych lub zbliżonych parametrach. A szkoda bo konstrukcyjnie i estetycznie jest to najładniej wykonany dzwonek

Trzeci dzwonek mogę połowicznie uznać za pokonany. Nie ma żadnego problemy by uruchamiać dzwonek powyższym fragmentem programu. Co więcej program ten mogę stosować dla wszystkich nietypowych urządzeń zmieniając jedynie zawartość tablicy kodów. Nie umiem niestety prawidłowo zdekodować kodu nadawanego przez przycisk w taki sposób by dało się to łatwo zaprogramować w programie Routera 433. A więc remis 1:1

Przydatne linki
http://pastebin.com/5YgMbh2u  //wszystkoczytający monitor
https://www.reddit.com/r/arduino/comments/2pgznb/capturing_rf_signals_without_sdr_hardware/

jakiś ciąg dalszy pewnie wystąpi ale czy będzie on dotyczył łamania kodów ? sie zobaczy
120

6 komentarzy:

  1. ale który pin do nadajnika? Ledem wysyłasz kody?

    OdpowiedzUsuń
  2. Witam w szkicu jest polecenie PIND arduino wyrzuca błąd co powinienem zrobić z tym faktem. Szukałem ale brak wyników

    OdpowiedzUsuń
    Odpowiedzi
    1. tu wstawiasz nazwę portu którym odbierasz sygnał na swoim mikrokontrolerze
      Ja dla ESP8266 wstawiłem tu digitalRead(12)

      Usuń
    2. tu masz ten kod dla Arduino
      https://forum.arduino.cc/t/tchibo-wetterstation-433-mhz-dekodierung-mal-ganz-einfach/133637

      Usuń
  3. W jaki sposób zamienić RAW data na kod binarny?

    OdpowiedzUsuń
    Odpowiedzi
    1. już nie pamiętam jak to robiłem - może jest gdzieś w innych wpisach
      Najłatwiej wstawić program czytający RAW znanego kodu i zobaczyć jak zakodowane są "0" i "1"

      Usuń