Hallo,
ich verzweifle gerade an der Implementierung einer API in meine JAVA-Anwendung, und hoffe irgendjemand kann mir 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: (siehe auch (http://www.smartcardtools.de/ftp/TeleTrust/MKT_T3.pdf)
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:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
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, Pointer dad, Pointer sad, char shLenc, byte[] sCommand, Pointer lenr, byte[] sResponse);
}
}
So und nun will ich die Funktionen aufrufen.
CT_init und CT_close funktioniert:
// Logische Terminalnummer
final char chCtn = 0x00000001;
// Portnummer
final char chPn = 0x00000220;
lib.CT_init(chCtn, chPn);
lib.CT_close(chCtn);
nur die CT_data (blöderweise die Wichtigste:) )
// Datenfelder für den Zugriff auf CT_DATA
byte btDad = 01;
byte btSad = 02;
char chLenc = 0x11;
short shLenr = 0x256;
// cLenr, bDad und bSad sind als POINTER zu übergeben
ShortByReference p1 = new ShortByReference();
p1.setValue(shLenr);
Pointer pLenr = p1.getPointer();
ByteByReference p2 = new ByteByReference();
p2.setValue(btDad);
Pointer pDad = p2.getPointer();
ByteByReference p3 = new ByteByReference();
p3.setValue(btSad);
Pointer pSad = p3.getPointer();
// verhindert, dass die VM ab****en kann:
Native.setProtected(true);
// Befehl
byte[] resetICC = {0x20, 0x11, 0x01, 0x01, 0x00};
byte[] readBinary = {0x00, (byte) 0xB0, 0x00, 0x00, 0x00};
byte[] request = { 0x20,0x12, 0x01,0x01,0x01, 0x0a, 0x00};
// Rückgabebereich
byte[] rsp = new byte[256];
for (int i = 0; i < rsp.length; i++) {
rsp[i] = 0;
}
int iErg = 0;
chLenc = (char)request.length;
// Nun sind 4 Befehle an das Kartenterminal abzusetzen:
iErg = lib.CT_data(chCtn , pDad, pSad, chLenc,
(byte[]) request, pLenr, rsp);
Vielen Dank schon mal für eure Hilfe!!!