我正在尝试使用 java 中的 JPOS 创建一条ISO8583消息,使用 ASCII 通道发送消息和 iso93ascii 打包程序打包 ISO 消息。
但是发送消息后,我从服务器收到无效的标头错误。
所以我的问题是标题究竟由什么组成,我如何为 MTI 值 1200 构建我的标题。
ISOMsg.setHeader("HEADER".getBytes());
我应该如何构架我的标题?
新发展 :
查看服务器配置后,我需要发送以ISO8583消息长度为前缀的标头(2 字节长度的十六进制转换为字节)。如何使用JPOS执行此操作?我也无法使用 channel.setHeader("xxx").getBytes())
设置任何内容。
如何查看从我的终端发送到服务器的原始消息。
以下是代码中的一些摘录
部署文件
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>
法典:
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("nnnnPACKAGER =====------"+m.getPackager());
System.out.printf("nnnnMessage ===== %s",new String(b));
System.out.println("nnn"+ISOUtil.hexdump(b));return m;
如何查看从我的终端发送到 服务器?
最简单的方法是扩展通道并从其发送和接收方法执行十六进制转储。
这是一个简单的测试代码,它将创建一个客户端和服务器,发送和接收带有标头的消息。您将看到输出包含已发送的标头定义。一旦你得到它,把它移动到通过部署的Q2方式做事应该可以了。
将打包程序替换为代码中使用的打包程序。确保打包程序 xml 中没有标头属性。将标头添加到客户端通道适配器部署。
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
}
}
您的输出应如下所示
<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:tempiso93asciiB-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:tempiso93asciiB-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:tempiso93asciiB-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:tempiso93asciiB-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>
您可以在频道级别设置标头(即 channel.setHeader("xxx").getBytes())
或将其设置为每条消息级别(即 m.setHeader("xxx".getBytes())
)。
接收时知道标头长度非常重要,因此即使您使用每个消息标头,也应该在通道级别设置虚拟标头。
使用 Q2 和 ChannelAdaptor 或 QServer 组件将使您的生活更加轻松。看看 http://jpos.org/doc/proguide-draft.pdf <</p>
从 jpos 中,您将只获得发送 ascii93 版本的 header.in 十六进制转储,您需要将十六进制转储转换为字节,然后是位。
https://github.com/vikrantlabde/iso8583-Java/blob/master/src/ISO/iso8583.java
您可以使用此程序打包和发送 ISOASCII93 消息