Hallo,
ich hoffe ich bin hier richtig und mir kann jemand helfen.
Ich will einen Kartenleser ansprechen (Krankenversichertenkarte). Bei dem Kartenleser ist eine API dabei, die drei Funktionen zur Verfügung stellt:
CT_init, CT_data und CT_close.
Die init Funktion und die Close-Funktion laufen problemlos, nur das Aufrufen der CT_data Funktion will mir nicht gelingen.
Definiert sind die Funktionen in der API wie folgt:
CT_init ( unsigned short ctn , unsigned short ctn)
CT_close ( unsigned short ctn)
CT_data (unsigned short ctn, unsigned char *dad, unsigned char *sad,
unsigned short lenc, unsigned char *command, unsigned short* lenr, unsigned char *response)
Ich habe die DLL mittels JNA eingebunden und folgende Klasse definiert:
So und nun will ich die Funktionen aufrufen.
CT_init und CT_close funktioniert, nur leider CT_data nicht.
Als Rückgabewert sollte idealerweise 0 zurückkomme . ich bekomme allerdings: "202731264"
Aus einem C++Programm, aus dem der Zugrif funktioniert, schaut das so aus:
Kann mir da jemand helfen, wo mein Denkfehler ist? Leider bin ich noch neu in JAVA und C++ kann ich kaum.
Danke
ich hoffe ich bin hier richtig und mir kann jemand helfen.
Ich will einen Kartenleser ansprechen (Krankenversichertenkarte). Bei dem Kartenleser ist eine API dabei, die drei Funktionen zur Verfügung stellt:
CT_init, CT_data und CT_close.
Die init Funktion und die Close-Funktion laufen problemlos, nur das Aufrufen der CT_data Funktion will mir nicht gelingen.
Definiert sind die Funktionen in der API wie folgt:
CT_init ( unsigned short ctn , unsigned short ctn)
CT_close ( unsigned short ctn)
CT_data (unsigned short ctn, unsigned char *dad, unsigned char *sad,
unsigned short lenc, unsigned char *command, unsigned short* lenr, unsigned char *response)
Ich habe die DLL mittels JNA eingebunden und folgende Klasse definiert:
Code:
package gbws.bw_tm.control;
import java.nio.ByteBuffer;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.ShortByReference;
public class CtTMKartenleser {
public interface IKVKarteLibrary extends Library {
IKVKarteLibrary INSTANCE = (IKVKarteLibrary)
Native.loadLibrary("ctdeutin" , IKVKarteLibrary.class);
int CT_init(char shA, char shB);
int CT_close(char shA);
int CT_data(char shCtn, ByteBuffer dad, ByteBuffer sad, char shLenc, ByteBuffer sCommand, ShortByReference lenr, ByteBuffer sResponse);
}
}
So und nun will ich die Funktionen aufrufen.
CT_init und CT_close funktioniert, nur leider CT_data nicht.
Code:
final char chCtn = 0x00000001;
final char chPn = 0x00000001;
// Instanz des Kartenlesers erzeugen
IKVKarteLibrary lib = IKVKarteLibrary.INSTANCE;
// erster Schritt Kartenleser initialisieren
int iInit = lib.CT_init(chCtn, chPn);
// Datenfelder für den Zugriff auf CT_DATA #
byte[] btDad = {1};
byte[] btSad = {2};
char chLenc = 0X00000005;
char chLenr = 256;
short shLenr = 256;
// Befehl
byte[] resetICC = {0x20, 0x12, 0x01, 0x01, 0x00,0x00, 0x00, 0x00, 0x00, 0x00 };
// Rückgabebereich
byte[] hsp = new byte[11];
for (int i = 0; i < 10; i++) {
hsp[i] = resetICC[i];
}
byte[] rsp = new byte[501];
for (int i = 0; i < rsp.length; i++) {
rsp[i] = 0;
}
int iErg = 0;
ByteBuffer bbin = ByteBuffer.wrap(hsp);
ByteBuffer bbout = ByteBuffer.wrap(rsp);
ByteBuffer bbDad = ByteBuffer.wrap(btDad);
ByteBuffer bbSad = ByteBuffer.wrap(btSad);
ShortByReference p1 = new ShortByReference();
p1.setValue((short)chLenr);
// Nun sind 4 Befehle an das Kartenterminal abzusetzen:
iErg = lib.CT_data(chCtn , bbDad, bbSad, chLenc, bbin, p1, bbout);
Als Rückgabewert sollte idealerweise 0 zurückkomme . ich bekomme allerdings: "202731264"
Aus einem C++Programm, aus dem der Zugrif funktioniert, schaut das so aus:
Code:
int ctn=1;
unsigned char ct_dad=1;
unsigned char sad=2;
unsigned short lenr=256;
unsigned char commandcode[11];
unsigned char responsearray[501];
commandcode[0]=0x20;
commandcode[1]=0x12;
commandcode[2]=0x01;
commandcode[3]=0x01;
commandcode[4]=0x00;
commandcode[5]=0x00;
commandcode[6]=0x00;
commandcode[7]=0x00;
commandcode[8]=0x00;
commandcode[9]=0x00;
commandcode[10]=0x00;
// Request ICC zum CT schicken
rc=CT_data(ctn,&ct_dad,&sad,5,&commandcode[0],&lenr,&responsearray[0]);
Kann mir da jemand helfen, wo mein Denkfehler ist? Leider bin ich noch neu in JAVA und C++ kann ich kaum.
Danke