|
|
@@ -0,0 +1,802 @@
|
|
|
+#include <stdio.h>
|
|
|
+#include <stdlib.h>
|
|
|
+
|
|
|
+#include "ContactlessCardDriverGWI.h"
|
|
|
+#include "GwiLogFile.h"
|
|
|
+#include "simple_ini_tool.h"
|
|
|
+#include <dlfcn.h>
|
|
|
+
|
|
|
+#define CONFIG_CONTACTLESS "gwiContactless.ini"
|
|
|
+
|
|
|
+CLogFile *m_plogFile = NULL;
|
|
|
+int icdev = NULL;
|
|
|
+int CommType = 0; //0-USB,1-串口 chr20200320
|
|
|
+
|
|
|
+enum GWI_ErrorCodeEnum
|
|
|
+{
|
|
|
+ GWI_Error_Succeed=0,
|
|
|
+ GWI_Error_UnKnown,
|
|
|
+ //动态库加载
|
|
|
+ GWI_Error_Dll_Load = 1000, //动态库加载失败
|
|
|
+ GWI_Error_Dll_Method, //方法错
|
|
|
+ GWI_Error_Dll_Param, //参数错
|
|
|
+ GWI_Error_Dll_Condition, //条件错
|
|
|
+ GWI_Error_Dll_Config,
|
|
|
+ GWI_Error_Dll_RecvBuf,
|
|
|
+ GWI_Error_Dll_Thread,
|
|
|
+ GWI_Error_Dll_TimeOut,
|
|
|
+
|
|
|
+ //DEV错
|
|
|
+ GWI_Error_Dev_Busy = 1100,
|
|
|
+ GWI_Error_Dev_Offline,
|
|
|
+ GWI_Error_Dev_Error,
|
|
|
+ GWI_Error_System,
|
|
|
+ GWI_Error_Dev_Open,
|
|
|
+ GWI_Error_Dev_Close,
|
|
|
+ GWI_Error_Dev_Comm,
|
|
|
+ GWI_Error_Dev_Conn,
|
|
|
+ GWI_Error_Dev_TimeOut,
|
|
|
+ GWI_Error_Dev_Connect,
|
|
|
+ GWI_Error_Dev_Fault,
|
|
|
+ GWI_Error_Dev_Init,
|
|
|
+ GWI_Error_Dev_Reset,
|
|
|
+ GWI_Error_Dev_State,
|
|
|
+ GWI_Error_Dev_Ver,
|
|
|
+
|
|
|
+ //介质
|
|
|
+ GWI_Error_Media_NoCard = 1200,
|
|
|
+ GWI_Error_Media_State,
|
|
|
+ GWI_Error_Media_Read,
|
|
|
+ GWI_Error_Media_Type,
|
|
|
+ GWI_Error_Media_PowerOn,
|
|
|
+ GWI_Error_Media_PowerOff,
|
|
|
+ GWI_Error_Media_Inhale,
|
|
|
+ GWI_Error_Media_Eject,
|
|
|
+
|
|
|
+ //RF
|
|
|
+ GWI_Error_RF_ChipOn,
|
|
|
+ GWI_Error_RF_ChipOff,
|
|
|
+ GWI_Error_RF_Reset,
|
|
|
+ GWI_Error_RF_States,
|
|
|
+ GWI_Error_RF_Cmd,
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+typedef struct tagStErrorInfo
|
|
|
+{
|
|
|
+ int gwiErrorCode;
|
|
|
+ char description[MAX_DEV_ERROR_MSG_LEN];
|
|
|
+ ErrorCodeEnum errorcode;
|
|
|
+} StErrorInfo;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+StErrorInfo gstErrorInfo[] =
|
|
|
+{
|
|
|
+ {GWI_Error_Dll_Load, "Can not load dll", Error_DevLoadFileFailed},
|
|
|
+ {GWI_Error_Dll_Method, "Command or fun not supported", Error_MethodNotFound},
|
|
|
+ {GWI_Error_Dll_Param, "Param not supported", Error_Param},
|
|
|
+ {GWI_Error_Dll_Condition, "Condition not contented", Error_InvalidState},
|
|
|
+ {GWI_Error_Dll_Config, "Config error", Error_Hardware},
|
|
|
+ {GWI_Error_Dll_RecvBuf, "Receive data buffer overflow", Error_Hardware},
|
|
|
+ {GWI_Error_Dll_Thread, "Thread point is NULL", Error_Null},
|
|
|
+ {GWI_Error_Dll_TimeOut, "Function execute timeout", Error_TimeOut},
|
|
|
+
|
|
|
+ {GWI_Error_Dev_Busy, "Busy", Error_Hardware},
|
|
|
+ {GWI_Error_Dev_Offline, "dev Offline", Error_Hardware},
|
|
|
+ {GWI_Error_Dev_Error, "dev erro", Error_Hardware},
|
|
|
+ {GWI_Error_Dev_Open, "Open dev error", Error_DevConnFailed},
|
|
|
+ {GWI_Error_Dev_Close, "Close dev error", Error_DevConnFailed},
|
|
|
+ {GWI_Error_Dev_Conn, "connect error", Error_DevConnFailed},
|
|
|
+ {GWI_Error_Dev_Comm, "Communication error", Error_DevCommFailed},
|
|
|
+ {GWI_Error_Dev_TimeOut, "Read data time over", Error_TimeOut},
|
|
|
+ {GWI_Error_Dev_Connect, "Connect power error or other", Error_DevConnFailed},
|
|
|
+ {GWI_Error_Dev_Fault, "Device fault.", Error_Hardware},
|
|
|
+ {GWI_Error_Dev_Init, "Dev Initialize error", Error_NotInit},
|
|
|
+ {GWI_Error_Dev_Reset, "Dev Initialize error", Error_NotInit},
|
|
|
+ {GWI_Error_Dev_State, "Dev State error", Error_InvalidState},
|
|
|
+ {GWI_Error_Dev_Ver, "Dev Ver error", Error_InvalidState},
|
|
|
+
|
|
|
+
|
|
|
+ {GWI_Error_Media_NoCard, "Not found Card", Error_Hardware},
|
|
|
+ {GWI_Error_Media_Read, "Failed to read card", Error_Hardware},
|
|
|
+ {GWI_Error_Media_State, "Failed to get card State", Error_Hardware},
|
|
|
+ {GWI_Error_Media_Type, "Incorrect card type.", Error_NoPrivilege},
|
|
|
+ {GWI_Error_Media_PowerOn, "Failed to PowerOn iccard", Error_NoPrivilege},
|
|
|
+ {GWI_Error_Media_PowerOff, "Failed to PowerOff iccard", Error_NoPrivilege},
|
|
|
+ {GWI_Error_Media_Inhale, "Failed to Inhale iccard", Error_NoPrivilege},
|
|
|
+ {GWI_Error_Media_Eject, "Failed to Eject iccard", Error_NoPrivilege},
|
|
|
+
|
|
|
+ //RF
|
|
|
+ {GWI_Error_RF_ChipOn, "Incorrect chip on RF", Error_Hardware},
|
|
|
+ {GWI_Error_RF_ChipOff, "Failed to chip off RF", Error_Hardware},
|
|
|
+ {GWI_Error_RF_Reset, "Failed to reset RF", Error_Hardware},
|
|
|
+ {GWI_Error_RF_States, "Failed to get RF states", Error_NoPrivilege},
|
|
|
+ {GWI_Error_RF_Cmd, "Failed to send apdu ", Error_IO},
|
|
|
+
|
|
|
+ {GWI_Error_System, "System error(exception)", Error_Hardware},
|
|
|
+ {GWI_Error_UnKnown, "UnKnown", Error_Succeed},
|
|
|
+ {GWI_Error_Succeed, "success", Error_Succeed}
|
|
|
+};
|
|
|
+
|
|
|
+void GetDllLoadPath(char *pOutDllPath)
|
|
|
+{
|
|
|
+ if(NULL == pOutDllPath)
|
|
|
+ return;
|
|
|
+
|
|
|
+#ifdef _WINDOWS
|
|
|
+ strcpy(pOutDllPath,g_myDllPath);
|
|
|
+#else
|
|
|
+ Dl_info dl_info; //dladdr获取某个地址的符号信息
|
|
|
+ int rc = dladdr((void*)GetDllLoadPath, &dl_info);
|
|
|
+ strcpy(pOutDllPath,dl_info.dli_fname);
|
|
|
+ char *pName = strrchr(pOutDllPath, '/');
|
|
|
+ *pName = '\0';
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+CContactlessCard::CContactlessCard(void)
|
|
|
+{
|
|
|
+ if(NULL == m_plogFile)
|
|
|
+ {
|
|
|
+ m_plogFile = new CLogFile(LAYER);
|
|
|
+ m_plogFile->init();
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Debug, "CContactlessCard", "Init CMB LOG success!");
|
|
|
+ }
|
|
|
+
|
|
|
+ //加载动态库
|
|
|
+ mt.Loadmt32so();
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Debug, "CContactlessCard", "Loadmt32so success!");
|
|
|
+
|
|
|
+ m_deviceStatus = DEVICE_STATUS_NOT_READY;
|
|
|
+ m_ErrorCode = GWI_Error_Succeed;
|
|
|
+
|
|
|
+ //打开设备
|
|
|
+ int AutoOpen = 0;
|
|
|
+ int Port = 0;
|
|
|
+ int Baud = 0;
|
|
|
+ char szConfPath[260] = {0};
|
|
|
+ char szDllPath[260] = {0};
|
|
|
+
|
|
|
+ GetDllLoadPath(szDllPath);
|
|
|
+ sprintf(szConfPath, "%s/gwi/%s", szDllPath, CONFIG_CONTACTLESS);
|
|
|
+
|
|
|
+ CommType = IniFileRead(szConfPath, "DEVICE", "CommType", 0);
|
|
|
+ AutoOpen = IniFileRead(szConfPath, "DEVICE", "AutoOpen", 0);
|
|
|
+ LogARG(m_plogFile, Log_Debug, "CContactlessCard", "read conf CommType=[%d], AutoOpen=[%d], Port=[%d], Baud=[%d]", CommType, AutoOpen, Port, Baud);
|
|
|
+ if(AutoOpen == 1)
|
|
|
+ {
|
|
|
+ Port = IniFileRead(szConfPath, "DEVICE", "Port", 3);
|
|
|
+ Baud = IniFileRead(szConfPath, "DEVICE", "Baud", 115200);
|
|
|
+ LogARG(m_plogFile, Log_Debug, "CContactlessCard", "read conf CommType=[%d], AutoOpen=[%d], Port=[%d], Baud=[%d]", CommType, AutoOpen, Port, Baud);
|
|
|
+ DevOpen(Port,Baud);
|
|
|
+ }
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Debug, "CContactlessCard", "read conf CommType=[%d], AutoOpen=[%d], Port=[%d], Baud=[%d]", CommType, AutoOpen, Port, Baud);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+CContactlessCard::~CContactlessCard(void)
|
|
|
+{
|
|
|
+ LogARG(m_plogFile, Log_Infor, "~CContactlessCard", "Enter...析构");
|
|
|
+ mt.Freemt32so();
|
|
|
+
|
|
|
+ /*
|
|
|
+ if(NULL != h_dll)
|
|
|
+ {
|
|
|
+ FreeLibrary(h_dll);
|
|
|
+ h_dll = NULL;
|
|
|
+ }
|
|
|
+ */
|
|
|
+}
|
|
|
+
|
|
|
+ErrorCodeEnum ConvertErrorCode(int gwiErrorCode)
|
|
|
+{
|
|
|
+ int i = 0;
|
|
|
+
|
|
|
+ for(; gstErrorInfo[i].errorcode != Error_Succeed; ++i)
|
|
|
+ {
|
|
|
+ if(gwiErrorCode==gstErrorInfo[i].gwiErrorCode)
|
|
|
+ {
|
|
|
+ return gstErrorInfo[i].errorcode;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Error_Succeed;
|
|
|
+}
|
|
|
+
|
|
|
+/************************************
|
|
|
+ Method : GetDevCategory
|
|
|
+ Function : Get category infomation about device.
|
|
|
+ Parameter: DevCategoryInfo & devCategory
|
|
|
+ Returns : ErrorCodeEnum
|
|
|
+ author : CHR 2017/12/24
|
|
|
+ Remark :
|
|
|
+************************************/
|
|
|
+ErrorCodeEnum CContactlessCard::GetDevCategory(DevCategoryInfo &devCategory)
|
|
|
+{
|
|
|
+ //TODO
|
|
|
+ int ret = 0;
|
|
|
+ unsigned char verlen = 0;
|
|
|
+ unsigned char verdata[100];
|
|
|
+ memset(verdata,0,100);
|
|
|
+ if(icdev <= 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "GetDevCategory", "icdev=NULL");
|
|
|
+ m_ErrorCode = GWI_Error_Dev_Ver;
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ //取固件版本
|
|
|
+ ret = mt.dev_get_version(icdev, 1, &verlen, verdata);
|
|
|
+ if(ret != 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "GetDevCategory", "Err: dev_get_version ret = %d",ret);
|
|
|
+ m_ErrorCode = GWI_Error_Dev_Ver;
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+ }
|
|
|
+ if(verlen == 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Warning, "GetDevCategory", "Warn: dev_get_version verlen = 0");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Debug, "GetDevCategory", "dev_get_version verlen = [%d], verdata = [%s]", verlen, &verdata[17]);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ memset(&devCategory, 0x00, sizeof(DevCategoryInfo));
|
|
|
+
|
|
|
+ //memcpy(devCategory.szType, "ACT-R2-420-nfc", sizeof("ACT-R2-420-nfc"));
|
|
|
+ //memcpy(devCategory.szVendor, "GWI_mellisa", sizeof("GWI_mellisa"));
|
|
|
+ memcpy(devCategory.szType, "PVER=ACT#MID=ACT-R2-420-nfc", sizeof("PVER=ACT#MID=ACT-R2-420-nfc"));
|
|
|
+ memcpy(devCategory.szVendor, "GWI", sizeof("GWI"));
|
|
|
+ sprintf(devCategory.szModel, "CM=#PM=#PID=#MID=#FWID=%.8s#SLYLE=#Funcution=#CID=", &verdata[verlen-8]);
|
|
|
+
|
|
|
+ devCategory.eState = m_deviceStatus;
|
|
|
+
|
|
|
+ //设置版本信息(可以通过WINAPI从版本资源中获取版本信息)
|
|
|
+ devCategory.version.wMajor = 1;
|
|
|
+ devCategory.version.wMinor = 0;
|
|
|
+ devCategory.version.wRevision = 0;
|
|
|
+ devCategory.version.wBuild = 0;
|
|
|
+
|
|
|
+ return Error_Succeed;
|
|
|
+}
|
|
|
+
|
|
|
+/************************************
|
|
|
+ Method : Reset
|
|
|
+ Function : Do the cleaning work and initialize device again in order to return to the normal condition.
|
|
|
+ Returns : ErrorCodeEnum
|
|
|
+ author : CHR 2017/12/24
|
|
|
+ Remark :
|
|
|
+************************************/
|
|
|
+ErrorCodeEnum CContactlessCard::Reset()
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ m_ErrorCode = GWI_Error_Succeed;
|
|
|
+ LogARG(m_plogFile, Log_Infor, "Reset", "Enter");
|
|
|
+ if(icdev <= 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "Reset", "icdev=NULL");
|
|
|
+ m_ErrorCode = GWI_Error_RF_Reset;
|
|
|
+ LogARG(m_plogFile, Log_Error, "Reset", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ //复位 Linux下没有复位函数,暂时借鉴驱动处理
|
|
|
+ unsigned char ContactStatus=0;
|
|
|
+ unsigned char NoContactStatus=0;
|
|
|
+ unsigned char MagCardStatus=0;
|
|
|
+ unsigned char IDCardStatus=0;
|
|
|
+ ret = mt.dev_getdevicestatus_bymodule(icdev, &ContactStatus, &NoContactStatus, &MagCardStatus, &IDCardStatus);
|
|
|
+ if(ret != 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "Reset", "Err: dev_getdevicestatus_bymodule ret = %d",ret);
|
|
|
+ m_ErrorCode = GWI_Error_RF_Reset;
|
|
|
+ }
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Infor, "Reset", "Exit: m_ErrorCode = %d", m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+}
|
|
|
+
|
|
|
+/************************************
|
|
|
+ Method : DevClose
|
|
|
+ Function : Close device and do the cleaning work.
|
|
|
+ Returns : ErrorCodeEnum
|
|
|
+ author : CHR 2017/12/24
|
|
|
+ Remark : ex. close connection,close port,release memery and so on
|
|
|
+************************************/
|
|
|
+ErrorCodeEnum CContactlessCard::DevClose()
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ m_ErrorCode = GWI_Error_Succeed;
|
|
|
+ m_deviceStatus = DEVICE_STATUS_NORMAL;
|
|
|
+ LogARG(m_plogFile, Log_Infor, "DevClose", "Enter");
|
|
|
+
|
|
|
+ if(icdev == 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Warning, "DevClose", "icdev==NULL");
|
|
|
+ //m_ErrorCode = GWI_Error_Dev_Close;
|
|
|
+ LogARG(m_plogFile, Log_Warning, "DevClose", "Exit: m_ErrorCode = %d", m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = mt.dev_close_device(icdev);
|
|
|
+ if(ret != 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "DevClose", "Err: dev_close_device ret = %d",ret);
|
|
|
+ m_ErrorCode = GWI_Error_Dev_Close;
|
|
|
+ }
|
|
|
+
|
|
|
+ icdev = 0;
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Infor, "DevClose", "Exit: m_ErrorCode = %d", m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+}
|
|
|
+
|
|
|
+/************************************
|
|
|
+ Method : GetLastErr
|
|
|
+ Function : Get last error the device issued.
|
|
|
+ Parameter: DevErrorInfo & devErrInfo
|
|
|
+ Returns : ErrorCodeEnum
|
|
|
+ author : CHR 2017/12/24
|
|
|
+ Remark : Error message must include explanatory memorandum ,the original error
|
|
|
+ code and anything in favour of location problem.
|
|
|
+************************************/
|
|
|
+ErrorCodeEnum CContactlessCard::GetLastErr(DevErrorInfo &devErrInfo)
|
|
|
+{
|
|
|
+ int i = 0;
|
|
|
+ memset(&devErrInfo, 0x00, sizeof(DevErrorInfo));
|
|
|
+
|
|
|
+ //陈祖国 20190416 未初始化会越界,写法不规范
|
|
|
+ for(; gstErrorInfo[i].errorcode != Error_Succeed && i < sizeof(gstErrorInfo)/sizeof(StErrorInfo); ++i)
|
|
|
+ {
|
|
|
+ if(m_ErrorCode == gstErrorInfo[i].gwiErrorCode)
|
|
|
+ {
|
|
|
+ devErrInfo.dwErrMsgLen = strlen(gstErrorInfo[i].description);
|
|
|
+ memcpy(devErrInfo.szErrMsg, gstErrorInfo[i].description, devErrInfo.dwErrMsgLen);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return Error_Succeed;
|
|
|
+}
|
|
|
+
|
|
|
+/************************************
|
|
|
+ Method : DevOpen
|
|
|
+ Function : device initialization
|
|
|
+ Parameter: DWORD dwPort
|
|
|
+ Parameter: DWORD dwBaudRate
|
|
|
+ Returns : ErrorCodeEnum
|
|
|
+ author : CHR 2017/12/24
|
|
|
+ Remark :
|
|
|
+************************************/
|
|
|
+ErrorCodeEnum CContactlessCard::DevOpen(DWORD dwPort,DWORD dwBaudRate)
|
|
|
+{
|
|
|
+ LogARG(m_plogFile, Log_Infor, "DevOpen", "Enter");
|
|
|
+ LogARG(m_plogFile, Log_Infor, "DevOpen", "inputData: dwPort = %d, dwBaudRate = %d",dwPort,dwBaudRate);
|
|
|
+
|
|
|
+ //int ret;
|
|
|
+ m_ErrorCode = GWI_Error_Succeed;
|
|
|
+
|
|
|
+ if(icdev > 0)
|
|
|
+ {
|
|
|
+ //mt.dev_close_device(icdev);
|
|
|
+ LogARG(m_plogFile, Log_Warning, "DevOpen", "icdev > NULL");
|
|
|
+ LogARG(m_plogFile, Log_Warning, "DevOpen", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+ }
|
|
|
+ if((CommType == 1) && (dwPort > 0))
|
|
|
+ {
|
|
|
+ char szport[8] = {0x00};
|
|
|
+ sprintf(szport,"COM%d", dwPort);
|
|
|
+ int m_port = dwPort - 1;
|
|
|
+ if(m_port <= 0)
|
|
|
+ {
|
|
|
+ m_port = 0;
|
|
|
+ }
|
|
|
+ LogARG(m_plogFile, Log_Debug, "DevOpen", "CommType=1, dwPort=[%d], dwBaudRate=[%d], oldsof=[%d]", dwPort, dwBaudRate, mt.oldsof);
|
|
|
+ if(mt.oldsof == 1)
|
|
|
+ {
|
|
|
+ icdev = mt.dev_open_device_serial(m_port, (int)dwBaudRate);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ icdev = mt.dev_open_device_serial(szport, (int)dwBaudRate);
|
|
|
+ }
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Debug, "DevOpen", "icdev=[%d]", icdev);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ icdev = mt.dev_open_device((unsigned char *)"USB", 0);
|
|
|
+ //icdev = mt.dev_open_device(0, 0);
|
|
|
+ LogARG(m_plogFile, Log_Debug, "DevOpen", "icdev=[%d]", icdev);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(icdev <= 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "DevOpen", "Err: dev_open_device icdev = %d",icdev);
|
|
|
+ m_ErrorCode = GWI_Error_Dev_Open;
|
|
|
+ }
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Infor, "DevOpen", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+}
|
|
|
+
|
|
|
+/************************************
|
|
|
+ Method : GetDevStatus
|
|
|
+ Function : Get card reader status
|
|
|
+ Parameter: RFICReaderStatus & devStatus
|
|
|
+ Returns : ErrorCodeEnum
|
|
|
+ author : CHR 2017/12/24
|
|
|
+ Remark :
|
|
|
+************************************/
|
|
|
+ErrorCodeEnum CContactlessCard::GetDevStatus(RFICReaderStatus &devStatus)
|
|
|
+{
|
|
|
+ LogARG(m_plogFile, Log_Infor, "GetDevStatus", "Enter");
|
|
|
+
|
|
|
+ int ret;
|
|
|
+// int status;
|
|
|
+ m_ErrorCode = GWI_Error_Succeed;
|
|
|
+
|
|
|
+ if(icdev <= 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "GetDevStatus", "icdev=NULL");
|
|
|
+ m_ErrorCode = GWI_Error_Dev_State;;
|
|
|
+ LogARG(m_plogFile, Log_Error, "GetDevStatus", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ unsigned char ContactStatus = 0;
|
|
|
+ unsigned char NoContactStatus = 1;
|
|
|
+ unsigned char MagCardStatus = 0;
|
|
|
+ unsigned char IDCardStatus = 1;
|
|
|
+
|
|
|
+ //ret =XFS_GetMediaStatus(icdev,&ContactType,&NoContactType,&IDCardType);
|
|
|
+ //需要单独处理,暂无Linux下的接口
|
|
|
+ ret = mt.dev_getdevicestatus_bymodule(icdev, &ContactStatus,&NoContactStatus,&MagCardStatus,&IDCardStatus);
|
|
|
+ if(ret !=0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "GetDevStatus", "Err: dev_getcardtype_bymodule ret = %d",ret);
|
|
|
+ devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
|
|
|
+ m_ErrorCode = GWI_Error_Dev_State;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Infor, "GetDevStatus", "ContactStatus=%d,NoContactStatus=%d,MagCardStatus=%d, IDCardStatus=%d",ContactStatus,NoContactStatus,MagCardStatus, IDCardStatus);
|
|
|
+
|
|
|
+ if(IDCardStatus == 1)
|
|
|
+ {
|
|
|
+ devStatus.eMediaPos = CI_MEDIA_IDCARD;
|
|
|
+ }
|
|
|
+ else if(NoContactStatus == 1)
|
|
|
+ {
|
|
|
+ devStatus.eMediaPos = CI_MEDIA_RF;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
|
|
|
+ }
|
|
|
+
|
|
|
+ unsigned char ContactType = 0;
|
|
|
+ unsigned char NoContactType = 1;
|
|
|
+ unsigned char IDCardType = 1;
|
|
|
+
|
|
|
+ ret = mt.dev_getcardtype_bymodule(icdev, &ContactType, &NoContactType, &IDCardType);
|
|
|
+ LogARG(m_plogFile, Log_Infor, "GetDevStatus", "ContactType=%d,NoContactType=%d,IDCardType=%d",ContactType,NoContactType,IDCardType);
|
|
|
+
|
|
|
+ if(IDCardType == 1)
|
|
|
+ {
|
|
|
+ devStatus.eMediaPos = CI_MEDIA_IDCARD;
|
|
|
+ }
|
|
|
+ else if(NoContactType == 1)
|
|
|
+ {
|
|
|
+ devStatus.eMediaPos = CI_MEDIA_RF;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Infor, "GetDevStatus", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+}
|
|
|
+
|
|
|
+/************************************
|
|
|
+ Method : AbortRead
|
|
|
+ Function : Abort current operation.
|
|
|
+ Returns : ErrorCodeEnum
|
|
|
+ author : CHR 2017/12/24
|
|
|
+ Remark :
|
|
|
+************************************/
|
|
|
+ErrorCodeEnum CContactlessCard::AbortRead()
|
|
|
+{
|
|
|
+ LogARG(m_plogFile, Log_Infor, "AbortRead", "Enter");
|
|
|
+ //int ret;
|
|
|
+
|
|
|
+ m_ErrorCode = GWI_Error_Succeed;
|
|
|
+
|
|
|
+/*
|
|
|
+ ret =XFS_ChipPowerOff();
|
|
|
+ if(ret !=0)
|
|
|
+ {
|
|
|
+ if(logFile) logFile->Log_Error(myName, __FILE__, __LINE__, __FUNCDNAME__,"Err: XFS_ChipPowerOff ret = %d",ret);
|
|
|
+ m_ErrorCode = GWI_Error_RF_ChipOff;
|
|
|
+ }
|
|
|
+*/
|
|
|
+ LogARG(m_plogFile, Log_Infor, "AbortRead", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+// Active contactless card(Type A,B,Mifare)
|
|
|
+// The first,second,third activation order decided by fstType,scdType,thdType respectively
|
|
|
+// fstType,scdType,thdType can be one of 'A','B','M','0'(30H,no type)
|
|
|
+// outType indicates the type of activation result
|
|
|
+//
|
|
|
+/************************************
|
|
|
+ Method : ActiveContactlessICCard
|
|
|
+ Function :
|
|
|
+ Parameter: char fstType
|
|
|
+ Parameter: char scdType
|
|
|
+ Parameter: char thdType
|
|
|
+ Parameter: char & outType
|
|
|
+ Returns : ErrorCodeEnum
|
|
|
+ author : CHR 2017/12/24
|
|
|
+ Remark :
|
|
|
+************************************/
|
|
|
+inline void HEX_2_DSP(unsigned char *hex,unsigned char *dsp,int count)
|
|
|
+{
|
|
|
+ unsigned buf[3];
|
|
|
+ int i;
|
|
|
+ for(i=0;i<count;i++){
|
|
|
+ sprintf((char *)buf, "%02X", (char *)hex[i]);
|
|
|
+ memcpy(&dsp[i*2], buf, 2);
|
|
|
+ }
|
|
|
+ dsp[count*2]=0x0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+ErrorCodeEnum CContactlessCard::ActiveContactlessICCard(char fstType,char scdType,char thdType,char &outType)
|
|
|
+{
|
|
|
+ LogARG(m_plogFile, Log_Infor, "ActiveContactlessICCard", "Enter");
|
|
|
+ LogARG(m_plogFile, Log_Infor, "ActiveContactlessICCard", "inputData: fstType = %x, scdType = %x, thdType = %x",fstType,scdType,thdType);
|
|
|
+
|
|
|
+ if(icdev <= 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "ActiveContactlessICCard", "icdev=NULL");
|
|
|
+ m_ErrorCode = GWI_Error_RF_ChipOn;
|
|
|
+ LogARG(m_plogFile, Log_Error, "ActiveContactlessICCard", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ int ret;
|
|
|
+ unsigned char pchInitData[256] = {0x00}, snr[32] = {0};
|
|
|
+ unsigned char snrlen = 0, rlen = 0;
|
|
|
+ unsigned char cardtype = 0x0A;
|
|
|
+ m_ErrorCode = GWI_Error_Succeed;
|
|
|
+
|
|
|
+ ret = mt.dev_open_card(icdev, 0, &cardtype, &snrlen, snr, (unsigned char*)&rlen, (unsigned char*)pchInitData);
|
|
|
+ if(ret != 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "ActiveContactlessICCard", "Err: dev_open_card ret = %d, pchInitData = %s",ret,pchInitData);
|
|
|
+ m_ErrorCode = GWI_Error_RF_ChipOn;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ char snrDispBuff[1024] = {0};
|
|
|
+ memset(snrDispBuff,0,sizeof(snrDispBuff));
|
|
|
+ HEX_2_DSP((unsigned char*)snr, (unsigned char *)snrDispBuff, snrlen);
|
|
|
+ char soutDispBuff[1024] = {0};
|
|
|
+ memset(soutDispBuff,0,sizeof(soutDispBuff));
|
|
|
+ HEX_2_DSP((unsigned char*)pchInitData, (unsigned char *)soutDispBuff, rlen);
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Debug, "ActiveContactlessICCard", "ret=[%d],cardtype=[%X],snrlen=[%d],snr=[%s],rlen=[%d],pchInitData=[%s]",ret,cardtype,snrlen,snrDispBuff,rlen,soutDispBuff);
|
|
|
+
|
|
|
+ outType = '0';
|
|
|
+ unsigned short DelayTime = 0x0500;
|
|
|
+ unsigned char BeepTimes = 1;
|
|
|
+ LogARG(m_plogFile, Log_Infor, "ActiveContactlessICCard", "dev_beep Entry");
|
|
|
+ int retB = mt.dev_beep(icdev, DelayTime, BeepTimes);
|
|
|
+ LogARG(m_plogFile, Log_Infor, "ActiveContactlessICCard", "dev_beep End ret=[%d]", ret);
|
|
|
+ }
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Infor, "ActiveContactlessICCard", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+}
|
|
|
+
|
|
|
+/************************************
|
|
|
+ Method : DeactContactlessICCard
|
|
|
+ Function : Deactivate contactless IC card
|
|
|
+ Returns : ErrorCodeEnum
|
|
|
+ author : CHR 2017/12/24
|
|
|
+ Remark :
|
|
|
+************************************/
|
|
|
+ErrorCodeEnum CContactlessCard::DeactContactlessICCard()
|
|
|
+{
|
|
|
+ LogARG(m_plogFile, Log_Infor, "DeactContactlessICCard", "Enter");
|
|
|
+ if(icdev <= 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "DeactContactlessICCard", "icdev=NULL");
|
|
|
+ m_ErrorCode = GWI_Error_RF_ChipOff;
|
|
|
+ LogARG(m_plogFile, Log_Error, "DeactContactlessICCard", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ int ret;
|
|
|
+ m_ErrorCode = GWI_Error_Succeed;
|
|
|
+
|
|
|
+ //ret =XFS_ChipPowerOff(icdev,0);
|
|
|
+ ret = mt.dev_rf_halt(icdev, 0);
|
|
|
+ if(ret != 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "DeactContactlessICCard", "Err: dev_rf_halt ret = %d",ret);
|
|
|
+ m_ErrorCode = GWI_Error_RF_ChipOff;
|
|
|
+ }
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Infor, "DeactContactlessICCard", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+}
|
|
|
+
|
|
|
+/************************************
|
|
|
+ Method : WarmReset
|
|
|
+ Function : Warm reset card(IC)
|
|
|
+ Returns : ErrorCodeEnum
|
|
|
+ author : CHR 2017/12/24
|
|
|
+ Remark :
|
|
|
+************************************/
|
|
|
+ErrorCodeEnum CContactlessCard::WarmReset()
|
|
|
+{
|
|
|
+ LogARG(m_plogFile, Log_Infor, "WarmReset", "Enter");
|
|
|
+
|
|
|
+ if(icdev <= 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "WarmReset", "icdev=NULL");
|
|
|
+ m_ErrorCode = GWI_Error_RF_ChipOn;
|
|
|
+ LogARG(m_plogFile, Log_Error, "WarmReset", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ int ret;
|
|
|
+ unsigned char pchInitData[256] = {0x00}, snr[32]={0};
|
|
|
+ unsigned char snrlen = 0, rlen = 0;
|
|
|
+ unsigned char cardtype = 0x0A;
|
|
|
+ m_ErrorCode = GWI_Error_Succeed;
|
|
|
+
|
|
|
+ ret = mt.dev_open_card(icdev, 0, &cardtype, &snrlen, snr, (unsigned char*)&rlen, (unsigned char*)pchInitData);
|
|
|
+ LogARG(m_plogFile, Log_Debug, "ActiveContactlessICCard", "ret=[%d],cardtype=[%X],snrlen=[%d],snr=[%s],rlen=[%d],pchInitData=[%s]",ret,cardtype,snrlen,snr,rlen,pchInitData);
|
|
|
+ if(ret != 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "WarmReset", "Err: dev_open_card ret = %d, pchInitData = %s",ret,pchInitData);
|
|
|
+ m_ErrorCode = GWI_Error_RF_ChipOn;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ unsigned short DelayTime=0x0500;
|
|
|
+ unsigned char BeepTimes=1;
|
|
|
+ LogARG(m_plogFile, Log_Infor, "WarmReset", "dev_beep Entry");
|
|
|
+ //int retB = XFS_device_beep(icdev, DelayTime, BeepTimes);
|
|
|
+ int retB = mt.dev_beep(icdev, DelayTime, BeepTimes);
|
|
|
+ LogARG(m_plogFile, Log_Infor, "WarmReset", "dev_beep End ret=[%d]", ret);
|
|
|
+ }
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Infor, "WarmReset", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+}
|
|
|
+//
|
|
|
+// Mifare operation
|
|
|
+// Arguments:
|
|
|
+// - eFunType:function type as load key,authentication and so on
|
|
|
+// - return/data(hex) byte order like BIG EDIAN. ex:0x12345678 --> data[i] = 0x12,data[i+1] = 0x34,data[i+2] = 0x56,data[i+3] = 0x78
|
|
|
+// - sendBuf:[parameter(hex)][data(hex)]
|
|
|
+// - recvBuf:[status(1byte)][return data(hex)]
|
|
|
+// -- [eFunType],[parameter,data],[status(1byte),return data]
|
|
|
+// -- [CI_MIFARE_LOAD_KEY],[key select(1byte),sector num(1byte),uncoded keys(6bytes)],[status(1byte)]
|
|
|
+// -- [CI_MIFARE_AUTH],[key select(1byte),sector num(1byte)],[status(1byte)]
|
|
|
+// -- [CI_MIFARE_READ],[block num(1byte)],[status(1byte),data(16bytes)]
|
|
|
+// -- [CI_MIFARE_WRITE],[block num(1byte),data(16bytes)],[status(1byte)]
|
|
|
+// -- [CI_MIFARE_INC],[source block num(1byte),destination block num(1byte),inc value(4bytes)],[status(1byte)]
|
|
|
+// -- [CI_MIFARE_DEC],[source block num(1byte),destination block num(1byte),dec value(4bytes)],[status(1byte)]
|
|
|
+// -- key select(1byte):AKey(00h),BKey(01h)
|
|
|
+// -- status(1byte):OK(00h),other error code(!00h)
|
|
|
+
|
|
|
+ErrorCodeEnum CContactlessCard::MifareCommand(MifareFuctionEnum eFunType,CmdInfo sendBuf,CmdInfo &recvBuf)
|
|
|
+{//TODO
|
|
|
+ m_ErrorCode = GWI_Error_Succeed;
|
|
|
+ LogARG(m_plogFile, Log_Infor, "MifareCommand", "Enter");
|
|
|
+ m_ErrorCode = GWI_Error_Dll_Method;
|
|
|
+ LogARG(m_plogFile, Log_Infor, "MifareCommand", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+}
|
|
|
+//
|
|
|
+// RF Type A,B command.
|
|
|
+// APDU:Application Protocol Data Unit
|
|
|
+// Arguments:
|
|
|
+// - CmdSend.lpCmd:Command-APDU
|
|
|
+// - CmdRecv.lpData:Response-APDU
|
|
|
+//
|
|
|
+ErrorCodeEnum CContactlessCard::RFTypeABCommand(CmdInfo sendBuf, CmdInfo &recvBuf)
|
|
|
+{
|
|
|
+ LogARG(m_plogFile, Log_Infor, "RFTypeABCommand", "Enter");
|
|
|
+ {
|
|
|
+ char sDispBuff[1024]={0};
|
|
|
+ memset(sDispBuff,0,sizeof(sDispBuff));
|
|
|
+ HEX_2_DSP((unsigned char*)sendBuf.data, (unsigned char *)sDispBuff, sendBuf.dwSize);
|
|
|
+ LogARG(m_plogFile, Log_Infor, "RFTypeABCommand", "DSP sendBuf.data = %s, sendBuf.dwSize = %d",(char*)sDispBuff,sendBuf.dwSize);
|
|
|
+ }
|
|
|
+ if(icdev <= 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "RFTypeABCommand", "icdev=NULL");
|
|
|
+ m_ErrorCode = GWI_Error_RF_Cmd;
|
|
|
+ LogARG(m_plogFile, Log_Error, "RFTypeABCommand", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ int ret;
|
|
|
+ unsigned char pchInitData[256] = {0x00}, snr[32] = {0};
|
|
|
+ unsigned char snrlen = 0, rlen = 0;
|
|
|
+ unsigned char cardtype = 0x0A;
|
|
|
+ m_ErrorCode = GWI_Error_Succeed;
|
|
|
+
|
|
|
+ ret = mt.dev_open_card(icdev, 0, &cardtype, &snrlen, snr, (unsigned char*)&rlen, (unsigned char*)pchInitData);
|
|
|
+ if(ret != 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "RFTypeABCommand", "Err: dev_open_card ret = %d, pchInitData = %s",ret,pchInitData);
|
|
|
+ m_ErrorCode = GWI_Error_RF_ChipOn;
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ int revlen = 0;
|
|
|
+ ret = mt.dev_card_APDU(icdev, 0xFF, sendBuf.dwSize, (unsigned char*)sendBuf.data, &revlen, recvBuf.data);
|
|
|
+ if(ret !=0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "RFTypeABCommand", "Err: dev_card_APDU ret = %d",ret);
|
|
|
+ m_ErrorCode = GWI_Error_RF_Cmd;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ recvBuf.dwSize = revlen;
|
|
|
+ char sDispBuff[1024]={0};
|
|
|
+ memset(sDispBuff,0,sizeof(sDispBuff));
|
|
|
+ HEX_2_DSP((unsigned char*)recvBuf.data, (unsigned char *)sDispBuff, recvBuf.dwSize);
|
|
|
+ LogARG(m_plogFile, Log_Infor, "RFTypeABCommand", "DSP recvBuf.data = %s, recvBuf.dwSize = %d",sDispBuff,recvBuf.dwSize);
|
|
|
+ }
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Infor, "RFTypeABCommand", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+}
|
|
|
+
|
|
|
+//halt card
|
|
|
+//card have been halted must move from induction zone then can be found again
|
|
|
+ErrorCodeEnum CContactlessCard::HaltCard()
|
|
|
+{
|
|
|
+ LogARG(m_plogFile, Log_Infor, "HaltCard", "Enter");
|
|
|
+ if(icdev <= 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "HaltCard", "icdev=NULL");
|
|
|
+ m_ErrorCode = GWI_Error_RF_Reset;
|
|
|
+ LogARG(m_plogFile, Log_Error, "HaltCard", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ int ret;
|
|
|
+ m_ErrorCode = GWI_Error_Succeed;
|
|
|
+
|
|
|
+ ret = mt.dev_rf_halt(icdev, 0);
|
|
|
+ if(ret != 0)
|
|
|
+ {
|
|
|
+ LogARG(m_plogFile, Log_Error, "HaltCard", "Err: dev_rf_halt ret = %d",ret);
|
|
|
+ m_ErrorCode = GWI_Error_RF_Reset;
|
|
|
+ }
|
|
|
+
|
|
|
+ LogARG(m_plogFile, Log_Infor, "HaltCard", "Exit: m_ErrorCode = %d",m_ErrorCode);
|
|
|
+ return ConvertErrorCode(m_ErrorCode);
|
|
|
+}
|