Captura de datos hex con Java.

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
Avatar de Usuario
ceduardo
Forista Medio
Forista Medio
Mensajes: 264
Registrado: Jue Ago 31, 2006 7:00 am
Ubicación: Cali - Colombia

Captura de datos hex con Java.

Mensaje por ceduardo » Jue Ago 05, 2010 6:58 pm

Hola a todos, de antemano gracias por su ayuda.

Bueno resulta que donde laboro se involucraron el cuento del rastreo de vehículos con disposivos GPS, resulta que estos aparatejos mandan la información por el protocolo UDP y gracias a un manual que encontré me di cuenta que las tramas las mandan en hexadecimal, bueno construí mi servidor en Java para que capture las peticiones UDP y hasta ahi todo va bien.

Resulta que experimentando con el manual e identificando cada parte del mensaje he logrado simular gracias a los ejemplos del manual, pero resulta que una parte de la trama dice que viene un campo llamado ID y que su forma es segun el manual:

"El campo ID tiene de longitud 7 bytes, el camp ID es una cifra no mayo a 14 digitos, el byte no utilizados deberán rellenarse con "f" o "0xff". Este formato es en Hex.

Por ejemplo, si el ID es 13612345678, entonces se mostrara lo siguiente: 0x13,0x61,0x23,0x45,0x67,0x8F,0xFF"

Entonces con este ejemplo del manual se vino abajo todo lo que yo podía entender ya que la representación de la cifra 13612345678 en hex 32B5BE94E.

Construí un programa en Python que manda el dato en hex y le mando desde Python a Java "0x13,0x61,0x23,0x45,0x67,0x8F,0xFF" y eso me llega una cosa que no se puede interpretar.

La verdad estoy como perdido en el limbo, pero vi algo en medio de todo esto:
Si son 7 bytes y el ejemplo dice:

[6] 0x13
[5] 0x61
[4] 0x23
[3] 0x45
[2] 0x67
[1] 0x8F
[0] 0xFF


Y pero aun si dice que son 15 dígitos analicen esto 1 3 6 1 2 3 4 5 6 7 8 f f f <<< completan con f según dice el manual.

Otra cosa que no anote dice que el dato se almacena del byte mas representativo al menos representativo.


La verdad no entiendo, mi experiencia en programación hasta ahora no ha sido a este nivel de bytes, asi que perdonen mi ignorancia si es que lo que planteo es muy obvio.

Salu2.


Cliente UDP en Python

Código: Seleccionar todo

import socket
 
IP_SERVIDOR = '127.0.0.1'
PUERTO_SERVIDOR = 8886
 
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
 

print 'Enviando paquete 1'
message = "\x40\x40\x4C"
#client.sendto(message, (IP_SERVIDOR, PUERTO_SERVIDOR))

print 'Enviando paquete 2'
message = "\x13\x61\x23\x45\x67\x8F\xFF"
#message = "\x31\x33\x36\x31\x32\x33\x34\x35\x36\x37\x38"

 
client.sendto(message, (IP_SERVIDOR, PUERTO_SERVIDOR)) 
client.close()


Servidor UDP en Java

Código: Seleccionar todo

import java.net.*;
import java.io.*;
import java.nio.*;
import java.lang.*;
import java.math.BigInteger;

public class ServidorUDP {

