2016-10-13 1 views
0

Ich verwende J8583 ISO-Parser, um ISO-Nachricht zu analysieren.j8583: ISOMessage Parser produziert keine Ausgabe wie erwartet

"0800A020 00000080 00100400 00000000 00000000 00000001 32393131 30303031 00105445 45535347 5354204D 0301"

Unten ist mein Code.

import com.solab.iso8583.IsoMessage; 
import com.solab.iso8583.IsoValue; 
import com.solab.iso8583.MessageFactory; 
import com.solab.iso8583.parse.ConfigParser; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.text.ParseException; 

    public class ISOUtility { 

     private static BufferedReader reader; 

     private static String getMessage() throws IOException { 
      if (reader == null) { 
       reader = new BufferedReader(new InputStreamReader(System.in)); 
      } 
     // System.out.println("Paste your ISO8583 message here (no ISO headers): "); 
      return "08002020 00000080 00000000 00000001 32393131 30303031"; 
     } 

     public static void main(String [] args) throws IOException, ParseException { 
     // System.out.println("Hello"); 
      final MessageFactory<IsoMessage> mf = new MessageFactory<IsoMessage>(); 

      if (1 == 0) { 
      // System.out.println("Hello2"); 

      // ConfigParser.createFromClasspathConfig("j8583.xml"); 
       ConfigParser.configureFromDefault(mf); 

      } else { 
       System.out.println("Hello3"); 
       String path="C:\\Users\\DELL\\workspace\\SolabParser\\j8583.xml"; 
       if (System.console() != null) { 
        System.console().printf("Attempting to configure MessageFactory from %s...%n", path); 

       } 
       System.out.println("Messagefactory is done"); 
       String url = "C:\\Users\\DELL\\workspace\\SolabParser\\j8583.xml"; 
       if (url.contains("://")) { 
        System.out.println("else "); 

        ConfigParser.configureFromUrl(mf, new URL(args[0])); 
       } else { 
        System.out.println("else "); 
        ConfigParser.configureFromUrl(mf, new File(path).toURI().toURL()); 
       } 
      } 
      //Now read messages in a loop 
      String line = getMessage(); 
      // while (line != null && line.length() > 0) { 

      mf.setIgnoreLastMissingField(true); 
       System.out.println(mf.getIgnoreLastMissingField()); 

       IsoMessage m = mf.parseMessage(line.getBytes(), 0); 

       System.out.println("Hello5"); 
       if (m != null) { 
        System.out.printf("Message type: %04x%n", m.getType()); 
        System.out.println("FIELD TYPE VALUE"); 
        for (int i = 2; i <= 128; i++) { 
         IsoValue<?> f = m.getField(i); 
         if (f != null) { 
          System.out.printf("%5d %-6s [", i, f.getType()); 
          System.out.print(f.toString()); 
          System.out.println(']'); 
         } 
        } 
       } 
       line = getMessage(); 
     // } 
     } 

Aber ich bekomme falsche Ausgabe.

Message type: 0800 
FIELD TYPE VALUE 
    3 ALPHA [000000] 
    11 NUMERIC [00 000] 
    41 NUMERIC [00001 32393131 3] 
    60 LLLVAR [3031 00105445 5354204D 4553534] 
    70 NUMERIC [7 0] 

Außer Feld 3 haben alle falsche Daten.

Wenn ich irgendwelche Änderungen mit Platz in Daten machen, wirft sie ** Fehler: **

Nicht genügend Daten für LLLVAR Feld 60

Jede sugeestion dies hinter sich bringen.

Vielen Dank.

+1

1. Entfernen Sie die Leerzeichen aus dem Eingabepuffer. –

+0

Entfernen von Speicherplatz gibt Fehler: "Nicht genügend Daten für LLLVAR" –

Antwort

3

Wie ich in den Kommentaren antwortete:

1) die Räume aus dem Nachrichtenpuffer entfernen.

2) Überprüfen Sie Ihr Nachrichtenformatprofil.

Sieht aus wie Feld 60 in Ihrem Fall hat 4 Zeichen für die Länge. d.h. LLLLVAR.

--- 
msg:#"0800A0200000008000100400000000000000000000000001323931313030..0301" 
- MTI: "0800" # Message Type ID. // Network management request 
- DE000: "A020000000800010" # Primary bitmap // 1.3.11.41.60. 
- BM0:#"0400000000000000000000000001323931313030303100" # Fields at Primary Bitmap 
    - DE001: "0400000000000000" # Secondary bitmap // 70. 
    - DE003:#"000000" # PC 
    - S01: "00" # Transaction Code. // Purchase of goods or services 
    - S02: "00" # Account, from. // Standard purchase 
    - S03: "00" # Account, to. // Standard purchase 
    - DE011: "000001" # STAN. // 1 
    - DE041: "3239313130303031" # CATI. // "29110001" 
    - DE060:#"001054455354204D45535347" 
    - len: "0010" // 10 
    - val: "54455354204D45535347" // "TEST MESSG" 
- BM1:#"0301" # Fields at Secondary Bitmap 
    - DE070: "0301" # Network management information code // 301 - Echo test 
+0

Vielen Dank für Ihre Mühe. Wie überprüfe ich das Profil? Gibt es ein Online-Tool? –

+0

ISO 8583 sind variabel mit Feldformaten. Nach einer anderen Ihrer Frage http://stackoverflow.com/questions/40013434/j8583-iso8583-messagefactory-has-no-parsing-guide-for-message-type-0800 können Sie XML-Konfigurationsprofil für Ihre Protokollanforderungen ändern. Ich benutze andere Tools als j8583 und kann dich nicht tief in dieser Java-API unterstützen. –

+0

und Wie finden Sie Länge 4 für Feld 60? Wie Sie geschrieben haben, zeigt es len: "0010" und val: "001054455354204D45535347". Kannst du das bitte erklären? Ich bin neu in ISO8583. Ich weiß, dass für LLLLVAR die ersten 4 Zeichen die Länge des Feldes definieren. aber "0010" wird entweder als 10 oder 2 betrachtet. –

Verwandte Themen