Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to construct ISO8583 message header for ascii channel and iso93ascii packager in jpos?

Tags:

jpos

iso8583

I am trying to create an ISO8583 message using JPOS in java using the ASCII channel to send the message and iso93ascii packager to pack the ISO message.

But after sending the message I am getting invalid header error from the server.

So my question is what is the header made up of exactly and how do I frame my header for MTI value 1200.

ISOMsg.setHeader("HEADER".getBytes());

How should I frame up my HEADER?

New Development :

After taking a look at the server configuration I need to send the header prepended by the length of the ISO8583 message(2 byte length in hex converted to bytes). How can I do this using JPOS? Also am not able to set anything using channel.setHeader("xxx").getBytes()).

How do I see what raw message is being sent from my terminal to the server.

Here are some of the excerpts from the code

Deploy files

filename : 10_clientsimualtor_channel.xml

<?xml version="1.0" ?>
<channel-adaptor name='jpos-client-adaptor'
    class="org.jpos.q2.iso.ChannelAdaptor" logger="Q2">
<channel class="org.jpos.iso.channel.ASCIIChannel" logger="Q2"
          packager="org.jpos.iso.packager.ISO93APackager" header= "ISO026000075">

  <property name="host" value="xxx.xx.xx.xx" />
  <property name="port" value="xxxxx" />
</channel>
<in>jpos-client-send</in>
<out>jpos-client-receive</out>
<reconnect-delay>10000</reconnect-delay>
</channel-adaptor>

Code :

packager = new ISO93APackager();

            ISOMsg m = new ISOMsg();
            m.setPackager(packager);
            System.out.println(packager);

            m.setHeader("ISO026000075".getBytes());
             System.out.println("Head err..........."+newString(m.getHeader()));

            Date now = new Date();

            m.setMTI("1200");
            m.set(2,"xx");
            m.set(3,"xxxxx");
            m.set(4,"000000010000");
            m.set(11,"214491");
            m.set(12,"160203");

            m.set(123, "xxxxxx");
            m.set(125, "xxxx");

           byte b[] = m.pack();
           System.out.println("\n\n\n\nPACKAGER =====------"+m.getPackager());
           System.out.printf("\n\n\n\nMessage ===== %s",new String(b));

            System.out.println("\n\n\n"+ISOUtil.hexdump(b));return m;
like image 800
Ajay Ganvir Avatar asked Feb 05 '16 08:02

Ajay Ganvir


3 Answers

How do I see what raw message is being sent from my terminal to the server?

The simplest way is to extend your channel and do an hexdump from its send and receive methods.

Here is a simple test code that will create a client and server, send and receive a message with a header. You will see the output contains the header definition that was sent. Once you get it this, moving it to the Q2 way of doing things via deploy should work.

Replace the packager to what you are using in the code. Make sure there is no header attribute in your packager xml. Add the header to your client channel adapter deploy.

import java.io.IOException;

import org.jpos.iso.ISOChannel;
import org.jpos.iso.ISOException;
import org.jpos.iso.ISOMsg;
import org.jpos.iso.ISORequestListener;
import org.jpos.iso.ISOServer;
import org.jpos.iso.ISOSource;
import org.jpos.iso.ServerChannel;
import org.jpos.iso.channel.ASCIIChannel;
import org.jpos.iso.packager.GenericPackager;
import org.jpos.util.Logger;
import org.jpos.util.SimpleLogListener;
import org.jpos.util.ThreadPool;

public class Test {