  //Metodo principal
  public static void main(String args [] ) {
    // Sin argumentos
    if (args.length != 0) {
      System.err.println("Uso: java ReceptorUDP");
    }//if (args.length != 0)
    else try{
      // Crea el Socket
      String strMsgInt;
      DatagramSocket dasSocket = new DatagramSocket(8886);
      System.err.println("Escuchando puerto " + dasSocket.getLocalPort());
      String strMensaje = null;
      int intLonMsg = 0, intIndex = 0;
      while (true){
          // Crea el espacio para los mensajes
          byte [] bytCadena = new byte[256] ;
          DatagramPacket dapMensaje = new DatagramPacket(bytCadena, bytCadena.length);

          // Recibe y muestra el primer mensaje
          dasSocket.receive(dapMensaje);
          strMsgInt = new String(dapMensaje.getData(),0,dapMensaje.getLength());
          System.out.println(" " + strMsgInt);
          // Muestra el contenido del paquete
          ByteArrayInputStream baiBin = new ByteArrayInputStream(dapMensaje.getData());


          //System.out.println("Data: " + new String(dapMensaje.getData(),1));
          System.out.println("Data: ");
//          System.out.println("header: " + (char)baiBin.read() + (char)baiBin.read());
//          System.out.println("eof_header: " + (char)baiBin.read() + (char)baiBin.read());
          
          System.out.println("id: " + (char)baiBin.read() + (char)baiBin.read()+ (char)baiBin.read()+ (char)baiBin.read() + (char)baiBin.read()+ (char)baiBin.read()+ (char)baiBin.read());
          /*          for(intIndex = 0; intIndex <= dapMensaje.getLength(); intIndex++){
            System.out.println("[" + intIndex + "] code :" +  " char : " + (char)baiBin.read());
          }//for(intIndex = 0; intIndex <= dapMensaje.getLength(); intIndex++)*/
          System.out.println ("\n------------EOF-------------------------------------- ") ;
          baiBin.close();
      }//while (true)

    } catch(SocketException e) {
        System.err.println("Socket: " + e.getMessage());
    } catch(IOException e) {
        System.err.println("E/S: " + e.getMessage()); }
  }//public static void main(String args [] )
}//public class ServidorUDP
Gracias Salu2.
ceduardo
[Linux USER #462524 ][Debian]
http://www.calinuxeros.org
IRC: irc.freenode.net Channels: (#debian-es – #debian)
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Captura de datos hex con Java.

Mensaje por akodo » Vie Ago 06, 2010 1:23 am

Puedes probar sacando los datos como:

Código: Seleccionar todo

Byte.toString(baiBin.read())
Quiza esto te sirva de ayuda:
http://java.sun.com/developer/technical ... g/sprintf/

Yo lo que estoy suponiendo es que hay un problema de conversión: le pasas el caracter hexadecimal 13, y al hacer la conversión a caracter te lo interpreta como un caracter de control (quizá esto te ayude: http://www.asciitable.com/)
Puedes hacer algunas pruebas enviando directamente caracteres, o bien caracteres hexadecimales en base a la tabla anterior ("\x48\x4F\x4C\x41" debería aparecer en tu servidor como "HOLA" tal como lo tienes puesto)

De todas formas, creo que en estos casos es conveniente poner la salida porque pueden ser varias cosas.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
Avatar de Usuario
ceduardo
Forista Medio
Forista Medio
Mensajes: 264
Registrado: Jue Ago 31, 2006 7:00 am
Ubicación: Cali - Colombia

Re: Captura de datos hex con Java.

Mensaje por ceduardo » Vie Ago 06, 2010 4:12 pm

"\x48\x4F\x4C\x41" como vas, hice le prueba mandando la palabra "HOLA"( En Hex "\x48\x4F\x4C\x41") y me funciona, desde el Java recibo la cadena legible.

Si el ejemplo el manual dice esto "Por ejemplo, si el ID es 13612345678, entonces se mostrara lo siguiente: 0x13,0x61,0x23,0x45,0x67,0x8F,0xFF" y la cifra al pasarla por un conversor de dec a hex dice que debe de ser 32B5BE94E, supongo que se equivocaron en la redacción. Pero me deja la inquietud de por que "0x13,0x61,0x23,0x45,0x67,0x8F,0xFF" esta separado en 7 bytes tal como lo dice el manual y rellenan con "f" los digitos que no uso.

De todas maneras seguire en buscando un sentido a ver, gracias akodo, voy a revisar lo del link
Salu2.
ceduardo
[Linux USER #462524 ][Debian]
http://www.calinuxeros.org
IRC: irc.freenode.net Channels: (#debian-es – #debian)
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Captura de datos hex con Java.

Mensaje por akodo » Vie Ago 06, 2010 11:30 pm

ceduardo escribió: Si el ejemplo el manual dice esto "Por ejemplo, si el ID es 13612345678, entonces se mostrara lo siguiente: 0x13,0x61,0x23,0x45,0x67,0x8F,0xFF" y la cifra al pasarla por un conversor de dec a hex dice que debe de ser 32B5BE94E, supongo que se equivocaron en la redacción.
Yo lo que entiendo es que no se realiza ninguna conversión, sino que es una notación que han puesto. Simplemente agrupan pares de dígitos y eso lo consideran como un valor hexadecimal. Al menos es lo que entiendo.

Aquí he encontrado un pequeño código para que muestre el valor hexadecimal de un array de bytes que puede que sea lo que necesites.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
Avatar de Usuario
miguellucero
Forista Nuevo
Forista Nuevo
Mensajes: 48
Registrado: Lun Mar 03, 2008 8:00 am

Re: Captura de datos hex con Java.

Mensaje por miguellucero » Vie Ago 13, 2010 6:31 pm

Creo que akodo tiene razon, aun no logro ver donde, o para que se necesita una conversion. Es un formato 'sui-generis'creado internamente, no creo que sea necesaria conversion a decimal, pueden ser tratados inclusive como String.
Avatar de Usuario
ceduardo
Forista Medio
Forista Medio
Mensajes: 264
Registrado: Jue Ago 31, 2006 7:00 am
Ubicación: Cali - Colombia

Re: Captura de datos hex con Java (Solucionado).

Mensaje por ceduardo » Sab Ago 14, 2010 12:34 am

Gracias a todos, bueno ya pude resolver el problema y fue con este dato que mando akodo, el dato esta aquí

Mas precisamente este:

Código: Seleccionar todo

public static String getHexString(byte[] b) throws Exception {
  String result = "";
  for (int i=0; i < b.length; i++) {
    result +=
          Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
  }
  return result;
}
Cuando tomo el mensaje de la variable DatagramPacket, llamo un metodo getData que restorna un byte[] y me retorna la info en hex puro y puedo ver ahi el ID de forma nitida.

GRACIAS.
ceduardo
[Linux USER #462524 ][Debian]
http://www.calinuxeros.org
IRC: irc.freenode.net Channels: (#debian-es – #debian)
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje