Für diese vielen Anregungen und Fragen habe ich wilm veröffentlicht. Sonst koche ich nur im "eigenen Saft".
@PeterPawn: Code-Review ist vielleicht hart für den Programmierer, bringt aber sehr viel.
PeterPawn schrieb:
bis hin zum "ETag"-Header
ETag hatte ich völlig aus den Augen verloren. Allerdings scheint insgesamt in der UPnP-Kommunikation wohl nur die IP-Adresse des Aktuators von Interesse zu sein. Als ich dort mal eine fehlerhafte MAC-Adresse angegeben hatte, war dies kein Hinderungsgrund für eine saubere Kommunikation über Port 2002.
PeterPawn schrieb:
Oder bist Du Dir tatsächlich schon sicher, daß es (auch wenn man das GUI dann ausschweifend/in vollem Umfang nutzt) keine weitere Kommunikation jenseits von Port 2002 zwischen FRITZ!Box und "Aktor" mehr gibt
In der Flut der zu analysierenden Pakete verlor ich am Anfang schnell die Übersicht und programmierte eine NetzwerkBridge mit der pcap-Lib, mit der ich bestimmte Pakete einzeln durchlassen und sperren konnte. Ich reduzierte solange die Durchlässigkeit, bis der SmartHome-Bereich der 546E keine Funktion mehr hatte. So konnte ich leicht relevante Pakete von unwichtigen trennen, ohne dass ich etwas über deren genaue Funktionsweise wissen musste. Daher bin ich mir sehr sicher, dass -einmal aufgebaut- nur die Kommunikation über Port 2002 relevant ist. Natürlich habe ich nur meine Konfiguration (nur eine Fritzbox) getestet, aber ich habe schon ziemlich ausgiebig im GUI herumgespielt. Es bleibt natürlich immer eine kleine Restunsicherheit, ob ich tatsächlich alles erwischt habe...
PeterPawn schrieb:
Wenn Du nicht tatsächlich nur selbst analysieren willst, solltest Du die von Dir getätigten Mitschnitte der Kommunikation auf Port 2002 irgendwo ablegen
Das werde ich machen. Ich finde aber nur noch
einen alten Mitschnitt. Benötigte gleichartige Mitschnitte, um Unterschiede und Gleichheiten rauszuarbeiten, sind momentan leider nicht auffindbar. Eventuell muss ich neue machen, was aber umfangreiche Umbauarbeiten zur Folge hätte.
Die Analyse der verschiedenen Kommandos im binären Datenstrom (jeweils an Index 0 = Pakettypen) ist zugegebenermaßen ohne Beispieldaten für Dritte nahezu unmöglich. Wo es zur erfolgreichen Kommunikation (aus meiner bisherigen Sicht) nicht notwendig war den Input der Fritzbox zu unterscheiden, habe ich ihn im Code total unterschlagen. Der Code sollte ja auch keine Doku sein, sondern nur zeigen, dass das Nachbilden der Kommunikation möglich ist.
In einem nächsten Schritt sollte man den Input vollständig abprüfen, um Sicherheit zu bekommen, dass nicht ungesehen etwas anderes als erwarten angefordert wird.
Mit der von AVM veröffentlichen Tabelle der functionbitmask aus dem AHA-HTTP-Interface konnte ich das Bit für die Temperatur-Kommunikation raten.
Einige Parameter der Read values-Kommandos (Pakettyp 7), die zusätzlich auch im Conf-Kommando (Pakettyp 5) eingebettet sind, sind für mich in der Bedeutung noch unklar. Veränderungen dort führen auch zu ungeahnten Problemen. Die dortige Funktion append_var() ist sicherlich keine Glanzleistung, bildet aber zuverlässig den Datenstrom ab, den ich sehe.
Hier schon einmal kommentierte Daten im ASCII-Format:
Code:
Beschreibung des binären Protokolls über Port 2002
==================================================
- Grundsätzlich kommen alle Kommandos von der Fritzbox, der Aktuator reagiert nur.
- Von dieser Regel gibt es zwei Ausnahmen:
1. Alle 30 Sekunden werden zyklisch alle Stati des Aktuators gesendet.
2. Bei Änderung am Taster des Aktuators wird sofort dessen Status gesendet.
Alle binären Pakete - egal in welcher Richtung - haben den gleichen Rahmen.
kk Kommando bisher gesehen: 00-0a
03 vermutlich Version des binären Protokolls
nn nn Gesamtlänge des Paketes inklusive Kommandotyp, Version, Gesamtlänge und Daten
dd .. Daten beliebiger Länge (eventuell noch weitere Bytes der Daten noch zum Rahmen)
Es können mehrere Pakete zusammen übertragen oder einzelne zerschnitten werden.
Folgende Kommandos wurden gesichtet:
init_do 00 Box erstes Kommande, vermutlich Initialisierung
init_re 01 Actor Antwort auf Initialisierung
drei_no 03 Box ??? mehrfach
conf_do 05 Box Aufforderung zum Senden der Konfiguration
conf_re 06 Actor Senden der Konfiguration
var 07 Box + Actor Übermitteln von variablen Werten: Schalterstellung, Verbrauchsgröße, Temperatur
ping 08 Box + Actor alle 22 Sekunden ping, der direkt beantwortet wird
start_no 09 Box ??? einmalig zu Beginn
name 0a Box neuer Name des Actuators
Dump eines Protokolls über Port 2002 (mit b: Fritzbox, a: 546E, in zeitlicher Reihenfolge)
------------------------------------
b: init_do 0003 000c 0000 0000 0002 2024 init_do
a: init_re 0103 0010 0000 0001 0000 0001 0002 2013 init_re
b: ping 0803 000c 0000 0000 0000 0001 ping 0 0 1
a: ping 0803 000c 0000 0000 0000 0001 ping 0 0 1
b: drei_no 0303 0010 0000 0001 0000 0002 0000 0000 drei_no 2 0
b: conf_do 0503 000c 0000 0001 0000 0000 conf_do
a: conf_re (0603 0148 0000 0001 0000 0000 0000 0000 conf_re
03e8 0200 id, {???}
0000 0002 Modell/productname 2: Powerline546E
0000 1280 functionbitmask
576f 686e 7a69 6d6d 6572 5f32 0000 0000 0000 0000 FriendlyName: "Wohnzimmer"
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0b74 manufacturer 0b74: AVM
xxxx 3axx xx3a xxxx 3axx xx3a xxxx 3axx xx00 0000 AIN/identifier: "xx:xx:xx:xx:xx:xx"
3036 2e35 3000 0000 0000 0000 0000 0000 0000 0000 fwversion: "06.50"
0000 0000 0000 0002 {???}
03e8 0000 id, {???}
0000 00a0)[Anzahl:168 +160=0x148] Länge
(0000 000f 0004 0000 0000 0001 var 0f := 1 Relais 0/1
0000 0023 0008 0000 0000 ffff var 23 := ffff,0
0000 0000
0000 0025 0040 0000 0000 03e8 var 25 := 3e8,2,1,14,5,0,0,f,0,2,1,3,0,0,f,0
0000 0002
0000 0001
0000 0014
0000 0005
0000 0000
0000 0000
0000 000f
0000 0000
0000 0002
0000 0001
0000 0003
0000 0000
0000 0000
0000 000f
0000 0000
0000 0012 0004 0000 0000 0014 var 12 := 14 Strom A [/10000]
0000 0013 0004 0000 0003 9a7f var 13 := 39a7f Spannung V [/1000]
0000 0014 0004 0000 0000 0000 var 14 := 0 Leistung W [/100]
0000 0015 0004 0000 0002 06ba var 15 := 206ba Energie kWh [/1000]
0000 0016 0004 0000 ffff feec)[Anzahl:160 =0xa0] var 16 := fffffeec CosPhi [/1000] (-1...+1)
b: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 001a 0004 0000 0000 0078 var 1 1a := 78
b: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 001b 0004 0000 0000 0078 var 1 1b := 78
b: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 001c 0004 0000 0000 0078 var 1 1c := 78
b: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 001d 0004 0000 0000 0078 var 1 1d := 78
b: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 001e 0004 0000 0000 0078 var 1 1e := 78
b: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 0019 0004 0000 0000 0078 var 1 19 := 78
b: start_no 0903 0010 0000 0001 03e8 0000 fc00 0000 start_no
b: drei_no 0303 0010 0000 0001 0000 1280 03e8 0000 drei_no 1280 3e8
b: drei_no 0303 0010 0000 0001 0000 0002 0000 0000 drei_no 2 0
a: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 0012 0004 0000 0000 0014 var 1 12 := 14
a: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 0013 0004 0000 0003 99c2 var 1 13 := 399c2
a: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 0014 0004 0000 0000 0000 var 1 14 := 0
a: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 0015 0004 0000 0002 06ba var 1 15 := 206ba
a: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 0016 0004 0000 ffff fead var 1 16 := fffffead
a: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 000f 0004 0000 0000 0001 var 1 0f := 1
b: ping 0803 000c 0000 0001 0000 0002 ping 1 0 2
a: ping 0803 000c 0000 0000 0000 0002 ping 0 0 2
b: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 000f 0004 0000 0000 0000 var 1 0f := 0
a: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 000f 0004 0000 0000 0000 var 1 0f := 0
b: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 000f 0004 0000 0000 0001 var 1 0f := 1
a: var 0703 001c 0000 0001 03e8 0000 0000 000c 0000 000f 0004 0000 0000 0001 var 1 0f := 1
PeterPawn schrieb:
Nun stellt sich halt die Frage, was man damit/daraus machen will
Ich hatte nie ein großes Ziel vor Augen, sondern wurde nur von meinem Forscherdrang und dem für mich Machbaren getrieben. Dabei habe ich viel Neues gelernt, was für mich letztlich der Sinn des Ganzen war.