Forum: Mikrocontroller und Digitale Elektronik Funk Steckdosen Code dechiffrieren.


von David S. (elektro-david)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

Wir basteln im Moment ein kleines haus automatisierungssystem und 
wollten jetzt noch ganz simpel Funk Steckdosen hinzufügen!

Dazu haben wir dieses Set gekauft:
http://www.ebay.com/itm/300693889810

Wir wollen nun den Code den der kleine IC in der Funkverbedienung an 
sein Sende Modul schickt (1 Leitung) selber generieren und nur das Modul 
benutzen!

Ich habe dazu den Code mit Oszi aufgenommen, versteh aber nicht genau 
wie wir den "dechiffrieren" können… ich hab schon verschiedene Ansätze 
versucht..
Vor allem bleibt der erste Teil immer 100% identisch und nur die letzten
"12" Bits (?) ändern sich je nach Tastendruck.


Hier die Bilder (in ner kl zip.)
 vielleicht erkennt ja jemand von euch direkt was…

gruß David

von Nase (Gast)


Lesenswert?

Hallo,
gehe mal davon aus, daß am Anfang die Geräteadressen stehen und am Ende 
die Steuersequenz folgt. Wen Du mal Tante Google befragst, wirst Du 
Antworten auf Deine Fragen finden. Der Code liegt ziemlich offen.

VG. Uwe

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

einfach mal einen Empfänger aufmachen, dort sind meist IC's im 
DIL-Gehäuse drin, und dort findet sich auch ein Datenblatt nebst 
Übertragungscode.

Sascha

von c-hater (Gast)


Lesenswert?

David S. schrieb:

> Ich habe dazu den Code mit Oszi aufgenommen, versteh aber nicht genau
> wie wir den "dechiffrieren" können… ich hab schon verschiedene Ansätze
> versucht..
> Vor allem bleibt der erste Teil immer 100% identisch und nur die letzten
> "12" Bits (?) ändern sich je nach Tastendruck.

Der erste Teil ist einfach der Sync und die ID der Fernbedienung, der 
zweite Teil die Adresse der Steckdose, das Kommando und (wahrscheinlich) 
ein oder zwei Prüfbits.

Das ergibt sich aus der Überlegung, was zum Betrieb eines solchen 
Systems sinnvoll und nötig ist. Die Decodierung sollte sehr einfach 
sein.

"An" und "Aus" von derselben FB für dieselbe Steckdose wird nur sehr 
wenige Bits toggeln lassen, dabei ist ganz sicher das eine nötige 
Kommandobit und mindestens ein Prüfbit, sofern es welche gibt.

"An" für Steckdose1 und "an" für Steckdose2,3,4 derselben FB wird auch 
auch nur sehr wenige Bits togglen lassen, das Kommandobit wird aber 
nicht dabei sein. Das dürfte damit identifiziert sein und auch 
mindestens eins der Prüfbits. Aus der Betrachtung der restlichen Bits 
kann man leicht eine Vermutung über die Codierung der Steckdosenadresse 
ableiten. Insbesondere, wenn man dann auch noch das "alle an"-Kommando 
hinzunimmt. So viele Möglichkeiten gibt es ja nicht, in den wenigen 
verfügbaren Bits eine Geräteadresse zu codieren.

Vermutlich ist die ganze Sache manchestercodiert (oder was ähnliches 
selbsttaktendes), so daß das, was du als 12 "Bit" siehst, netto wohl nur 
sechs sind.
Wahrscheinlich ein Bit für's Kommando, drei oder vier Bit für die 
Steckdosenadresse und ein oder zwei Prüfbits.

von Holger W. (holgerw)


Lesenswert?


von David S. (elektro-david)


Lesenswert?

Hallo Leute,

danke für eure Tips, ich habe jetzt "dechiffriert" und zum laufen 
gebracht!!
Folgende Unterfunktion funktioniert (zumindest mit meinen) 
FunkSteckdosen,
wenn an 'radioPin' das Funkmodul angeschlossen wird!

