2014-03-19 51 views
2

我开始为我的应用程序使用jpos。我需要我的应用程序向服务器发送消息iso8583(ver 1987)并接收响应。使用jpos打包iso8583消息时获取错误的位图?

这是我的代码: “S” 的

InputStream is = PackagerFactory.class.getResourceAsStream("iso87ascii.xml"); 
ISOPackager packager = new GenericPackager(is); 
ISOMsg m = new ISOMsg(); 
m.setMTI("0820"); 
m.set(7, "0319174039"); 
m.set(11, "639530"); 
m.set(15, "0319"); 
m.set(24, "001"); 
m.set(64, "6038f060aba137a5b0efb4cc538416c8"); 
m.setPackager(packager); 
byte b[] = m.pack(); 
String s = new String(b); 

值:082002220100000000010000031917403963953003190016038f060aba137a5b0efb4cc538416c8

所以: 0820是MTI
02220100000000010000是位图。

有一些事情我不明白:
1.关于位图:
为什么是20位的长度,但是,它的长度是在配置文件中指定的“iso87ascii.xml”是16 ?

这里是iso87ascii.xml内容:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE isopackager SYSTEM "genericpackager.dtd"> 

<!-- ISO 8583:1987 (ASCII) field descriptions for GenericPackager --> 

<isopackager> 
    <isofield 
     id="0" 
     length="4" 
     name="MESSAGE TYPE INDICATOR" 
     class="org.jpos.iso.IFA_NUMERIC"/> 
    <isofield 
     id="1" 
     length="16" 
     name="BIT MAP" 
     class="org.jpos.iso.IFA_BITMAP"/> 
    <isofield 
     id="2" 
     length="19" 
     name="PAN - PRIMARY ACCOUNT NUMBER" 
     class="org.jpos.iso.IFA_LLNUM"/> 
    ... 
    <isofield 
     id="7" 
     length="14" 
     name="TRANSMISSION DATE AND TIME" 
     class="org.jpos.iso.IFA_NUMERIC"/> 
... 
    <isofield 
     id="11" 
     length="6" 
     name="SYSTEM TRACE AUDIT NUMBER" 
     class="org.jpos.iso.IFA_NUMERIC"/> 
.... 
    <isofield 
     id="15" 
     length="4" 
     name="DATE, SETTLEMENT" 
     class="org.jpos.iso.IFA_NUMERIC"/> 
... 
    <isofield 
     id="24" 
     length="3" 
     name="NETWORK INTERNATIONAL IDENTIFIEER" 
     class="org.jpos.iso.IFA_NUMERIC"/> 
..... 
    <isofield 
     id="64" 
     length="32" 
     name="MESSAGE AUTHENTICATION CODE FIELD" 
     class="org.jpos.iso.IF_CHAR"/> 

</isopackager> 

2.关于消息的标题:
我想发送带有格式:

Package header + Package body 

Package头:四个ASCII字符标题指示包体长度。
包体:一个8583信息

那么,我怎样才能用JPOS做到这一点?

请帮帮忙,

预先感谢,

+0

ISO 8583是一种二进制格式;你为什么要把它打印成'String'? – fge

+0

我使用ascii ISO8583。 – kaobuk

回答

1

你的场7打包是

<isofield id="7" length="14" name="TRANSMISSION DATE AND TIME" class="org.jpos.iso.IFA_NUMERIC"/> 

将其设置为:

m.set(7, "0319174039"); 

它打包垫14宽(左边加0)。试试这个,你会发现它:

Logger l = new Logger(); 
l.addListener(new SimpleLogListener(System.out)); 
ISOPackager packager = new GenericPackager("iso87ascii.xml"); 
packager.setLogger(l, ""); 

ISOMsg m = new ISOMsg(); 
m.setMTI("0820"); 
m.set(7, "0319174039"); 
m.set(11, "639530"); 
m.set(15, "0319"); 
m.set(24, "001"); 
m.set(64, "6038f060aba137a5b0efb4cc538416c8"); 
m.setPackager(packager); 
byte b[] = m.pack(); 

m.dump(System.out,""); 
m.unpack(b); 
System.out.println(ISOUtil.hexdump(b)); 
m.dump(System.out,""); 

你称之为包长度标题是什么jpos通过渠道。所以你可以通过一个通道来传递你的iso消息,这个消息会在消息中附加/预先加上长度并传输。

ASCIIChannel channel = new ASCIIChannel("127.0.0.1",7654,packager);//IP port to connect to, and packager will be used to pack the message and send it 
channel.setLogger(l, "Test"); 
channel.send(m); 

另请参阅Google Group线程。