style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Encabezados en ISO 8583-87

Que tal a todos.
Estoy realizando un Cliente ISO, hay un requerimiento raro del Servidor y es que cuando envie el encabezado del paquete debe medir 10 Bytes, pero cuando es respondido, envía 11 bytes, lo que hace que el bitmap se recorra y el paquete sea mal desempacado.

Alguien sabe como puedo definir el tamaño máximo del encabezado (me imagino que si se define como un campo del paquete ISO podría decirle que espere como máximo once caracteres, aún cuando le mande 10).

Los paquetes que se intercambian son:
Envío:

<isomsg direction="outgoing">
<header>42484E554D5300020102</header>
<field id="0" value="0800"/>
<field id="7" value="120924170434"/>
<field id="11" value="170434"/>
<field id="70" value="001"/>
</isomsg>
</send>

Recibo (observen como el header es de 10bytes, pero ojo, el 02 del data pertenece también al header!):

--- header ---
0000 42 48 4E 55 4D 53 00 03 01 00 BHNUMS....

--- data ---
0000 02 08 10 82 20 00 00 02 00 00 00 04 00 00 00 00 .... ...........
0010 00 00 00 12 09 24 17 04 34 17 04 34 30 30 00 01 .....$..4..400..

Del código:

                        Properties props = new Properties ();
                        props.put ("connect-timeout", sTimeout);
                        Configuration cfg = new SimpleConfiguration (props);
                        ((Configurable)channel).setConfiguration (cfg);
                        ISOMsg m = new ISOMsg();
                Date date = Calendar.getInstance().getTime();
                SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
                SimpleDateFormat sdfHora = new SimpleDateFormat("HHmmss");
                try {
                m.setMTI ("0800");
                        m.set (7, sdf.format(date)+sdfHora.format(date));
                        m.set(11, sdfHora.format(date));
                        m.set (70, "001");
                } catch (ISOException e) {
                        e.printStackTrace();
                }

                                byte[] value = new byte[10];           
                                System.arraycopy(ISOUtil.hex2byte(HEADER), 0, value, 0, ISOUtil.hex2byte(HEADER).length);
                                channel.setHeader(value);
                                BaseHeader db = new BaseHeader(value); 
                                m.setHeader(db);
                                /*=========================*/
                                m.recalcBitMap();
                                m.setPackager(p);
                                m.pack();
                channel.connect ();
                channel.send (m);
                ISOMr = channel.receive ();
                channel.disconnect ();

Gracias.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Fijo

Hasta donde yo sé, el encabezado ISO es de tamaño fijo. Pero deberías poder indicar uno distinto por tipo de mensaje. Al menos j8583 sí te permite hacer eso, no sé qué estás usando aquí (supongo que jPOS o algo así).

Imagen de GiGiorgio

Pues he resuelto este problema!

Pues a base de prueba y error de las posibilidades, aún las mas inverosímiles: Llegué a la resolución de este problema!
Cuál es la formula ganadora?

Primero les explico. Primer paso para mandar mi paquete ISO es el establecer el canal, yo utilizo para mi cliente un PostChannel (tengo también un lado Servidor que funciona igual ese utiliza un ServerChannel). Seleccioné ese tipo de canal porque es el que me permitío establecer los header: ((PostChannel) channel).setHeader().

Después, y una vez estableciendo los puertos y dirección del canal, creo el paquete ISO8583-87, donde también pongo el header del paquete, ese es el que si viajará en el intercambio de paquetes: paquete.setHeader(objetoBaseHader);.

El truco consistió en establecer el header mas grande (el de 12 bytes) en el canal, de modo que se previera una longitúd máxima.
El código del cliente (extracto) quedó así:

                        /********************************/
                        ((LogSource)channel).setLogger (isologer, "bhn-channel");
                        ((LogSource)p).setLogger(isologer, "bhn-packet");
                               
                        Properties props = new Properties ();
                        props.put ("connect-timeout", sTimeout);
                        Configuration cfg = new SimpleConfiguration (props);
                        ((Configurable)channel).setConfiguration (cfg);
                        /********************************/
                        ISOMsg ISOMr = null;
                        ISOMsg m = new ISOMsg ();
                        /********************************/
                        Date date = Calendar.getInstance().getTime();
                        SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
                        SimpleDateFormat sdfHora = new SimpleDateFormat("HHmmss");
                        try {
                                m.setMTI ("0800");
                                m.set (7, sdf.format(date)+sdfHora.format(date));
                                m.set(11, sdfHora.format(date));
                                m.set (70, "001");
                        } catch (ISOException e) {
                               e.printStackTrace();
                       }
                        ((PostChannel) channel).setHeader(ISOUtil.hex2byte("42484E554D530002010200")); // header de 11 bytes
                        BaseHeader db = new BaseHeader(ISOUtil.hex2byte("42484E554D5300020102"));       // header de 10 bytes
                        m.setHeader(db);
                        /*=========================*/
                        m.recalcBitMap();
                        m.setPackager(p);
                        m.pack();
                        /********************************/
                        if(debuging){System.out.println("datos: " + ISOUtil.hexString(m.pack()));}
                        channel.connect ();
                        channel.send (m);
                        ISOMr = channel.receive ();
                       if(debuging){System.out.println (ISOUtil.hexdump (ISOMr.pack()));}
                        channel.disconnect ();
                        log.info("HABHN::run::ISO MTI response:" + ISOMr.getMTI());

SI piensan cortar y pegar este código, revisen el objeto log, es un Logger (org.apache.log4j.Logger) que lo pongo a escuchar el comportamiento de mi clase: log = Logger.getLogger(ClaseISO.class);

Cualquier cosa, por favor, quedo a sus ordenes. Me dará mucho gusto en ayudar.

@GiGiorgio, que biblioteca

@GiGiorgio, que biblioteca estás usando?

La que menciona ezamudio esta aquí: https://github.com/chochos/j8583 ( él la hizo ) y está disponible en maven

Imagen de ezamudio

jPOS

creo que está usando jPOS

Buena tarde colega. Que libro

Buena tarde colega. Que libro me recomienda para implementar ISO 8583 en Java?. Soy novato en esta arquitectura y quisiera aprender de lo básico hasta lo mas avanzado. Gracias y espero respuesta.

Imagen de ezamudio

no sé

Nunca he visto libros de ISO8583. Puedes encontrar documentación en internet, o bien pagar en IEEE para bajar el ISO en PDF.

No necesitas implementar el protocolo en Java, porque precisamente ya existe j8583 para generar y leer mensajes ISO8583. Si carece de alguna funcionalidad que necesites, puedes abrir un issue o implementarlo y mandarme pull request.

github.com/chochos/j8583

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">