Danke nochmal für eure Hilfe vielleicht bringt dem ein oder anderem der 
was ähnliches machen will mein Code etwas:
1
#define LOGIC_HIGH_DELAY_US 450
2
#define LOGIC_LOW_DELAY_US (3*LOGIC_HIGH_DELAY_US)
3
#define ENTIRE_START_SILENCE_DELAY_US 6750
4
5
void sendRemoteSignal(int number, bool turnOn)
6
{
7
    // remoteID ist eine Constante die mittels Oszilloskop ermittelt wurde.
8
    // nach der Start Sequenz werden die 2 RemoteID Bytes zunächst einmal normal
9
    // danach nochmals aber invertiert rausgeschickt.
10
    // INSGESAMT werden somit nach der Start & Silence Sequenz 5 Bytes geschickt wovon die ersten 4 immer Identisch sind.
11
    uint16_t remoteID = 0xB4AF;
12
    
13
    // ControlByte = Letztes Byte wird entsprechend aus Number und turnOn codiert:
14
    // die Nr (0-7) wird um 1 geshifftet; diese 4 Bits dann kopiert, invertiert und an die Stellen 4-7 im Controlbyte eingefügt
15
    // Das stellt Sieht dann so aus N für number Bit, n für invertiers number bit
16
    
17
    // controlByte : | nnn1,NNN0 |   <-- Das entspricht dem Komando zum Einschalten der Steckdose NNN
18
    byte controlByte = number<<1;
19
    controlByte = controlByte | (((~controlByte)<<4)&0xF0);
20
    
21
    // ~controlByte : | NNN0,nnn1 |   <-- Das entspricht dem Komando zum AUS-schalten der Steckdose NNN
22
    if (!turnOn) controlByte = ~controlByte;
23
    
24
    // START (Sync) SEQUENZ: 1010 -------------------------------------------------------------
25
    for (int i=0;i<2;i++){
26
        digitalWrite(radioPin, HIGH);
27
        delayMicroseconds(LOGIC_HIGH_DELAY_US);
28
        digitalWrite(radioPin, LOW);
29
        delayMicroseconds(LOGIC_HIGH_DELAY_US);
30
    }    
31
    // SILENCE SEQUENZ: 11111110000000 --------------------------------------------------------
32
    digitalWrite(radioPin, HIGH);
33
    delayMicroseconds(ENTIRE_START_SILENCE_DELAY_US/2);
34
    digitalWrite(radioPin, LOW);
35
    delayMicroseconds(ENTIRE_START_SILENCE_DELAY_US/2);
36
    
37
    // Standart Sequenz die sich nicht ändert (4 Bytes: 0xB4AF) in 2 for Schleifen ------------
38
    for (int i=15;i>=0;i--){
39
        digitalWrite(radioPin, HIGH);
40
        delayMicroseconds(LOGIC_HIGH_DELAY_US);
41
        digitalWrite(radioPin, LOW);
42
        
43
        if ((remoteID>>i)&0x0001){
44
            delayMicroseconds(LOGIC_HIGH_DELAY_US);
45
        }
46
        else {
47
            delayMicroseconds(LOGIC_LOW_DELAY_US);
48
        }
49
    }
50
    for (int i=15;i>=0;i--){
51
        digitalWrite(radioPin, HIGH);
52
        delayMicroseconds(LOGIC_HIGH_DELAY_US);
53
        digitalWrite(radioPin, LOW);
54
        if (!((remoteID>>i)&0x0001)){
55
            delayMicroseconds(LOGIC_HIGH_DELAY_US);
56
        }
57
        else {
58
            delayMicroseconds(LOGIC_LOW_DELAY_US);
59
        }
60
    }
61
    // ControlByte Codiert rausschicken ------------------------------------------------------
62
    for (int i=7;i>=0;i--){
63
        digitalWrite(radioPin, HIGH);
64
        delayMicroseconds(LOGIC_HIGH_DELAY_US);
65
        digitalWrite(radioPin, LOW);
66
        
67
        if ((controlByte>>i)&0x0001){
68
            delayMicroseconds(LOGIC_HIGH_DELAY_US);
69
        }
70
        else {
71
            delayMicroseconds(LOGIC_LOW_DELAY_US);
72
        }
73
    }
74
    
75
    // Zum Schluss: BIT einmal noch HIGH Setzten = ENDe --------------------------------------
76
    digitalWrite(radioPin, HIGH);
77
    delayMicroseconds(LOGIC_HIGH_DELAY_US);
78
    digitalWrite(radioPin, LOW);
79
    
80
}
81
82
// ___________________________________________________________________

von Harald W. (wilhelms)


Lesenswert?

Sascha Weber schrieb:

> einfach mal einen Empfänger aufmachen, dort sind meist IC's im
> DIL-Gehäuse drin, und dort findet sich auch ein Datenblatt nebst
> Übertragungscode.

Das innerhalb von Geräten Schaltpläne stecken, ist leider schon
vor vielen Jahrzehnten aus der Mode gekommen. :-(
Gruss
Harald

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.