Ankündigung

Einklappen
Keine Ankündigung bisher.

eKey Fingerscanner per RS485 auslesen: Protokollanalyse

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #61
    Die Geschichte läuft bei mir seit einigen Monaten stabil und erfüllt unsere Anforderungen. Konkret sieht's so aus: AVR (Türknoten) hört auf der RS485 mit, extrahiert den Fingerhash und verschickt diesen auf CAN. Der Garagenknoten kennt die Liste der Ringfinger-Fingerhashes, und wenn er einen davon sieht, betätigt er den Öffner. Parallel geht der CAN-Traffic zum Raspberry zwecks Logging und Sprachansage ala "Der Uwe kommt nach Hause."
    Für diesen Use-Case genügt es, den Fingerhash zu extrahieren (siehe mein Posting vom 15.10.). Das der Fingerhash eine CRC ist und wo im Originaldatenstrom User und Finger liegen, ist nur von Interesse, wenn man noch weiter forschen will.
    Was ich bisher nicht geschafft hab (aber auch nicht mehr weiter verfolge) ist die Information "Finger abgelehnt" rauszufischen. Der Original-UDP-Konverter kann das offenbar, aber ich hatte irgendwann aufgegeben. Hab noch einige Tage Tracedaten vorrätig, falls jemand weiter analysieren will ;-)
    Die Lösung hat den schon diskutierten Nachteil, dass beim "Garagenfinger" auch das original verkabelte Türschloss mit geöffnet wird, und je nach Windrichtung die Haustür öffnet oder auch nicht. Aber daran haben sich alle schnell gewöhnt und wir kommen sehr gut klar damit.

    Hier der Quellcode des Decoders. Jedes empfangene Byte muss an die Funktion keyDec_receivedByte() übergeben werden. Bei erkanntem Finger werden die ekeyFingerOkTimer und message_HAUSTUER1 befüllt. Diverse Debugging-Ausgaben und -Zähler sind noch enthalten, werden für die Funktionalität nicht benötigt.
    Code:
    #include <avr/io.h>
    #include <stdio.h>
    #include <avr/pgmspace.h>
    #include <avr/interrupt.h>
    
    #include "board.h"
    #include "globals.h"
    #include "can_def.h"
    #include "Can_Appl.h"
    #include "house_events.h"
    #include "ekey_decoder.h"
    #include "uart.h"
    
    #define setInfo(x)
    
    uint8_t nDecoderState;
    uint8_t iDecoder;
    uint8_t DEC_Length;
    uint8_t DEC_Buffer[DEC_BUFFER_MAX];
    uint16_t ekey_nFingerCounter;
    uint16_t ekey_nFrameCounter;
    uint8_t ekeyFingerOkTimer;
    
    void DEC_Unstuffing(void) {
     uint16_t k;
     uint16_t i;
     uint8_t blMove;
     //DEBUG_PA1_ON();
     /* Byte-Stuffing rückgängig machen. Zum Transport wurden die Daten aufgeblasen, um das Auftreten der Beginn- und Endekennung
        innerhalb der Nutzdaten zu vermeiden:
          02 --> 3F 41
          03 --> 3F 81
          3F --> 3F C1 */
     /* Gehen wir mal davon aus, dass im Addressierungsteil (Index 0 bis 14) kein Byte-Stuffing verwendet wird. Das spart hier
        etwas Zeit zum Durchlaufen. */
     if (DEC_Length<=15) {
      //DEBUG_PA1_OFF();
      /* bis hierhin haben wir nur 2µs verbracht */
      return;
     }
    
     k=15;
     while (1) {
             if (DEC_Buffer[k]==0x3F) {
               blMove=0;
               switch (DEC_Buffer[k+1]) {
                 case 0x41: DEC_Buffer[k]=0x02; blMove=1; break;
                 case 0x81: DEC_Buffer[k]=0x03; blMove=1; break;
                 case 0xC1: DEC_Buffer[k]=0x3F; blMove=1; break;
                 /* Default: Falls irgend etwas anderes der 3F folgt, dann scheint die 3F ein normales Datenbyte zu sein --> kein Unstuffing. */
               }
               if (blMove) {
                     //DEBUG_PA1_OFF();
                     //DEBUG_PA1_ON();
                     /* Wir müssen unstuffen -->
                            - Das Byte an Index k+1 fällt weg.
                            - Alles nachfolgende nach links ranrutschen.
                            - Die Länge verringert sich um eins. */
                     for (i=k+1; i<DEC_Length; i++) {
                       DEC_Buffer[i]=DEC_Buffer[i+1];
                     }
                     DEC_Length--;
               }
             }
             k++;
             if (k>=DEC_Length) {
               //DEBUG_PA1_OFF();
               /* bis hierhin haben wir
                    - 15..20µs: Request ohne unstuffing
                    - 20..30µs: Request mit ein bis zweimaligem Unstuffing */
               return;
             }
     }
    }
    
    void DEC_frameReceived(void) {
      message_HAUSTUER2.s.ekeyFrameCounter++;
      /* Plausibilisierungen */
      if (DEC_Buffer[0]!=0x02) {
        /* Anfang falsch */
        //message_EKEY_DEBUG01.s.cnt_wrongStartOfFrame++;
      }
      if (DEC_Buffer[DEC_Length-1]!=0x03) {
        /* Ende falsch */
        message_EKEY_DEBUG02.s.cnt_wrongEndOfFrame++;
        if (DEC_Buffer[DEC_Length-3]==0x03) message_EKEY_DEBUG02.s.cnt_H++;
        if (DEC_Buffer[DEC_Length-2]==0x03) message_EKEY_DEBUG02.s.cnt_J++;
        if (DEC_Buffer[DEC_Length-0]==0x03) message_EKEY_DEBUG02.s.cnt_K++;
      }
    
      message_EKEY_DEBUG02.s.cnt_L = uart_cnt_dataoverrun;
    
      DEC_Unstuffing();
      if (DEC_Length == 0x10) {
        message_EKEY_DEBUG01.s.cnt_len_0x10++;
      } else if (DEC_Length == 0x1E) {
        message_EKEY_DEBUG01.s.cnt_len_0x1E++;
      } else if (DEC_Length == 0x1F) {
        message_EKEY_DEBUG01.s.cnt_len_0x1F++;
      } else if (DEC_Length == 0x56) {
        message_EKEY_DEBUG01.s.cnt_len_0x56++;
      } else{
        message_EKEY_DEBUG01.s.cnt_D=DEC_Length;
      }
    
      if (DEC_Length == 47) {
        ekeyFingerOkTimer=200; /* 200*5ms = 1 Sekunde "aktiv" melden */
        message_HAUSTUER1.s.ekeyFingerCounter++;
        message_HAUSTUER1.s.ekeyFingerHash=DEC_Buffer[17];
        message_EKEY_FINGER_HIST.s.history[7]=message_EKEY_FINGER_HIST.s.history[6];
        message_EKEY_FINGER_HIST.s.history[6]=message_EKEY_FINGER_HIST.s.history[5];
        message_EKEY_FINGER_HIST.s.history[5]=message_EKEY_FINGER_HIST.s.history[4];
        message_EKEY_FINGER_HIST.s.history[4]=message_EKEY_FINGER_HIST.s.history[3];
        message_EKEY_FINGER_HIST.s.history[3]=message_EKEY_FINGER_HIST.s.history[2];
        message_EKEY_FINGER_HIST.s.history[2]=message_EKEY_FINGER_HIST.s.history[1];
        message_EKEY_FINGER_HIST.s.history[1]=message_EKEY_FINGER_HIST.s.history[0];
        message_EKEY_FINGER_HIST.s.history[0]=DEC_Buffer[17];
      }
    }
    
    void ekeyDec_receivedByte(uint8_t n) {
      uart_transmitByte(n);
    
      switch (nDecoderState) {
        case DEC_WaitingForStart:
                    if (n == 2) {
                        nDecoderState = DEC_WaitingForLength;
                        DEC_Buffer[0] = n;
                        setInfo("Waiting for length");
                        DEBUG_PA0_ON();
                    }
                    break;
        case DEC_WaitingForLength:
                    // Längenbyte ist angekommen. Die eigentliche Länge
                    // der Nutzdaten ist (n-1)/4.
                    // Weitere Teile der Längeninformation stecken im nächsten Byte.
                    DEC_Length = (n - 1) >> 2;
                    // Zusätzlich zur Nutzdatenlänge wollen wir noch "StartOfFrame" und
                    // Längenbyte im Trace haben --> zwei Byte mehr.
                    DEC_Length = DEC_Length + 2;
                    nDecoderState = DEC_WaitingForLengthExtension;
                    DEC_Buffer[1] = n;
                    setInfo("Waiting for LengthExtension");
                    break;
       case DEC_WaitingForLengthExtension:
                    // Zweites Längenbyte ist angekommen. Bit 0 bedeutet 64.
                    // Ob Bit 1 dann 128 bedeutet ist noch nicht klar.
                    if (n & 1) { DEC_Length = DEC_Length + 64; }
                    nDecoderState = DEC_WaitingForContent;
                    DEC_Buffer[2] = n;
                    setInfo("Waiting for " & DEC_Length & " Bytes")
                    iDecoder = 3;
                    break;
       case DEC_WaitingForContent:
                    DEC_Buffer[iDecoder] = n;
                    iDecoder++;
                    setInfo("Received " & i & " bytes");
                    if (iDecoder == DEC_Length) {
                      DEC_frameReceived();
                      nDecoderState = DEC_WaitingForStart;
                      DEBUG_PA0_OFF();
                    }
                    break;
      default:
        setInfo("wrong state");
        nDecoderState = DEC_WaitingForStart;
      }
    
    }
    Und das Headerfile:
    Code:
    #define DEC_BUFFER_MAX 200 /* Puffergröße für empfangene RS485 Frames */
    
    #define DEC_WaitingForStart 1
    #define DEC_WaitingForLength 2
    #define DEC_WaitingForLengthExtension 3
    #define DEC_WaitingForContent 4
    extern uint8_t nDecoderState;
    
    
    extern uint8_t DEC_Buffer[DEC_BUFFER_MAX];
    
    extern void ekeyDec_receivedByte(uint8_t c);
    extern uint8_t ekeyFingerOkTimer;
    Zuletzt geändert von UweH; 05.05.2015, 20:12.

    Kommentar


      #62
      Zitat von UweH Beitrag anzeigen
      Die Geschichte läuft bei mir seit einigen Monaten stabil und erfüllt unsere Anforderungen. Konkret sieht's so aus: AVR (Türknoten) hört auf der RS485 mit, extrahiert den Fingerhash und verschickt diesen auf CAN. Der Garagenknoten kennt die Liste der Ringfinger-Fingerhashes, und wenn er einen davon sieht, betätigt er den Öffner. Parallel geht der CAN-Traffic zum Raspberry zwecks Logging und Sprachansage ala "Der Uwe kommt nach Hause."
      Das wäre so die Funktionalität, die mir auch reichen würde. Nur ist es bei mir KNX statt CAN.

      Für diesen Use-Case genügt es, den Fingerhash zu extrahieren (siehe mein Posting vom 15.10.). Das der Fingerhash eine CRC ist und wo im Originaldatenstrom User und Finger liegen, ist nur von Interesse, wenn man noch weiter forschen will.
      So wie ich deinen Code beim überfliegen verstanden habe, ist der "generisch", d.h. keine system- oder fingerspezifischen "Spezialanpassungen" bzw. hardcodierten Werte?!
      Muss mir da mal in Ruhe den Code noch anschauen und anfangen den zu portieren (Java).

      Was ich bisher nicht geschafft hab (aber auch nicht mehr weiter verfolge) ist die Information "Finger abgelehnt" rauszufischen. Der Original-UDP-Konverter kann das offenbar, aber ich hatte irgendwann aufgegeben. Hab noch einige Tage Tracedaten vorrätig, falls jemand weiter analysieren will ;-)
      Ja, schön wäre es wenn man abgelehnte Finger erkennen könnte. Aber wirklich notwendig ist es nicht.

      Die Lösung hat den schon diskutierten Nachteil, dass beim "Garagenfinger" auch das original verkabelte Türschloss mit geöffnet wird, und je nach Windrichtung die Haustür öffnet oder auch nicht. Aber daran haben sich alle schnell gewöhnt und wir kommen sehr gut klar damit.
      Da komm ich nicht mit. Hast du eine 1-Relais-Variante?
      Ich kann Finger 1 auf Relais 1 setzen (Türöffner) und Finger 2 auf Relais 2 (noch nicht in Verwendung. Aber wohl als Dummy-Ziel einsetzbar um den Finger dann anderweitig etwas triggern zu lassen).

      Bei der 1-Relais-Variante könntest du ja den Relais-Ausgang "offen" lassen und mit deinem CAN-Empfänger selbst entscheiden: Garagenfinger? --> Relais/Ausgang für Garage triggern... Türfinger? ---> Relais/Ausgang für Türöffner triggern.

      Gruß
      Alex

      Kommentar


        #63
        Hab deinen Code mal nach Java portiert und meinen alten Trace rein gefüttert. Damit bekomme ich nun wie von dir damals erkannt den Fingerhash 0x68 und 0x05.

        Werden den Code dann mal noch in passende Form bringen (der Vergleichbarkeit wegen folgt das ganze noch dem C-Stil statt den Java Code Conventions) und bei mir den eKey anzapfen und den täglichen Betrieb mal mitloggen.

        Wäre zwar schön wenn man die Fingerzugehörigkeit anhand "User-Nr" und "Finger-Nr" herstellen könnte. Aber für diese günstige Lösung ist es "okay" wenn man einen "Einlernmodus" hat wo man den Finger drüber zieht und schaut welcher Fingerhash daraus resultiert. Muss mir eh noch eine Tabelle anlagen wo ich Benutzer, Finger und auszulösendes Relais notiere. Dann kann ich auch gleich noch den Finger-Hash eintragen.

        Ziel wird es bei mir nun sein eine Java-Anwendung daraus zu machen, die den Fingerhash auf den KNX Bus auf eine konfigurierbare Gruppenaddresse schickt. Und wenn zum Fingerhash noch ein Name hinterlegt ist, dann noch den Namen auf den Bus schicken.

        An dieser Stelle also nochmal ein dickes DANKE an UweH für die wirklich tolle Analyse.

        Kommentar


          #64
          Super Sache. Mein Tool scheint zu funktionieren:

          2015-05-06 17:56:18.352 INFO [main] de.root1.ekeydecoder.Ekey.main: Running ...
          2015-05-06 17:56:18.551 INFO [main] de.root1.ekeydecoder.Ekey.main: Using Socket-Mode: '192.168.200.4:4001'
          2015-05-06 17:56:18.896 WARNING [EkeyDecoder] de.root1.ekeydecoder.EkeyDecoder.frameReceived: tail wrong
          2015-05-06 17:56:58.700 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Fingerhash received: 0x05
          2015-05-06 17:56:58.724 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Sent fingerhash 0x05 to 4/0/0
          2015-05-06 17:56:58.726 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Fingerhash [0x05] resolves to 'Alex[ZF links]'
          2015-05-06 17:56:58.731 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Send string '05h/Alex[ZF li' to 4/0/1
          2015-05-06 17:57:04.563 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Fingerhash received: 0x68
          2015-05-06 17:57:04.568 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Sent fingerhash 0x68 to 4/0/0
          2015-05-06 17:57:04.572 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Fingerhash [0x68] resolves to 'Alex[ZF rechts]'
          2015-05-06 17:57:04.578 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Send string '68h/Alex[ZF re' to 4/0/1
          2015-05-06 18:27:42.814 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Fingerhash received: 0x05
          2015-05-06 18:27:42.820 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Sent fingerhash 0x05 to 4/0/0
          2015-05-06 18:27:42.824 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Fingerhash [0x05] resolves to 'Alex[ZF links]'
          2015-05-06 18:27:42.828 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Send string '05h/Alex[ZF li' to 4/0/1
          2015-05-06 18:28:47.477 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Fingerhash received: 0x05
          2015-05-06 18:28:47.482 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Sent fingerhash 0x05 to 4/0/0
          2015-05-06 18:28:47.484 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Fingerhash [0x05] resolves to 'Alex[ZF links]'
          2015-05-06 18:28:47.490 INFO [EkeyDecoder] de.root1.ekeydecoder.Ekey$3.fingerhashReceived: Send string '05h/Alex[ZF li' to 4/0/1
          Wie man sieht, auch gleich mit KNX Anbindung ;-)

          UweH
          In der Anleitung zum eKey wird empfohlen die Finger auf mehreren Speicherplätzen abzulegen um die Erkennungsrate zu erhöhen.
          Aktuell hab ich das auch so gemacht. Aber das würde sich ja mit der Erkennung beissen. Das wäre ja nicht so schlimm wenn ich für jeden Speicherplatz des Zeigefingers den Fingerhash kennen würde. Aber da fängts dann an kompliziert zu werden.
          Hast du dich auf einen Speicherplatz pro Finger beschränkt? Wie verhält sich das bei dir mit der Erkennungsrate? Trotzdem "top"?

          Gruß
          Alex

          Kommentar


            #65
            Zitat von tuxedo Beitrag anzeigen
            Da komm ich nicht mit. Hast du eine 1-Relais-Variante?
            Genau.
            Zitat von tuxedo Beitrag anzeigen
            Bei der 1-Relais-Variante könntest du ja den Relais-Ausgang "offen" lassen und mit deinem CAN-Empfänger selbst entscheiden: Garagenfinger? --> Relais/Ausgang für Garage triggern... Türfinger? ---> Relais/Ausgang für Türöffner triggern.
            Im Prinzip schon, aber ich wollte die Kernfunktion "Haustür öffnen" möglichst autark ohne Einbeziehen der "Spielereien" laufen lassen. Es ist nicht so, dass ich der Elektronik grundsätzlich misstraue, aber mit der Anzahl der beteiligten Komponenten steigt halt auch die Ausfallwahrscheinlichkeit.

            Kommentar


              #66
              Zitat von tuxedo Beitrag anzeigen
              Super Sache. Mein Tool scheint zu funktionieren:
              Gratulation!
              Zitat von tuxedo Beitrag anzeigen
              In der Anleitung zum eKey wird empfohlen die Finger auf mehreren Speicherplätzen abzulegen um die Erkennungsrate zu erhöhen.
              Aktuell hab ich das auch so gemacht. Aber das würde sich ja mit der Erkennung beissen.
              Beissen nicht. Die Zuordnungstabelle o.ä. zur Auswertung wird halt größer. Zur Vorausberechnung der 10 Finger * 100 User = 1000 Fingerhashes hab ich im Oktober mal ein Codeschnipsel gepostet. Dort die Installationskonstante anpassen, und aus der Liste dann die Fingerhashes raussuchen. Oder, wenn die Laufzeit keine Rolle spielt, die Liste jedesmal zur Laufzeit durchlaufen und bei einem Treffer hat man dann gleich Finger und User. (Aber Vorsicht mit den Mehrdeutigkeiten, siehe Posting vom Herbst.)

              Zitat von tuxedo Beitrag anzeigen
              Hast du dich auf einen Speicherplatz pro Finger beschränkt? Wie verhält sich das bei dir mit der Erkennungsrate? Trotzdem "top"?
              Ja, bei 4 Leuten sind das schon 'ne Menge Finger ;-)
              Die Erkennungsrate ist "erträglich", in der Zwischenzeit haben wir den Dreh ganz gut raus, ich schätze 90% werden beim ersten Versuch erkannt. Beispiel: Schweißfeuchte Finger nach der Jogging-Runde --> kurz über den Finger pusten --> geht. Oder im Winter ausgetrocknete Haut --> kurz auf die Zunge tippen und an der Hose abstreifen --> geht. Ich weiß, vielleicht nicht jedermanns Sache ;-)


              Kommentar


                #67
                Hallo UweH, hallo tuxedo,

                vielen Dank für Eure Forschungen - bei mir geht's jetzt auch weiter in Richtung eKey. Noch habe ich das ganze nicht am Laufen, aber ich würde dann gern recht bald auch die Anbindung ans WireGate bzw. KNX angehen. Ich überlege nur, mit welcher Programmiersprache ich da am sinnvollsten dran gehe...

                Viele Grüße

                Dirk
                Baubeginn: 1676d. Sanierungsbeginn: 6/2010. Einzug: 9/2014. Fertig? Nie ;-)

                Kommentar


                  #68
                  Auf dem Wiregate kannst du ja normalerweise auch Java laufen lassen, und somit mein Tool. Musst das Rad ja nicht neu erfinden.

                  Gruß
                  Alex

                  P.S. Meld dich per PM wenn du eine Vorab-Testversion haben willst.
                  Zuletzt geändert von tuxedo; 09.05.2015, 09:07.

                  Kommentar


                    #69
                    Und, Dirk, wie schaut's aus bei dir?

                    Mir ist da eben noch ein nettes Feature eingefallen:

                    Ein KNX-steuerbaren "Lernmodus": Eine 14-byte-String basierte GA:

                    Sendet man einen beliebigen Text/Namen an diese GA, so werden alle Fingerhashes die von nun an erkannt werden, mit diesem Text/Namen versehen (dauerhaft gespeichert).
                    Sendet man den Text "OFF" an die GA, so schaltet man den Lern-Modus wieder aus.
                    Namen löschen mit "leerem String".

                    Damit ließe sich das ganze bequem über eine Visu steuern/anlernen und man müsste nicht selbst in irgendwelchen Files herumhantieren oder sich sonst irgendwo die Namenszuordnung speichern.

                    Das einzige das man noch "manuell" konfigurieren muss wären dann initiell die Gruppenadressen...

                    Kommentar


                      #70
                      Ein Python Plugin für Smarthome.py wäre genial
                      Tuxedo - wirst du die Java Version hier bereit stellen? Wäre schon mal ein super Ansatz, dann würd ich doch mal den seriellen Adapter ordern..

                      Kommentar


                        #71
                        Mein Programm läuft, nach einigen Änderungen, jetzt seit 3 Tagen ohne Fehler.
                        Wenn bis Montag keine gravierenden Fehler mehr auftreten werde ich es online stellen.

                        Die Adapter kosten ja keine 3EUR. Da kannst du auf jeden Fall einen ordern ;-) Hab bereits drei von denen hier: http://www.ebay.de/itm/PL2303HX-Chip...item19f8a87d33

                        Funktionieren prima. Nur muss man ein wenig tricksen wenn man mehr als einen davon gleichzeitig an einem Linux-System betreiben will.

                        Kommentar


                          #72
                          So, der ekey multi / Integra ist installiert und funktioniert sehr gut (bis auf das Problem, dass das Fuhr 881 erst beim dritten Versuch die Falle öffnet... ). Und der billige Adapter ist auch aus China angekommen.
                          Wie gehts aus Euer Sicht am besten weiter? Adapter ans Windows 7 Notebook um Datenpakete zu sniffen? Oder gleich ans Wiregate, das hoffentlich irgendwann die Auswertung übernimmt?
                          Baubeginn: 1676d. Sanierungsbeginn: 6/2010. Einzug: 9/2014. Fertig? Nie ;-)

                          Kommentar


                            #73
                            (gelöscht... falsches Fenster... irgendwie kann ich den Beitrag nicht löschen...)
                            Baubeginn: 1676d. Sanierungsbeginn: 6/2010. Einzug: 9/2014. Fertig? Nie ;-)

                            Kommentar


                              #74
                              Servus Dirk,

                              Wie gehts aus Euer Sicht am besten weiter? Adapter ans Windows 7 Notebook um Datenpakete zu sniffen? Oder gleich ans Wiregate, das hoffentlich irgendwann die Auswertung übernimmt?
                              Ich versteh dich nicht. Warum willst du nochmal sniffen? Das Protokoll ist doch bereits soweit entschlüsselt, als dass man den Zugang schon herauslesen kann...

                              Entweder du bastelst dir anhand der Infos hier im Thread etwas eigenes (wobei Uwe ja schon den Löwenanteil erledigt und nahezu 1:1 verwendbaren Sourcecode gepostet hat), oder du setzt auf etwas schon vorhandenes... Hier hatte ich dir ja schon ein Tool angeboten. Einen RS485 Adapter hast du ja schon. Fehlt zum test nur noch Java und ein beliebiger Rechner (Windows, Linux), sowie die Annahme meines Angebots mein Tool zu testen...

                              Hab dir das ganze mal zusammengezippt:

                              http://denbh000.dyn.root1.de/public/ekey-decoder.zip


                              Für Linux liegt auch ein Test-Script zum starten bei.

                              Es gibt drei Konfigurationsdateien:

                              knx.properties:
                              Weitgehend selbsterklärend: Hier geht's um die KNX Adressen die verwendet werden

                              finger.properties:
                              Hier trägst du die Finger-Hash-Werte ein und gibst denen Namen. Wenn du den Namen nicht auf dem Bus brauchst und anderweitig eine Zuordnung triffst, kannst du das weglassen.

                              log.properties:
                              Konfiguriert das Logging. Ist aktuell noch auf exzessives Logging eingestellt um etwaige Fehler besser analysieren zu können. Kann bei Bedarf angepasst/geschrumpft werden.


                              Es gibt drei mögliche Startparameter:

                              Code:
                              ekey-decoder$ java -jar ekey-decoder-1.0.0-SNAPSHOT-jar-with-dependencies.jar
                              Please specify logfile by passing '-Djava.util.logging.config.file=<logconfig-file>' to JVM
                              2015-05-18 09:47:16.939 INFO [main] de.root1.ekeydecoder.Ekey.main: Running ...
                              insufficient arguments.
                              need: -device /dev/<device>
                              or: -socket <host>:<port>
                              or: -file <dumpfile>
                              Entweder du hast einen Moxa-Adapter oder ser2net, dann nimmst du "socket" und gibst Host und Port an (so hab ich's bei mir laufen).
                              Oder du hast den USB-Adapter direkt am Rechner angesteckt. Dann gibst du entweder z.B. "-device /dev/ttyUSB0" (unter Linux) oder "-device COM3" (unter Windows) an. Muss gestehen dass ich mangels Windows, letzteres nicht direkt getestet habe. Sollte aber funktionieren.
                              Oder du hast die Daten schonmal gesnifft und in ein Dumpfile gespeichert, dann kannst du das Dump-File nochmal mit dem Tool durchspielen.

                              Bei mir läuft das nun seit Tagen fehlerfrei. Was es aber noch zu implementieren gibt:

                              * Automatischer reconnect falls es mit dem Datenstrom ein Problem gibt (Adapter mal kurz rausgezogen oder Netzwerkverbindung kurz tot)
                              * Lern-Modus, so wie ich ihn in einem meiner letzten Beiträge beschrieben hab

                              Gruß
                              Alex

                              Kommentar


                                #75
                                Moin Alex,

                                ganz herzlichen Dank für Deine lange Erklärung! Das hilft sicher nicht nur mir weiter.

                                Das mit dem Sniffen hatte ich nur vorgeschlagen, falls Uwe noch Material zum CRC-Rumrechnen braucht . Und natürlich werde ich Dein Programm ausprobieren und Rückmeldung geben wie es läuft - das Rad zweimal erfinden macht keinen Sinn. Gerade hat sich allerdings mal wieder etwas anderes in der Prio vorgedrängt, ich hoffe dass ich am Wochenende die ersten Experimente machen kann.

                                Viele Grüße

                                Dirk
                                Baubeginn: 1676d. Sanierungsbeginn: 6/2010. Einzug: 9/2014. Fertig? Nie ;-)

                                Kommentar

                                Lädt...
                                X