Получить неправильное растровое изображение при использовании jpos для упаковки сообщения iso8583?

Я начинаю использовать jpos для своего приложения. Мне нужно, чтобы мое приложение отправило сообщение iso8583 (версия 1987) на сервер и получило ответ.

Это мой код:

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);

Значение «s»: 082002220100000000010000031917403963953003190016038f060aba137a5b0efb4cc538416c8

Итак: 0820 — это MTI
02220100000000010000 — это Bitmap.

Я чего-то не понимаю:
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

Заголовок пакета: заголовок из четырех символов ASCII, указывающий длину тела пакета.
Тело пакета: сообщение 8583

Итак, как я могу сделать это с помощью JPOS?

Пожалуйста, помогите,

Заранее спасибо,


person kaobuk    schedule 19.03.2014    source источник
comment
ISO 8583 — это двоичный формат; почему вы печатаете это как String?   -  person fge    schedule 19.03.2014


Ответы (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 msg через канал, который добавляет/добавляет длину к сообщению и передает его.

 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.

person kaobuk    schedule 21.03.2014