kostenloser Webspace werbefrei: lima-city


HEX-Code über TCP/IP versenden

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Hallo!

    Ich sollte einen HEX-Code über TCP/IP an einen Server senden. Es muss nur dieser Code gesendet werden und ich will testen ob mein Java-Code falschi ist. Deshalb brauche ich ein Tool über das ich besagten Code als ASCII eingeben und dann an einen Server, dessen IP und Port ich kenne, senden kann.

    Danke!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. h**s

    schonmal mit Telnet, Tera Term oder Putty versucht ?
  4. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Jup, geht aber nicht. Ich habs derweil mit diesem Tool versucht und da wird der Code korrekt versendet:
    http://www.hw-group.com/products/hercules/index_en.html

    Leider kann ich den HEX-Code in Java nicht nachbauen um ihn von einem Server aus zu versenden.

    Ich sollte folgenden HEX-Code "AA1103010015" programmatikalisch in Java per TCP/IP an einen Server schicken.
    Anscheinend wird da aber immer ein Overhead oder leerer Code oder sonstwas eingefügt sodass der Server mit dem Kommando nix anfangen kann... Ich hab viele Tutorials und Converter durchprobiert und es sah stellenweise in Wireshark auch so aus als ob nur die Daten generiert wurden, aber leider reagierte der server nie. Ich kann den Server nicht umprogrammieren, da dieser nur auf HEX-Codes hört und es sich dabei um ein proprietäres Produkt handelt.
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Was ist für dich ein "HEX-Code"? Willst du Roh ein paar Bytes verschicken? Oder meinst du einen "String", der das als "Text" enthält?

    Oder ist dein Problem nur, dass du nicht weißt, wie du mehr als ein einzelnes Byte verschicken sollst (Byte-Reihenfolge)?
  6. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Also ich hab die Packete, die die Software selbst verschickt mit Wireshark mitgeschrieben und geschaut was diese enthalten.
    Datenlänge 6 Byte, und eben den genannten Code.
    Sprich es ist kein ASCII-Text sondern 6 unsigned byte. In Hex eben "AA 11 03 01 00 15". Ich kann dir auch noch erklären, wie dieser Code zustande kommt wobei das hier ja eigentlich nicht das Thema sein sollte. im Prinzip möchte ich nur ein TCP-Packet an eine Adresse senden welches im Datenbereich folgenden Binär-Code enthält:
    101010100001000100000011000000010000000000010101

    Ich hab diesen Hex-Code mit dem weiter oben genannten Tool bereits einmal versendet und der Server reagiert wie erwartet. Nur leider lassen sich die Packete in Java, aus welchen Gründen auch immer, nicht nachbauen und ich blicks einfach nicht. Ich sniff so ein Packet morgen gerne nochmal mit und stells als Download zur Verfügung, Dann könnt ihr sehen was ich meine...

    Eine beobachtung die ich noch gemacht habe:
    Manchmal wurde das erste byte (AA) in einem Packet der Länge 1 übertragen und die restlichten bytes in einem zweiten Packet der Länge 6 wobei am Schluss noch irgend ein Kauderwelsch angehängt wurde. Dass damit der Server nicht umgehen kann ist mir schon auch klar, aber ich habe leider keinen Plan woher das kommt...

    Beitrag zuletzt geändert: 17.1.2013 22:47:08 von schrotti12
  7. Hallo schrotti12,

    ich habe mal folgendes kleines Java-Programm zusammengestöpselt:
    package test;
    
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class Main
    {
      private static byte[] hexToBytes(String hex) throws Exception
      {
        if(hex.length()%2 == 1)
        {
          throw new Exception("Hex string has an invalid size.");
        }
            
        byte chars[] = hex.getBytes();
        byte result[] = new byte[chars.length / 2];
            
        for(int i=0; i<chars.length; i++)
        {
          result[i/2] <<= 4;
                
          if(chars[i] >= '0' && chars[i]<= '9')
          {
            result[i/2] += (byte) (chars[i] - '0');
          }
          else if(chars[i] >= 'a' && chars[i]<= 'f')
          {
            result[i/2] += (byte) (chars[i] - 'a' + 10);
          }
          else if(chars[i] >= 'A' && chars[i]<= 'F')
          {
            result[i/2] += (byte) (chars[i] - 'A' + 10);
          }
          else
          {
            throw new Exception("Hex string contains invalid characters.");
          }
        }
            
        return result;
      }
        
      public static void main(String args[])
      {
        try
        {
          byte msg[] = hexToBytes("AA1103010015");
          Socket sok = new Socket("127.0.0.1", 1234);   
          try (OutputStream os = sok.getOutputStream())
          {
            os.write(msg);
          }
        }
        catch(Exception e)
        {
          System.err.println(e.getMessage() + e.getStackTrace());
          return;
        }
      }
    }
    Als Gegenstelle habe ich ein kleines C-Programm genommen:
    int main(int argc, char ** argv)
    {
      long i;
      WSADATA wsa_data = {0};
      TcpListener listener;
      TcpSocket sok;
      unsigned char bytes[6];
    
      WSAStartup(MAKEWORD(2,2), &wsa_data);
    
      listener = TcpListener_Create();
      TcpListener_SetPort(listener, "1234");
      TcpListener_SetTimeout(listener, 10000);
      TcpListener_Start(listener);
    
      while(!(sok = TcpListener_Accept(listener)));
    
      Stream_Read(sok, bytes, sizeof(bytes));
      Stream_Free(sok);
    
      TcpListener_Free(listener);
    
      for(i=0; i<sizeof(bytes); i++)
        printf("%02X", bytes[i]);
    
      getchar();
      WSACleanup();
      return 0;
    }
    Angekommen ist folgendes:
    AA1103010015

    Somit würde ich sagen, dass obiges Programm eigentlich funktionieren sollte.
    Das ein Packet bei der Übertragung zerteilt wird kann jederzeit passieren. Wenn der Server damit nicht klar kommt, dann ist der Server einfach Schrott. Desweiteren kannst Du dagegen auch nicht wirklich viel machen, da das Betriebssystem bzw. der Treiber und die Netzwerkkarte darüber entscheiden, wann und wieviele Daten übertragen werden.

    Beitrag zuletzt geändert: 18.1.2013 22:56:04 von darkpandemic
  8. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Das Programm sieht gut aus, aber der Samsung-Bildschirm (Datenprotokoll MDC) sendet seltsamerweise immer ein RST zurück. Ich blicks einfach nicht...

    Wenn ich das Tool von Samsung verwende und einen Verbindungs-Aufbau mach, sendet es genau den selben Code, aber dort wird die Verbindung aufgebaut. Bei meinem Java-Tool wird die Verbindung nicht aufgebaut! Ich kann gerne mal einen Dump erstellen, wies beim Samsung-Tool aussieht und wie bei meinem...

    Code des Clients:
    try {
    			Socket s = new Socket("10.10.11.7", 1515);
    			DataOutputStream dos = new DataOutputStream(s.getOutputStream());
    			byte[] bytes = hexToBytes("AA00030003");
    			dos.write(bytes);
    ...


    Ihr seht: Ich bau eine TCP-Verbindung auf und sende nur diesen Code, aber der Bildschirm antwortet im späteren Verlauf mit einem RST:
    http://schrotti12.de/RST.jpg

    Auf den Server selbst hab ich leider keinen Quelltext-Zugriff. Ich weiß bloß, dass wenn ich bestimmte HEX-Codes im Datenbereich sende, der Server bzw. das Gerät mit HEX-Antworten reagiert bzw. sich selbst steuert (Ausschalten).

    Hier seht ihr, wie eine erfolgreiche Verbindung aussieht:
    http://schrotti12.de/Ack.jpg

    @darkpandemic:
    Könntest du bitte noch den ganzen Code des C-Programms posten, da ich ein solches im Rahmen des Projekts auch noch brauche :-)

    Beitrag zuletzt geändert: 21.1.2013 15:10:47 von schrotti12
  9. Hallo schrotti12,

    den gesamten C-Code zu posten würde den Rahmen hier vollständig sprengen. Es war auch eher als Pseudo-Code Vorlage gedacht.
    Aber hier ist die entsprechende Java Version:
    package test;
    
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Main
    {
      private static String bytesToHex(byte[] bytes)
      {
        StringBuilder sb = new StringBuilder();
            
        for(int i = 0; i<bytes.length; i++)
        {
          sb.append(String.format("%02X", bytes[i]));
        }
        return sb.toString();
      }
        
      public static void main(String[] args)
      {
        try
        {
          try (ServerSocket listener = new ServerSocket(1234);
               Socket sok = listener.accept();
               InputStream is = sok.getInputStream())
          {
            byte bytes[] = new byte[6];
            is.read(bytes);
                    
            System.out.println(bytesToHex(bytes));
          }
        }
        catch(Exception e)
        {
          System.err.println(e.getMessage() + e.getStackTrace());
        }
      }
    }

    Im Übrigen habe ich hier noch die Protokollspezifikation gefunden:
    http://www.vandomburg.nu/useruploads/files/mdc_ue_me_de_protocol_ver_063-eng.pdf
    Das macht die Sache hoffentlich einfacher.

    Edit: Hat es eigentlich einen Grund, dass Du den Socket-Stream noch einmal in einem DataOutputStream verpackst? Fall nicht, dann lass den besser weg, weil der nur unnötigen Overhead erzeugt.

    Edit2: Blödsinn entfernt.




    Beitrag zuletzt geändert: 21.1.2013 21:11:33 von darkpandemic
  10. Autor dieses Themas

    schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Hallo!

    Die Spezifikation kenn ich, aber das Problem sind nicht die HEX-Codes wie ich anfänglich vermutet habe sondern der Verbindungsaufbau. Irgendwas läuft da schief sodass der Bildschirm die Verbindung ablehnt. Nun werd ich nochmals mit dem Samsung-Programm den Verbindungsaufbau durchführen und den ganzen Verkehr mitschreiben um zu sehen, was alles abläuft und welche Daten gesendet bzw. empfangen werden. Das wird interessant, aber danke für die Hilfe.
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!