Как добавить длину сообщения ISO8583 к сообщению ISO8583 с помощью библиотеки j8583
Я пытаюсь отправить сообщение ISO8583 на сервер, используя j8583. Я устанавливаю заголовок в файле config.xml и устанавливаю поля из того же. Теперь конфигурация сервера требует, чтобы длина 2 байта (длина в шестнадцатеричном формате, отправляемом в байтах) была отправлена до входящего сообщения ISO8583. Итак, мой вопрос:
1) Как рассчитать длину сообщения, т.е. байтовое представление сообщения ISO, и как рассчитать длину байтового представления.
2) Как отправить длину сообщения на сервер перед сообщением ISO8583, т.е. перед заголовком.
Вот некоторые выдержки из кода
Client client = new Client(sock);
Thread reader = new Thread(client, "j8583-client");
reader.start();
IsoMessage req = mfact.newMessage(0x200);
req.setValue(4, amounts[rng.nextInt(amounts.length)],
IsoType.AMOUNT, 0);
req.setValue(12, req.getObjectValue(7), IsoType.TIME, 0);
req.setValue(13, req.getObjectValue(7), IsoType.DATE4, 0);
req.setValue(15, req.getObjectValue(7), IsoType.DATE4, 0);
req.setValue(17, req.getObjectValue(7), IsoType.DATE4, 0);
req.setValue(37, System.currentTimeMillis() % 1000000,
IsoType.NUMERIC, 12);
req.setValue(41, data[rng.nextInt(data.length)], IsoType.ALPHA, 16);
req.setValue(48, data[rng.nextInt(data.length)], IsoType.LLLVAR, 0);
pending.put(req.getField(11).toString(), req);
System.err.println(String.format("Sending request %s", req.getField(11)));
System.out.println(req.getIsoHeader());
System.out.println(req.debugString());
req.write(sock.getOutputStream(), 2);
а ниже конфиг
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE j8583-config PUBLIC "-//J8583//DTD CONFIG 1.0//EN"
"http://j8583.sourceforge.net/j8583.dtd">
<j8583-config>
<!-- These are the ISO headers to be prepended to the message types specified -->
<header type="0200">ISO026000073</header>
<header type="0210">ISO015000055</header>
<header type="0400">ISO015000050</header>
<header type="0410">ISO015000055</header>
<header type="0800">ISO015000015</header>
<header type="0810">ISO015000015</header>
<!-- The client example uses this to create requests -->
<template type="0200">
<field num="3" type="NUMERIC" length="6">650000</field>
<field num="32" type="LLVAR">456</field>
<field num="35" type="LLVAR">4591700012340000=</field>
<field num="43" type="ALPHA" length="40">SOLABTEST TEST-3 DF MX</field>
<field num="49" type="ALPHA" length="3">484</field>
<field num="60" type="LLLVAR">B456PRO1+000</field>
<field num="61" type="LLLVAR"> 1234P</field>
<field num="100" type="LLVAR">999</field>
<field num="102" type="LLVAR">ABCD</field>
</template>
ниже приведено строковое представление сообщения ISO (вывод):
Connecting to server
ISO026000073
Sending request 008386
ISO0260000730200B23A800128A180180000000014000000650000000000002050021112445800838612445802110211021103456174591700012340000=0000008984011234567890 SOLABTEST TEST-3 DF MX010abcdefghij484012B456PRO1+000013 1234P0399904ABCD
Также, как я могу увидеть, какое необработанное сообщение отправляется с моего терминала на сервер?
2 ответа
Ну, вы уже используете IsoMessage.write(outputStream, 2)
записать сообщение в поток с длиной, равной 2-байтовому заголовку. Другими словами, этот метод делает именно то, что вы просите, но вы уже используете его, поэтому я не уверен, в чем проблема; сообщение не является собственностью, полученной на другой стороне? Возможно, вам следует обернуть outputStream сокета в BufferedOutputStream
; IsoMessage.write
очистит поток после написания сообщения.
IsoMessage.writeData()
дает вам байтовый массив без заголовков длины.
/* Handel a hexidecimal header in j8583 */
String header = "6000888000";
long it = Long.parseLong(header.trim(), 16);
BigInteger bigInt = BigInteger.valueOf(it);
Log.i(TAG, "value of heder " + bigInt.toString());
byte[] bytearray = (bigInt.toByteArray());