我正在向 iso8583 发出 JPOS 请求并使用代码:
String FileParam = "jpos_fields.xml";
GenericPackager packager = new GenericPackager(FileParam);
ISOMsg isoMsg = new ISOMsg();
isoMsg.setPackager(packager);
isoMsg.setMTI("0800");
isoMsg.set(3, "990000");
isoMsg.set(7, "0605144125");
isoMsg.set(11, "000001");
isoMsg.set(24, "831");
isoMsg.set(29, "001");
isoMsg.set(41, "S01JS020");
isoMsg.set(42, "0187490");
isoMsg.recalcBitMap();
BitSet bset = (BitSet) isoMsg.getValue(-1);
TPDUChannel channel = new TPDUChannel();
channel.setHost("127.0.0.1");
channel.setPort(8185);
channel.setPackager(packager);
byte [] TPDU = new byte [5];
TPDU [0] = (byte) 0x68; //0800/0810 only
TPDU [1] = (byte) 0x00;
TPDU [2] = (byte) 0x03;
TPDU [3] = (byte) 0x02;
TPDU [4] = (byte) 0x00;
channel.setTPDU(TPDU);
//channel.pr
channel.connect();
channel.send(isoMsg);
ISOMsg r = channel.receive ();
channel.disconnect ();
BitSet bsetRe = (BitSet) r.getValue(-1);`
和 TPDUChannel 类:
public class TPDUChannel extends ASCIIChannel {
private static byte[] TPDU = new byte[5];
public static void setTPDU(byte[] b) {
System.arraycopy(b, 0, TPDU, 0, TPDU.length);
}
protected void sendMessageLength(int len) throws IOException {
// write TPDU
if (TPDU != null) serverOut.write(TPDU);
//write ASCIIChannel length
super.sendMessageLength(len);
}
protected int getMessageLength() throws IOException, ISOException {
// skip header
if (TPDU != null) {
byte[] b = new byte[TPDU.length];
serverIn.readFully(b, 0, TPDU.length);
}
// read ASCIIChannel length
return super.getMessageLength();
}
}
工作正常,我得到了答案,但需要通过套接字发出手动请求。我知道如何生成 isoMsg 并通过套接字发送,但真的不知道如何设置 TPDU。请帮忙
尝试像 JPOS 一样手动发送套接字请求
此消息考虑了 OP 的评论。
要发送 TPDU,您只需使用 。 在你的代码中,它会是这样的:
String FileParam = "jpos_fields.xml";
GenericPackager packager = new GenericPackager(FileParam);
ISOMsg isoMsg = new ISOMsg();
isoMsg.setPackager(packager);
isoMsg.setMTI("0800");
isoMsg.set(3, "990000");
isoMsg.set(7, "0605144125");
isoMsg.set(11, "000001");
isoMsg.set(24, "831");
isoMsg.set(29, "001");
isoMsg.set(41, "S01JS020");
isoMsg.set(42, "0187490");
// you don`t need the recalc bitmap, the m.pack will do it for you
BaseChannel channel = new NACChannel();
channel.setHost("127.0.0.1");
channel.setPort(8185);
channel.setPackager(packager);
byte [] TPDU = new byte [5];
TPDU [0] = (byte) 0x68; //0800/0810 only
TPDU [1] = (byte) 0x00;
TPDU [2] = (byte) 0x03;
TPDU [3] = (byte) 0x02;
TPDU [4] = (byte) 0x00;
channel.setHeader(TPDU);
您甚至可以将主机、端口、打包程序和 tpdu 传递给 NACChannel
构造函数:
byte [] TPDU = new byte [5];
...
BaseChannel channel = new NACChannel("127.0.0.1", 8185, packager, TPDU);
channel.send(isoMsg);
...
但是,我强烈建议使用 Q2
来配置和启动您的通道,因为这样您就可以在 XML 文件中配置通道属性,而不是对其进行硬编码。在调整超时和许多其他 TCP/IP 参数时为您提供更大的灵活性,而无需重新编译,也无需自己实现设置每个参数的逻辑。