关于二代身份证读卡器地二次开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于二代身份证读卡器地二次开发
客户提供一台读卡器、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;
}