我正在使用 JPOS 发送 0800 网络请求。但问题是 2 字节的标头长度没有附加到我的消息中。如果消息的长度为 42,但添加 2 字节的标头应使其为 44。TCP 转储:
length 42
0x0000: 4500 005e 4448 4000 4006 8842 0a14 5140 E..^DH@.@..B..Q@
0x0010: 0a5f 085d 952e 30c8 5cdb c683 49e6 692d ._.]..0.\...I.i-
0x0020: 8018 01f6 6e60 0000 0101 080a 0775 0600 ....n`.......u..
0x0030: 889f a492 3038 3030 8220 0100 0000 0000 ....0800........
0x0040: 0400 0000 0000 0000 3132 3234 3139 3035 ........12241905
0x0050: 3136 3132 3033 3437 3030 3130 3033 16120347001003
由于我的消息长度为42,002A应该以十六进制转储形式追加。
消息应为:
My Code:
BaseChannel channel = new NACChannel(packager, null);
channel.setHost("xx.xx.xx.xx", xxxxx);
channel.connect();
ISOMsg isoMsg = new ISOMsg();
isoMsg.setPackager(packager);
isoMsg.setMTI("0800");
isoMsg.set(7, "1224190516");
isoMsg.set(11, "120347");
isoMsg.set(24, "001");
isoMsg.set(70, "003");
byte[] send_PackedRequestData = isoMsg.pack();
channel.send(send_PackedRequestData);
如何将消息的长度附加到开头,使其成为
002A0800................1224190516120347001003
使用String.format("x%s ",strIsoMsg.length()/2,strIsoMsg)
。
我为您提供了一个模式代码,您可以使用该模式发送消息。这
ISO87BPackager packager = new ISO87BPackager();
ISOMsg isoMsg = new ISOMsg();
isoMsg.setPackager(packager);
isoMsg.setMTI("0800");
isoMsg.set(3, "000000"); //PROCESSING CODE
isoMsg.set(4, strAmount); //AMOUNT, TRANSACTION
...
...
...
byte[] b1 = isoMsg.pack();
isoMsg.set(64, MAC.calcMac(b1));
byte[] b2 = isoMsg.pack();
strIsoMsg = "700800900" + new String(Hex.encodeHex(b2));
String msgHexWithLen = String.format("%04x%s", strIsoMsg.length()/2, strIsoMsg);
byte[] bytes = IsoParser.hexStringToByteArray(msgHexWithLen);
...
...
...
Socket socket = new Socket();
socket.connect(new InetSocketAddress("x.y.z.w", 7151), 5000);
socket.setSoTimeout(30000);
socket.getOutputStream().write(bytes, 0, bytes.length);
socket.getOutputStream().flush();