    public static void main(String[] args) throws IOException, ISOException {

        Logger l = new Logger();
        l.addListener(new SimpleLogListener());
        GenericPackager serverPkg = new GenericPackager(
                "C:\\temp\\iso93asciiB-custom.xml");
        serverPkg.setLogger(l, "Server"); // So that the output can be differentiated based on realm

        GenericPackager clientPkg = new GenericPackager(
                "C:\\temp\\iso93asciiB-custom.xml");
        clientPkg.setLogger(l, "Client");// So that the output can be differentiated based on realm
        // Simulate a server and listen on a port
        ISOChannel serverChannel = new ASCIIChannel(serverPkg);
        ((ASCIIChannel) serverChannel).setHeader("ISO70100000");
        // AN equivalent in your channel adaptor deploy file would be
        // <channel class="org.jpos.iso.channel.ASCIIChannel"
        // packager="org.jpos.iso.packager.GenericPackager"
        // header="ISO70100000"> .....
        // This is evident from the ChanelAdaptor code
        // QFactory.invoke (channel, "setHeader", e.getAttributeValue ("header"));
        ((ASCIIChannel) serverChannel).setLogger(l, "server");
        ISOServer server = new ISOServer(7654, (ServerChannel) serverChannel,
                new ThreadPool(10, 100, "serverListeningThread"));

        server.addISORequestListener(new ISORequestListener() {
            // If the client sends a message, the server will respond with and approval if its a request message
            @Override
            public boolean process(ISOSource source, ISOMsg msg) {
                try {
                    if (!msg.isRequest()) {
                        msg.setResponseMTI();
                        msg.set(39, "000");
                        source.send(msg);
                    }
                }
                catch (ISOException | IOException ex) {

                }

                return true;
            }
        });
        Thread serverThread = new Thread(server);
        serverThread.start(); // beyond this point the server is listening for a client connection

        ASCIIChannel clientChannel = new ASCIIChannel("127.0.0.1", 7654, clientPkg);
        clientChannel.setHeader("ISO70100000");​ //Similar to server, you can configure the constant in your deploy file​
        clientChannel.setLogger(l, "client");
        clientChannel.connect(); // connect to server, it will be seen in the output console
        ISOChannel connectChannel = server.getLastConnectedISOChannel();// Since server can have multiple connections,
                                                                        // we get the last one that connected to it.
        ISOMsg serverInitiatedRequest = new ISOMsg();

        serverInitiatedRequest.set(0, "1804");
        serverInitiatedRequest.set(7, "1607161705");
        serverInitiatedRequest.set(11, "888402");
        serverInitiatedRequest.set(12, "160716170549");
        serverInitiatedRequest.set(24, "803");
        serverInitiatedRequest.set(25, "0000");
        serverInitiatedRequest.set(33, "101010");
        serverInitiatedRequest.set(37, "619817888402");

        connectChannel.send(serverInitiatedRequest); // use the last one connected to send a request message to the client.
        ISOMsg receivedRequest = clientChannel.receive();// receive the serers request message at the client

        ISOMsg clientResponse = (ISOMsg) receivedRequest.clone();
        clientResponse.setResponseMTI();
        clientResponse.set(39, "000");
        clientChannel.send(clientResponse); // send the response to server

    }

}

Your output should look like

<log realm="client/127.0.0.1:7654" at="Sun Jul 17 12:31:55 IST 2016.764" lifespan="33ms">
  <connect>
    127.0.0.1:7654
  </connect>
</log>
<log realm="Server" at="Sun Jul 17 12:31:55 IST 2016.784" lifespan="4ms">
  <pack>
    31383034023001808800000031363037313631373035383838343032313630373136313730353439383033303030303036313031303130363139383137383838343032
  </pack>
</log>
<log realm="server/127.0.0.1:10614" at="Sun Jul 17 12:31:55 IST 2016.785" lifespan="7ms">
  <send>
    <isomsg direction="outgoing">
      <!-- org.jpos.iso.packager.GenericPackager[C:\temp\iso93asciiB-custom.xml] -->
      <field id="0" value="1804"/>
      <field id="7" value="1607161705"/>
      <field id="11" value="888402"/>
      <field id="12" value="160716170549"/>
      <field id="24" value="803"/>
      <field id="25" value="0000"/>
      <field id="33" value="101010"/>
      <field id="37" value="619817888402"/>
    </isomsg>
  </send>
</log>
<log realm="Client" at="Sun Jul 17 12:31:55 IST 2016.787" lifespan="1ms">
  <unpack>
    31383034023001808800000031363037313631373035383838343032313630373136313730353439383033303030303036313031303130363139383137383838343032
    <bitmap>{7, 11, 12, 24, 25, 33, 37}</bitmap>
    <unpack fld="7" packager="org.jpos.iso.IFA_NUMERIC">
      <value>1607161705</value>
    </unpack>
    <unpack fld="11" packager="org.jpos.iso.IFA_NUMERIC">
      <value>888402</value>
    </unpack>
    <unpack fld="12" packager="org.jpos.iso.IFA_NUMERIC">
      <value>160716170549</value>
    </unpack>
    <unpack fld="24" packager="org.jpos.iso.IFA_NUMERIC">
      <value>803</value>
    </unpack>
    <unpack fld="25" packager="org.jpos.iso.IFA_NUMERIC">
      <value>0000</value>
    </unpack>
    <unpack fld="33" packager="org.jpos.iso.IFA_LLNUM">
      <value>101010</value>
    </unpack>
    <unpack fld="37" packager="org.jpos.iso.IF_CHAR">
      <value>619817888402</value>
    </unpack>
  </unpack>
