关于二代身份证读卡器的二次开发
客户提供一台读卡器、sdtapi.dll、WltRS.dll,以及相应的头文件,我是通过java的jni与所写c++代码进行交互,但是java这边接收到的身份证基本信息一直是乱码。先说明c++向java传其他中文不会出现乱码,是在c++读出的身份证信息就是乱码。c++的代码如下:
#include "windows.h"
#include "CardReader.h"
#include "sdtapi.h"
#include "String.h"
#include "WltRS.h"
JNIEXPORT jbyteArray JNICALL Java_CardReader_getMessage(JNIEnv * env, jobject jobj){
char* szStr="mei zhao dao xin xi";
char cInput;
int iRet; //返回码
int iPort; //端口号
int iIfOpen=0; //是否需要打开串口
unsigned char pucIIN[8];
unsigned char pucSN[8];
unsigned char pucCHMsg[512]; //文字信息
unsigned char pucPHMsg[1024]; //照片信息
unsigned char pucFPMsg[1024]; //指纹信息
unsigned int uiCHMsgLen,uiPHMsgLen;
memset(pucCHMsg,0,sizeof(pucCHMsg));
int length;
jbyteArray RtnArr = NULL;
jsize arrsize;
if(iIfOpen==0){
for (iPort = 1001; iPort <= 1016; iPort++)
{
iRet=SDT_OpenPort(iPort);
printf("SDT_OpenPort usb error, error code is: %02x\n", iRet);
printf("SDT_OpenPort usb error, error code is: %02d\n", iPort);
if(iRet==0x90) break;
}
if(iRet!=0x90)
{
printf("SDT_OpenPort error, error code is: %02x\n", iRet);
SDT_ClosePort(iPort);
szStr="SDT_OpenPort error";
printf(szStr);
length = strlen(szStr);
arrsize =(jsize)length;
RtnArr=env->NewByteArray(arrsize);
env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);
return RtnArr;
}
iRet=SDT_StartFindIDCard(iPort,pucIIN, iIfOpen);
printf("SDT_StartFindIDCard error, error code is: %02x\n", iRet);
if (iRet != 0x9f)
{
iRet=SDT_StartFindIDCard(iPort,pucIIN, iIfOpen); //再找卡
if (iRet != 0x9f)
{
iRet = SDT_ClosePort(iPort);
printf("SDT_StartFindIDCard error, error code is: %02x\n", iRet);
szStr="SDT_StartFindIDCard error";
length = strlen(szStr);
arrsize =(jsize)length;
RtnArr=env->NewByteArray(arrsize);
env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);
return RtnArr;
}
}
iRet=SDT_SelectIDCard (iPort,pucSN, iIfOpen);
printf("SDT_SelectIDCard error, error code is: %02x\n", iRet);
if (iRet != 0x90)
{
iRet=SDT_SelectIDCard (iPort,pucSN, iIfOpen); //再选卡
if (iRet != 0x90)
{
iRet = SDT_ClosePort(iPort);
printf("SDT_SelectIDCard error, error code is: %02x\n", iRet);
szStr="SDT_SelectIDCard error";
length = strlen(szStr);
arrsize =(jsize)length;
RtnArr=env->NewByteArray(arrsize);
env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);
return RtnArr;
}
}
iRet=SDT_ReadBaseMsg(iPort,pucCHMsg,&uiCHMsgLen, pucPHMsg,&uiPHMsgLen, iIfOpen);
printf("SDT_ReadBaseMsg error, error code is: %02x\n", iRet);
if(iRet!=0x90)
{
printf("SDT_ReadBaseMsg error, error code is: %02x\n", iRet);
if(iIfOpen==0)
SDT_ClosePort(iPort);
printf("ssaaaasasasaas\n");
szStr="SDT_ReadBaseMsg error";
length = strlen(szStr);
arrsize =(jsize)length;
RtnArr=env->NewByteArray(arrsize);
printf("123345453\n");
env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);
printf("12sssssssss33454534ssaaaasasasaas");
return RtnArr;
}
printf("SDT_ReadBaseMsg OK\n");
if(iIfOpen==0)
SDT_ClosePort(iPort);
RtnArr=env->NewByteArray(uiCHMsgLen);
printf("pucCHMsg=%s\n",pucCHMsg);
env->SetByteArrayRegion(RtnArr, 0,uiCHMsgLen, (jbyte*)pucCHMsg);
return RtnArr;
}
length = strlen(szStr);
arrsize =(jsize)length;
RtnArr=env->NewByteArray(arrsize);
env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);
return RtnArr;
}