</log>
<log realm="client/127.0.0.1:7654" at="Sun Jul 17 12:31:55 IST 2016.789" lifespan="4ms">
  <receive>
    <isomsg direction="incoming">
      <!-- org.jpos.iso.packager.GenericPackager[C:\temp\iso93asciiB-custom.xml] -->
      <header>49534F3730313030303030</header>
      <field id="0" value="1804"/>
      <field id="7" value="1607161705"/>
      <field id="11" value="888402"/>
      <field id="12" value="160716170549"/>
      <field id="24" value="803"/>
      <field id="25" value="0000"/>
      <field id="33" value="101010"/>
      <field id="37" value="619817888402"/>
    </isomsg>
  </receive>
</log>
<log realm="Client" at="Sun Jul 17 12:31:55 IST 2016.791">
  <pack>
    31383134023001808A00000031363037313631373035383838343032313630373136313730353439383033303030303036313031303130363139383137383838343032303030
  </pack>
</log>
<log realm="Server" at="Sun Jul 17 12:31:55 IST 2016.791">
  <unpack>
    31383134023001808A00000031363037313631373035383838343032313630373136313730353439383033303030303036313031303130363139383137383838343032303030
    <bitmap>{7, 11, 12, 24, 25, 33, 37, 39}</bitmap>
    <unpack fld="7" packager="org.jpos.iso.IFA_NUMERIC">
      <value>1607161705</value>
    </unpack>
    <unpack fld="11" packager="org.jpos.iso.IFA_NUMERIC">
      <value>888402</value>
    </unpack>
    <unpack fld="12" packager="org.jpos.iso.IFA_NUMERIC">
      <value>160716170549</value>
    </unpack>
    <unpack fld="24" packager="org.jpos.iso.IFA_NUMERIC">
      <value>803</value>
    </unpack>
    <unpack fld="25" packager="org.jpos.iso.IFA_NUMERIC">
      <value>0000</value>
    </unpack>
    <unpack fld="33" packager="org.jpos.iso.IFA_LLNUM">
      <value>101010</value>
    </unpack>
    <unpack fld="37" packager="org.jpos.iso.IF_CHAR">
      <value>619817888402</value>
    </unpack>
    <unpack fld="39" packager="org.jpos.iso.IFA_NUMERIC">
      <value>000</value>
    </unpack>
  </unpack>
</log>
<log realm="server/127.0.0.1:10614" at="Sun Jul 17 12:31:55 IST 2016.792" lifespan="26ms">
  <receive>
    <isomsg direction="incoming">
      <!-- org.jpos.iso.packager.GenericPackager[C:\temp\iso93asciiB-custom.xml] -->
      <header>49534F3730313030303030</header>
      <field id="0" value="1814"/>
      <field id="7" value="1607161705"/>
      <field id="11" value="888402"/>
      <field id="12" value="160716170549"/>
      <field id="24" value="803"/>
      <field id="25" value="0000"/>
      <field id="33" value="101010"/>
      <field id="37" value="619817888402"/>
      <field id="39" value="000"/>
    </isomsg>
  </receive>
</log>
<log realm="client/127.0.0.1:7654" at="Sun Jul 17 12:31:55 IST 2016.793" lifespan="3ms">
  <send>
    <isomsg direction="outgoing">
      <!-- org.jpos.iso.packager.GenericPackager[C:\temp\iso93asciiB-custom.xml] -->
      <header>49534F3730313030303030</header>
      <field id="0" value="1814"/>
      <field id="7" value="1607161705"/>
      <field id="11" value="888402"/>
      <field id="12" value="160716170549"/>
      <field id="24" value="803"/>
      <field id="25" value="0000"/>
      <field id="33" value="101010"/>
      <field id="37" value="619817888402"/>
      <field id="39" value="000"/>
    </isomsg>
  </send>
</log>
like image 115
chhil Avatar answered Oct 23 '22 22:10

chhil


You can set your header at the channel level (i.e. channel.setHeader("xxx").getBytes()) or set it on a per-message level (i.e. m.setHeader("xxx".getBytes())).

It is important that the channel knows the header length at receive time, so even if you use per message header, you should set a dummy header at the channel level as well.

Using Q2 and the ChannelAdaptor or QServer components will make your life really easier. Take a look at http://jpos.org/doc/proguide-draft.pdf

like image 34
apr Avatar answered Oct 23 '22 22:10

apr


from jpos you will get only hexdump of header.in order to send ascii93 version you need to convert hexdump to bytes and then bits.

https://github.com/vikrantlabde/iso8583-Java/blob/master/src/ISO/iso8583.java

you can use this program to pack and send isoascii93 message

like image 39
jan Avatar answered Oct 23 '22 22:10

jan