Browse Source

Z991239-5518 #comment feat: 增加cardissuerstore和cardissuerstand模拟器,以解决卡机使用同一个适配器的问题

陈纪林80310970 1 year ago
parent
commit
70943fd4a6

+ 44 - 0
DevAdapter/simulator/cardissuerstand.1.1/CMakeLists.txt

@@ -0,0 +1,44 @@
+rvc_dev_define_module("CardIssuerStand")
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+set(${MODULE_PREFIX}_SRCS SHARED
+        cardissuer_impl.h
+		cardissuer_impl.cpp
+        )
+
+
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+
+#头文件地址
+target_include_directories(${MODULE_FULL_NAME} PRIVATE
+	${DevHeadPath}
+	${ModuleCommonHeadPath}
+	${RVC_FRAMEWORK_INCLUDES_DIR}
+	${CONAN_RVCFRAMEWORK_ROOT}/include
+	${OTHER_LIB_BASE_DIR}/liblog4vendor
+	${OTHER_LIB_BASE_DIR}/libRestfulFunc
+	${CONAN_INCLUDE_DIRS_JSONCPP}
+	${RVC_TOOLKIT_INCLUDE_DIR}
+)
+
+#库链接地址
+target_link_directories(${MODULE_FULL_NAME} PRIVATE
+    ${CONAN_LIB_DIRS_JSONCPP}
+	${RVC_FRAMEWORK_LIBRARIES_DIR}
+	${ThirdPartyLib}
+	${CONAN_RVCFRAMEWORK_ROOT}/lib
+)
+
+#需要链接的库
+set(${MODULE_PREFIX}_LIBS RestfulFunc ${CONAN_PKG_LIBS_JSONCPP} RVCComm ${VENDOR_LOG_LIB_NAME})
+if(MSVC)
+	list(APPEND ${MODULE_PREFIX}_LIBS Ws2_32 IPHLPAPI)
+endif(MSVC)
+target_link_libraries(
+	${MODULE_FULL_NAME} ${${MODULE_PREFIX}_LIBS} 
+)
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 1553 - 0
DevAdapter/simulator/cardissuerstand.1.1/cardissuer_impl.cpp

@@ -0,0 +1,1553 @@
+// dllmain.cpp : 定义 DLL 应用程序的入口点。
+#include "stdafx.h"
+#include "cardissuer_impl.h"
+
+#include "log4vendor.h"
+#include "path.h"
+
+#ifdef RVC_OS_WIN
+#include <direct.h>
+#define GetCurrentDir _getcwd
+
+#else
+#include <unistd.h>
+#include<cstring>
+#include <cstdio>
+
+#include <netdb.h>  //gethostbyname
+#include <arpa/inet.h>  //ntohl
+#include <unistd.h> // Linux系统中
+#include <netdb.h>  
+#include <net/if.h>  
+#include <arpa/inet.h> 
+#include <sys/ioctl.h>  
+#include <sys/types.h>  
+#include <sys/socket.h>
+#include <netinet/in.h>
+#define GetCurrentDir getcwd
+
+#endif
+
+#define MAX_SHOW 1024
+#define MAX_TRACK_SIZE 512
+#define ENTITY_NAME "CardIssuerStand"
+
+
+#ifdef RVC_OS_WIN
+BOOL APIENTRY DllMain(HMODULE hModule,
+	DWORD  ul_reason_for_call,
+	LPVOID lpReserved
+)
+{
+	switch (ul_reason_for_call)
+	{
+	case DLL_PROCESS_ATTACH:
+	case DLL_THREAD_ATTACH:
+	case DLL_THREAD_DETACH:
+	case DLL_PROCESS_DETACH:
+		break;
+	}
+	return TRUE;
+}
+#endif
+
+
+string get_current_directory() {
+	char buff[256];
+	GetCurrentDir(buff, 256);
+	string  current_working_directory(buff);
+	return current_working_directory;
+}
+
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass*& pBaseObj)
+{
+	pBaseObj = new CardIssuerImpl();
+	if (pBaseObj == NULL) {
+		return Error_Resource;
+	}
+	cmb::log_init_config config;
+	config.dev_name = ENTITY_NAME;
+#ifdef RVC_OS_WIN
+	config.log_dir = ("C:\\rvc\\dbg\\");
+#else
+	config.log_dir = ("/opt/rvc/dbg/");
+#endif 
+	std::string str;
+	cmb::log4vendor::init(config, str);
+	printf("init after: %s\n", str.c_str());
+
+	return Error_Succeed;
+}
+DEVICEBASE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass*& pBaseObj)
+{
+	if (pBaseObj == NULL) {
+		return Error_Param;
+	}
+	if (CardIssuerImpl* pTmp = dynamic_cast<CardIssuerImpl*>(pBaseObj))
+	{
+		delete pTmp;
+		pTmp = NULL;
+		return Error_Succeed;
+	}
+	return Error_Param;
+}
+
+
+CardIssuerImpl::CardIssuerImpl()
+{
+
+}
+
+CardIssuerImpl::~CardIssuerImpl()
+{
+
+}
+
+ErrorCodeEnum CardIssuerImpl::GetDevCategory(DevCategoryInfo& devCategory)
+{
+	strcpy(devCategory.szModel, "szModel");
+	strcpy(devCategory.szType, "szType");
+	strcpy(devCategory.szVendor, "szVendor=cmbszSimulator");
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CardIssuerImpl::Reset()
+{
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CardIssuerImpl::DevClose()
+{
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CardIssuerImpl::GetLastErr(DevErrorInfo& devErrInfo)
+{
+	static int times = 0;
+	char szMessage[1024];
+	sprintf(szMessage, "这是第 %d 条错误信息", ++times);
+	strcpy(devErrInfo.szErrMsg, szMessage);
+	devErrInfo.dwErrMsgLen = strlen(szMessage);
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CardIssuerImpl::GetDevStatus(CardIssuerStatus& devStatus)
+{
+	if (GetDevStatusHttp(devStatus)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::GetDeviceSN(char*& pDevSN)
+{
+	if (GetDeviceSNHttp(pDevSN)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::MoveCard(CardPosEnum eCardPos, int hopperNo)
+{
+	if (MoveCardHttp(eCardPos, hopperNo)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::SetCardInType(CardInEnum eCardIn)
+{
+	if (SetCardInTypeHttp(eCardIn)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::MagRead(MagTracks& magTracks)
+{
+	if (MagReadHttp(magTracks)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::MagWrite(MagTracks magTracks, MagWriteModeEnum eWriteMode)
+{
+	if (MagWriteHttp(magTracks, eWriteMode)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ActiveICCard()
+{
+	if (ActiveICCardHttp()) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ContactIC()
+{
+	if (ContactICHttp()) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ReleaseIC()
+{
+	if (ReleaseICHttp()) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::WarmReset()
+{
+	if (WarmResetHttp()) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ICCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+	if (ICCommandHttp(sendBuf, recvBuf)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::SAMCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+	if (SAMCommandHttp(sendBuf, recvBuf)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ActiveICCardATR(CmdInfo& atrBuf)
+{
+	if (ActiveICCardATRHttp(atrBuf)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ActiveContactlessICCard(char fstType, char scdType, char thdType, char& outType)
+{
+	if (ActiveContactlessICCardHttp(fstType, scdType, thdType, outType)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::DeactivateICCard()
+{
+	if (DeactivateICCardHttp()) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::DeactContactlessICCard()
+{
+	if (DeactContactlessICCardHttp()) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::RFTypeABCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+	if (RFTypeABCommandHttp(sendBuf, recvBuf)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::DevOpenEx(DWORD dwPort, DWORD dwBaudRate, BYTE btOpenType, const char* pDevSN, BYTE& btType)
+{
+	LOG4VTM(INFO, "当前目录:" << get_current_directory());
+	depCfgPath = get_current_directory() + SPLIT_SLASH_STR + "dep" + SPLIT_SLASH_STR + "cmbsz.ini";
+	bool ret = iniRead.ReadConfig(depCfgPath);
+	if (ret == false)
+	{
+		LOG4VTM(INFO, "dep ReadConfig is Error,cfg=" << depCfgPath);
+	}
+	if (DevOpenExHttp(dwPort, dwBaudRate, btOpenType, pDevSN, btType)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::TransferEnInit(int& iStatus, BYTE*& Cr1, int& lenR1, BYTE*& Cr3, int& lenR3, BYTE*& dKey, int& lenKey)
+{
+	if (TransferEnInitHttp(iStatus, Cr1, lenR1, Cr3, lenR3, dKey, lenKey)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::SetR2(int& iStatus, BYTE* pCr2, int lenR2)
+{
+	if (SetR2Http(iStatus, pCr2, lenR2)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::SendWorkingKey(const char* pWorkingKey)
+{
+	if (SendWorkingKeyHttp(pWorkingKey)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::MoveCardToSlot(int slot)
+{
+	if (MoveCardToSlotHttp(slot)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::MoveCardFromSlot(int slot)
+{
+	if (MoveCardFromSlotHttp(slot)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ReadAccount(CardNo& cardNo)
+{
+	if (ReadAccountHttp(cardNo)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::GetSlotSum(int& sum)
+{
+	if (GetSlotSumHttp(sum)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::QuerySlotsStatus(SlotStatus& slots, const int slot, bool bFull /*= false*/)
+{
+	if (QuerySlotsStatusHttp(slots, slot, bFull)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::PrintCardFaceRightNow(const KakuPrintInfo printInfo)
+{
+	if (PrintCardFaceRightNowHttp(printInfo)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+/////////////////////////////////////////
+
+bool CardIssuerImpl::GetDevStatusHttp(CardIssuerStatus& devStatus)
+{
+	LOG4VTM(INFO, "GetDevStatusHttp");
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "GetDevStatus";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "GetDevStatusHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int eMediaRet = rootRet["data"]["eMedia"].asInt();
+					devStatus.eMedia = (CardStatusEnum)eMediaRet;
+
+					int eRetainBinRet = rootRet["data"]["eRetainBin"].asInt();
+					devStatus.eRetainBin = (RtBinStatusEnum)eRetainBinRet;
+
+					int dwRetainCountRet = rootRet["data"]["dwRetainCount"].asInt();
+					devStatus.dwRetainCount = dwRetainCountRet;
+
+					for (int i = 0; i < 12; i++) {
+						int eIssuerBinRet = rootRet["data"]["eIssuerBin"][i].asInt();
+						devStatus.eIssuerBin[i] = (IssHopperStatusEnum)eIssuerBinRet;
+					}
+					for (int i = 0; i < 12; i++) {
+						int dwIssuerCountRet = rootRet["data"]["dwIssuerCount"][i].asInt();
+						devStatus.dwIssuerCount[i] = dwIssuerCountRet;
+					}
+					for (int i = 0; i < 8; i++) {
+						int eKakuTapeRet = rootRet["data"]["eKakuTape"][i].asInt();
+						devStatus.eKakuTape[i] = (KakuPrintStatusEnum)eKakuTapeRet;
+					}
+
+					LOG4VTM(INFO, "GetDevStatusHttp devStatus.eMedia=" << devStatus.eMedia);
+					LOG4VTM(INFO, "GetDevStatusHttp devStatus.eRetainBin=" << devStatus.eRetainBin);
+					LOG4VTM(INFO, "GetDevStatusHttp devStatus.dwRetainCount=" << devStatus.dwRetainCount);
+
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "GetDevStatusHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "GetDevStatusHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "GetDevStatusHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::GetDeviceSNHttp(char*& pDevSN)
+{
+	LOG4VTM(INFO, "GetDeviceSNHttp");
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "GetDeviceSN";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "GetDeviceSNHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					string devSNStr = rootRet["data"]["devSN"].asString();;
+					strncpy(pDevSN, devSNStr.c_str(), (128 > devSNStr.length()) ? devSNStr.length() : 128);
+					LOG4VTM(INFO, "GetDeviceSNHttp devSN=" << devSNStr);
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "GetDeviceSNHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "GetDeviceSNHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "GetDeviceSNHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::MoveCardHttp(CardPosEnum eCardPos, int hopperNo)
+{
+
+	LOG4VTM(INFO, "MoveCardHttp eCardPos=" << eCardPos << " hopperNo=" << hopperNo);
+	return commonSimpleHttp("MoveCard");
+}
+
+bool CardIssuerImpl::SetCardInTypeHttp(CardInEnum eCardIn)
+{
+	LOG4VTM(INFO, "SetCardInTypeHttp eCardIn=" << eCardIn);
+	return commonSimpleHttp("SetCardInType");
+}
+
+bool CardIssuerImpl::MagReadHttp(MagTracks& magTracks)
+{
+	LOG4VTM(INFO, "MagReadHttp");
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "MagRead";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "MagReadHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int eRangeRet = rootRet["data"]["eRange"].asInt();
+					magTracks.eRange = (TrackRange)eRangeRet;
+					LOG4VTM(INFO, "MagReadHttp magTracks.eRange=" << magTracks.eRange);
+					for (int i = 0; i < 3; i++) {
+						int  eSourceRet = rootRet["data"]["track"][i]["eSource"].asInt();
+						magTracks.track[i].eSource = (TrackSrcEnum)eSourceRet;
+
+						int  eStatusRet = rootRet["data"]["track"][i]["eStatus"].asInt();
+						magTracks.track[i].eStatus = (TrackDataStateEnum)eStatusRet;
+
+						int  dwSizeRet = rootRet["data"]["track"][i]["dwSize"].asInt();
+						magTracks.track[i].dwSize = dwSizeRet;
+
+						string  dataRet = rootRet["data"]["track"][i]["data"].asString();
+						//PBYTE pData = new BYTE[MAX_SHOW];
+						//ZeroMemory(pData, MAX_SHOW);
+						//int dataLen = StrBuf2HexBuf(dataRet.c_str(), &pData);
+						//memcpy(magTracks.track[i].data, pData, dataLen);//赋值
+						//delete[] pData;
+						memcpy(magTracks.track[i].data, dataRet.c_str(), dwSizeRet);//赋值
+						LOG4VTM(INFO, "MagReadHttp magTracks.track.eSource=" << magTracks.track[i].eSource);
+						LOG4VTM(INFO, "MagReadHttp magTracks.track.eStatus=" << magTracks.track[i].eStatus);
+						LOG4VTM(INFO, "MagReadHttp magTracks.track.dwSize=" << magTracks.track[i].dwSize);
+						LOG4VTM(INFO, "MagReadHttp magTracks.track.data.len=" << strlen((const char*)magTracks.track[i].data));
+					}
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "MagReadHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "MagReadHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "MagReadHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::MagWriteHttp(MagTracks magTracks, MagWriteModeEnum eWriteMode)
+{
+	LOG4VTM(INFO, "MagWriteHttp eWriteMode=" << eWriteMode);
+	return commonSimpleHttp("MagWrite");
+}
+
+bool CardIssuerImpl::ActiveICCardHttp()
+{
+	LOG4VTM(INFO, "ActiveICCardHttp");
+	return commonSimpleHttp("ActiveICCard");
+}
+
+bool CardIssuerImpl::ContactICHttp()
+{
+	LOG4VTM(INFO, "ContactICHttp");
+	return commonSimpleHttp("ContactIC");
+}
+
+bool CardIssuerImpl::ReleaseICHttp()
+{
+	LOG4VTM(INFO, "ReleaseICHttp");
+	return commonSimpleHttp("ReleaseIC");
+}
+
+bool CardIssuerImpl::WarmResetHttp()
+{
+	LOG4VTM(INFO, "WarmResetHttp");
+	return commonSimpleHttp("WarmReset");
+}
+
+bool CardIssuerImpl::ICCommandHttp(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+	char* show = new char[MAX_SHOW];
+	ZeroMemory(show, MAX_SHOW);
+	HexBuf2StrBuf(sendBuf.data, &show, sendBuf.dwSize);
+
+	LOG4VTM(INFO, "ICCommandHttp sendBuf=" << show);
+
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "ICCommand";//适配器接口名
+	//rootReq["dwSize"] = CSimpleStringA::Format("%d",sendBuf.dwSize).GetData();
+	//rootReq["dwData"] = CSimpleStringA::Format("%s",show).GetData();
+
+
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	delete[] show;
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "ICCommandHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int dwSizeRet = rootRet["data"]["dwSize"].asInt();
+					string  dataRet = rootRet["data"]["data"].asString();
+
+					LOG4VTM(INFO, "ICCommandHttp recvBuf.dwSize=" << dwSizeRet << ", recvBuf.dwData=" << dataRet);
+					//反解析
+					PBYTE pData = new BYTE[MAX_SHOW];
+					ZeroMemory(pData, MAX_SHOW);
+					int dataLen = StrBuf2HexBuf(dataRet.c_str(), &pData);
+					ZeroMemory(recvBuf.data, MAX_SHOW);
+
+					memcpy(recvBuf.data, pData, dataLen);//赋值
+					recvBuf.dwSize = dataLen;//赋值
+					LOG4VTM(INFO, "ICCommandHttp recvBuf.dwSize=" << recvBuf.dwSize << ", recvBuf.dwData=" << dataRet);
+					delete[] pData;
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "ICCommandHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "ICCommandHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "ICCommandHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::SAMCommandHttp(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+	char* show = new char[MAX_SHOW];
+	ZeroMemory(show, MAX_SHOW);
+	HexBuf2StrBuf(sendBuf.data, &show, sendBuf.dwSize);
+
+	LOG4VTM(INFO, "SAMCommandHttp sendBuf=" << show);
+
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "SAMCommand";//适配器接口名
+	//rootReq["CmdInfo"]["dwSize"] = CSimpleStringA::Format("%d", sendBuf.dwSize).GetData();
+	//rootReq["CmdInfo"]["dwData"] = CSimpleStringA::Format("%s", show).GetData();
+
+
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	delete[] show;
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "SAMCommandHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int dwSizeRet = rootRet["data"]["dwSize"].asInt();
+					string  dataRet = rootRet["data"]["data"].asString();
+
+					LOG4VTM(INFO, "SAMCommandHttp recvBuf.dwSize=" << dwSizeRet << ", recvBuf.dwData=" << dataRet);
+					//反解析
+					PBYTE pData = new BYTE[MAX_SHOW];
+					ZeroMemory(pData, MAX_SHOW);
+					int dataLen = StrBuf2HexBuf(dataRet.c_str(), &pData);
+					ZeroMemory(recvBuf.data, MAX_SHOW);
+
+					memcpy(recvBuf.data, pData, dataLen);//赋值
+					recvBuf.dwSize = dataLen;//赋值
+					LOG4VTM(INFO, "SAMCommandHttp recvBuf.dwSize=" << recvBuf.dwSize << ", recvBuf.dwData=" << dataRet);
+					delete[] pData;
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "SAMCommandHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "SAMCommandHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "SAMCommandHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::ActiveICCardATRHttp(CmdInfo& atrBuf)
+{
+	LOG4VTM(INFO, "ActiveICCardATRHttp");
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "ActiveICCardATR";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "ActiveICCardATRHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int dwSizeRet = rootRet["data"]["dwSize"].asInt();
+					string  dataRet = rootRet["data"]["data"].asString();
+
+					LOG4VTM(INFO, "ActiveICCardATRHttp recvBuf.dwSize=" << dwSizeRet << ", recvBuf.dwData=" << dataRet);
+					//反解析
+					PBYTE pData = new BYTE[MAX_SHOW];
+					ZeroMemory(pData, MAX_SHOW);
+					int dataLen = StrBuf2HexBuf(dataRet.c_str(), &pData);
+					ZeroMemory(atrBuf.data, MAX_SHOW);
+
+					memcpy(atrBuf.data, pData, dataLen);//赋值
+					atrBuf.dwSize = dataLen;//赋值
+					LOG4VTM(INFO, "ActiveICCardATRHttp recvBuf.dwSize=" << atrBuf.dwSize << ", recvBuf.dwData=" << dataRet);
+					delete[] pData;
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "ActiveICCardATRHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "ActiveICCardATRHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "ActiveICCardATRHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::ActiveContactlessICCardHttp(char fstType, char scdType, char thdType, char& outType)
+{
+	LOG4VTM(INFO, "ActiveContactlessICCardHttp fstType=" << fstType << ", scdType=" << scdType << ", thdType=" << thdType);
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "ActiveContactlessICCard";//适配器接口名
+	//rootReq["fstType"] = fstType;
+	//rootReq["scdType"] = scdType;
+	//rootReq["thdType"] = thdType;
+
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "ActiveContactlessICCardHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					string outTypeRet = rootRet["data"]["outType"].asString();
+					outType = outTypeRet.c_str()[0];
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "ActiveContactlessICCardHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "ActiveContactlessICCardHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "ActiveContactlessICCardHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::DeactivateICCardHttp()
+{
+	LOG4VTM(INFO, "DeactivateICCardHttp");
+	return commonSimpleHttp("DeactivateICCard");
+}
+
+bool CardIssuerImpl::DeactContactlessICCardHttp()
+{
+	LOG4VTM(INFO, "DeactContactlessICCardHttp");
+	return commonSimpleHttp("DeactContactlessICCard");
+}
+
+bool CardIssuerImpl::RFTypeABCommandHttp(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+	char* show = new char[MAX_SHOW];
+	ZeroMemory(show, MAX_SHOW);
+	HexBuf2StrBuf(sendBuf.data, &show, sendBuf.dwSize);
+
+	LOG4VTM(INFO, "RFTypeABCommandHttp sendBuf=" << show);
+
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "RFTypeABCommand";//适配器接口名
+	//rootReq["CmdInfo"]["dwSize"] = (int)sendBuf.dwSize;
+	//rootReq["CmdInfo"]["dwData"] = show;
+
+
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	delete[] show;
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "RFTypeABCommandHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int dwSizeRet = rootRet["data"]["dwSize"].asInt();
+					string  dataRet = rootRet["data"]["data"].asString();
+
+					LOG4VTM(INFO, "RFTypeABCommandHttp recvBuf.dwSize=" << dwSizeRet << ", recvBuf.dwData=" << dataRet);
+					//反解析
+					PBYTE pData = new BYTE[MAX_SHOW];
+					ZeroMemory(pData, MAX_SHOW);
+					int dataLen = StrBuf2HexBuf(dataRet.c_str(), &pData);
+					ZeroMemory(recvBuf.data, MAX_SHOW);
+
+					memcpy(recvBuf.data, pData, dataLen);//赋值
+					recvBuf.dwSize = dataLen;//赋值
+					LOG4VTM(INFO, "RFTypeABCommandHttp recvBuf.dwSize=" << recvBuf.dwSize << ", recvBuf.dwData=" << dataRet);
+					delete[] pData;
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "RFTypeABCommandHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "RFTypeABCommandHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "RFTypeABCommandHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::DevOpenExHttp(DWORD dwPort, DWORD dwBaudRate, BYTE btOpenType, const char* pDevSN, BYTE& btType)
+{
+	LOG4VTM(INFO, "DevOpenExHttp dwPort=" << dwPort << " dwBaudRate=" << dwBaudRate << " btOpenType=" << btOpenType << " pDevSN=" << pDevSN);
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "DevOpenEx";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "DevOpenExHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int btTypeRet = rootRet["data"]["btType"].asInt();
+					btType = btTypeRet;
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "DevOpenExHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "DevOpenExHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "DevOpenExHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::TransferEnInitHttp(int& iStatus, BYTE*& Cr1, int& lenR1, BYTE*& Cr3, int& lenR3, BYTE*& dKey, int& lenKey)
+{
+	LOG4VTM(INFO, "TransferEnInitHttp");
+
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "TransferEnInit";//适配器接口名
+
+
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "TransferEnInitHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					iStatus = rootRet["data"]["iStatus"].asInt();
+					if (iStatus == 0) {
+						int lenR1Ret = rootRet["data"]["lenR1"].asInt();
+						lenR1 = lenR1Ret;
+						int lenR3Ret = rootRet["data"]["lenR3"].asInt();
+						lenR3 = lenR3Ret;
+						int lenKeyRet = rootRet["data"]["lenKey"].asInt();
+						lenKey = lenKeyRet;
+
+						string  Cr1Ret = rootRet["data"]["Cr1"].asString();
+						string  Cr3Ret = rootRet["data"]["Cr3"].asString();
+						string  dKeyRet = rootRet["data"]["dKey"].asString();
+
+						//PBYTE pData = new BYTE[2048];
+						//ZeroMemory(pData, 2048);
+						//int dataLen = StrBuf2HexBuf(Cr1Ret.c_str(), &pData);
+						//memcpy(Cr1, pData, dataLen);//赋值
+
+						//ZeroMemory(pData, MAX_TRACK_SIZE);
+						//dataLen = StrBuf2HexBuf(Cr3Ret.c_str(), &pData);
+						//memcpy(Cr3, pData, dataLen);//赋值
+
+						//ZeroMemory(pData, MAX_TRACK_SIZE);
+						//dataLen = StrBuf2HexBuf(dKeyRet.c_str(), &pData);
+						//memcpy(dKey, pData, dataLen);//赋值
+						//delete[] pData;
+						memcpy(Cr1, Cr1Ret.c_str(), lenR1Ret);//赋值
+						memcpy(Cr3, Cr3Ret.c_str(), lenR3Ret);//赋值
+						memcpy(dKey, dKeyRet.c_str(), lenKeyRet);//赋值
+
+						LOG4VTM(INFO, "TransferEnInitHttp lenR1" << lenR1);
+						LOG4VTM(INFO, "TransferEnInitHttp lenR3" << lenR3);
+						LOG4VTM(INFO, "TransferEnInitHttp lenKey" << lenKey);
+						LOG4VTM(INFO, "TransferEnInitHttp Cr1=" << sizeof(Cr1));
+						LOG4VTM(INFO, "TransferEnInitHttp Cr3=" << sizeof(Cr3));
+						LOG4VTM(INFO, "TransferEnInitHttp dKey=" << sizeof(dKey));
+						return true;
+					}
+					else {
+						return false;
+					}
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "TransferEnInitHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "TransferEnInitHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "TransferEnInitHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::SetR2Http(int& iStatus, BYTE* pCr2, int lenR2)
+{
+	LOG4VTM(INFO, "SetR2Http pCr2Len=" << sizeof(pCr2) << ", lenR2=" << lenR2);
+	if (commonSimpleHttp("SetR2")) {
+		iStatus = 0;
+		return true;
+	}
+	else {
+		iStatus = 1;
+		return false;
+	}
+}
+
+bool CardIssuerImpl::SendWorkingKeyHttp(const char* pWorkingKey)
+{
+	LOG4VTM(INFO, "SendWorkingKeyHttp pWorkingKey=" << pWorkingKey);
+	return commonSimpleHttp("SendWorkingKey");
+}
+
+
+
+bool CardIssuerImpl::MoveCardToSlotHttp(int slot)
+{
+	LOG4VTM(INFO, "MoveCardToSlotHttp slot=" << slot);
+	return commonSimpleHttp("MoveCardToSlot");
+}
+
+bool CardIssuerImpl::MoveCardFromSlotHttp(int slot)
+{
+	LOG4VTM(INFO, "MoveCardFromSlotHttp slot=" << slot);
+	return commonSimpleHttp("MoveCardFromSlot");
+}
+
+bool CardIssuerImpl::ReadAccountHttp(CardNo& cardNo)
+{
+	LOG4VTM(INFO, "ReadAccountHttp");
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "ReadAccount";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "ReadAccountHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int dwSizeRet = rootRet["data"]["dwSize"].asInt();
+					cardNo.dwSize = dwSizeRet;
+					int dwTrack2SizeRet = rootRet["data"]["dwTrack2Size"].asInt();
+					cardNo.dwTrack2Size = dwTrack2SizeRet;
+					int dwTrack3SizeRet = rootRet["data"]["dwTrack3Size"].asInt();
+					cardNo.dwTrack3Size = dwTrack3SizeRet;
+
+					string  accountRet = rootRet["data"]["account"].asString();
+					string  track2Ret = rootRet["data"]["track2"].asString();
+					string  track3Ret = rootRet["data"]["track3"].asString();
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.dwSize=" << cardNo.dwSize);
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.dwTrack2Size=" << cardNo.dwTrack2Size);
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.dwTrack3Size=" << cardNo.dwTrack3Size);
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.account=" << accountRet.c_str());
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.track2=" << track2Ret.c_str());
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.track3=" << track3Ret.c_str());
+
+					//PBYTE pData = new BYTE[MAX_MAG_TRACK_SIZE];
+					//ZeroMemory(pData, MAX_MAG_TRACK_SIZE);
+					//int dataLen = StrBuf2HexBuf(accountRet.c_str(), &pData);
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.account=" << pData);
+					//memcpy(cardNo.account, pData, dataLen);//赋值
+					//delete[] pData;
+
+					//pData = new BYTE[MAX_MAG_TRACK_SIZE];
+					//ZeroMemory(pData, MAX_MAG_TRACK_SIZE);
+					//dataLen = StrBuf2HexBuf(track2Ret.c_str(), &pData);
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.track2=" << pData);
+					//memcpy(cardNo.track2, pData, dataLen);//赋值
+					//delete[] pData;
+
+					//pData = new BYTE[MAX_MAG_TRACK_SIZE];
+					//ZeroMemory(pData, MAX_MAG_TRACK_SIZE);
+					//dataLen = StrBuf2HexBuf(track3Ret.c_str(), &pData);
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.track3=" << pData);
+					//memcpy(cardNo.track3, pData, dataLen);//赋值
+					//delete[] pData;
+					memcpy(cardNo.account, accountRet.c_str(), cardNo.dwSize);//赋值
+					memcpy(cardNo.track2, track2Ret.c_str(), cardNo.dwTrack2Size);//赋值
+					memcpy(cardNo.track3, track3Ret.c_str(), cardNo.dwTrack3Size);//赋值
+
+					LOG4VTM(INFO, "ReadAccountHttp cardNo.dwSize=" << cardNo.dwSize);
+					LOG4VTM(INFO, "Before dwTrack2Size");
+					LOG4VTM(INFO, "ReadAccountHttp cardNo.dwTrack2Size=" << cardNo.dwTrack2Size);
+					LOG4VTM(INFO, "After dwTrack2Size");
+					LOG4VTM(INFO, "ReadAccountHttp cardNo.dwTrack3Size=" << cardNo.dwTrack3Size);
+					LOG4VTM(INFO, "ReadAccountHttp cardNo.account=" << strlen(cardNo.account));
+					LOG4VTM(INFO, "ReadAccountHttp cardNo.track2=" << strlen(cardNo.track2));
+					LOG4VTM(INFO, "ReadAccountHttp cardNo.track3=" << strlen(cardNo.track3));
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "ReadAccountHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "ReadAccountHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "ReadAccountHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::GetSlotSumHttp(int& sum)
+{
+	LOG4VTM(INFO, "GetSlotSumHttp");
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "GetSlotSum";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "GetSlotSumHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int sumRet = rootRet["data"]["sum"].asInt();
+					sum = sumRet;
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "GetSlotSumHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "GetSlotSumHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "GetSlotSumHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::QuerySlotsStatusHttp(SlotStatus& slots, const int slot, bool bFull /*= false*/)
+{
+	LOG4VTM(INFO, "QuerySlotsStatusHttp slot=" << slot << " bFull=" << bFull);
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "QuerySlotsStatus";//适配器接口名
+	//rootReq["slot"] = slot;
+	//rootReq["bFull"] = bFull ? 1 : 0;//转换成0和1表示
+
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "QuerySlotsStatusHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int sumRet = rootRet["data"]["dwSize"].asInt();
+					slots.dwSize = sumRet;
+					for (int i = 0; i < sumRet; i++) {
+						slots.status[i] = rootRet["data"]["status"][i].asInt();
+					}
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "QuerySlotsStatusHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "QuerySlotsStatusHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "QuerySlotsStatusHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::PrintCardFaceRightNowHttp(const KakuPrintInfo printInfo)
+{
+	LOG4VTM(INFO, "PrintCardFaceRightNowHttp printInfo.formPath=" << printInfo.formPath << " printInfo.fields=" << printInfo.fields);
+	return commonSimpleHttp("PrintCardFaceRightNow");
+}
+
+string CardIssuerImpl::getUrl()
+{
+	string urlStr = iniRead.ReadString("server", "url", "");
+	if (urlStr.empty()) {
+		LOG4VTM(INFO, "url is empty, use default url");
+		return "http://localhost:8080/avs/imitate/simulateDataN";
+	}
+	else {
+		return urlStr;
+	}
+}
+
+bool CardIssuerImpl::commonSimpleHttp(string adapterInterName)
+{
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = adapterInterName;//适配器接口名
+	string strErrPrefix = adapterInterName + "http";
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, strErrPrefix << " parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, strErrPrefix << " return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, strErrPrefix << " [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, strErrPrefix << " req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+

+ 302 - 0
DevAdapter/simulator/cardissuerstand.1.1/cardissuer_impl.h

@@ -0,0 +1,302 @@
+#ifndef LIBFRAMEWORK_CARDISSUER_IMPL_H
+#define LIBFRAMEWORK_CARDISSUER_IMPL_H
+#include <SpBase.h>
+#include "CardIssuerClass.h"
+#include "../../DeviceSimulator.h"
+#include "IHttpFunc.h"
+#include "json/json.h"
+#include <string>
+
+using namespace std;
+
+typedef struct CommonReq : CHTTPReq {
+	string m_reqStr;
+	string ToJson() {
+		return m_reqStr;
+	}
+} CommonReq;
+
+typedef struct CommonRet : CHTTPRet {
+	string m_retStr;
+	bool Parse(string strData) {
+		m_retStr = strData;
+		return true;
+	}
+} CommonRet;
+
+class CardIssuerImpl : public CardIssuerClass
+{
+public:
+	CardIssuerImpl();
+	~CardIssuerImpl();
+	static void HttpsLogCallBack(const char* logtxt) {}
+
+	//DeviceBaseClass
+	ErrorCodeEnum GetDevCategory(DevCategoryInfo& devCategory);
+	ErrorCodeEnum Reset();
+	ErrorCodeEnum DevClose();
+	ErrorCodeEnum GetLastErr(DevErrorInfo& devErrInfo);
+
+	//本接口几乎废弃不用。连接卡机,请使用DevOpenEx替代本接口
+	ErrorCodeEnum DevOpen(DWORD dwPort, DWORD dwBaudRate) { return Error_NotImpl; }//废弃
+	
+	//	Get card issuer status
+	//使用(卡库,卡机)
+	ErrorCodeEnum GetDevStatus(CardIssuerStatus& devStatus);
+	//
+	//	Get device serial number.
+	//	设备唯一标识,且需贴在设备外壳上
+	// 使用(pad)
+	ErrorCodeEnum GetDeviceSN(char*& pDevSN) ;
+	//
+	//	Move card to specified position.
+	//	hopperNo:多卡箱发卡时指定发卡箱号(面对发卡机,从左往右依次是1,2,3,...号卡箱)
+	//		卡库:卡片从卡库加卡箱移动到读卡器,eCardPos为CI_MOVECARD_FROM_HOPPER,hopperNo固定传入99
+	//		卡库:卡片从卡库加卡箱移动到读卡器,若加卡箱已经无卡,返回Error_Dev_HopperHasNoCard
+	//使用(卡库,卡机)*****
+	ErrorCodeEnum MoveCard(CardPosEnum eCardPos, int hopperNo = 1) ;
+	//
+	//	Set card entry
+	//使用(卡库,卡机)*****
+	ErrorCodeEnum SetCardInType(CardInEnum eCardIn) ;
+
+	//
+	//	Read data from magnetic track.
+	//使用(卡库,卡机)
+	ErrorCodeEnum MagRead(MagTracks& magTracks) ;
+	
+	//	Write data to magnetic track.
+	//使用(卡库)*****
+	ErrorCodeEnum MagWrite(MagTracks magTracks, MagWriteModeEnum eWriteMode) ;
+	//
+	//	Set retract counter
+	ErrorCodeEnum SetRetractCounter(DWORD dwCount) { return Error_NotImpl; }	//废弃
+	//
+	//	Set issuer counter
+	//	hopperNo:多卡箱发卡时指定发卡箱号(面对发卡机,从左往右依次是1,2,3,...号卡箱)
+	ErrorCodeEnum SetIssuerCounter(DWORD dwCount, int hopperNo = 1) { return Error_NotImpl; }//废弃
+	//
+	//	Active contact IC card
+	//使用(卡库,卡机)*****
+	ErrorCodeEnum ActiveICCard() ;
+	//
+	//	Move IC card to contact position
+	//使用(卡库,卡机)*****
+	ErrorCodeEnum ContactIC() ;
+	//
+	//	Release IC contact
+	//使用(卡库,卡机)*****
+	ErrorCodeEnum ReleaseIC() ;
+	//
+	//	Warm reset card(IC)
+	//使用(卡库,卡机)*****
+	ErrorCodeEnum WarmReset() ;
+	
+	//	APDU:Application Protocol Data Unit
+	//	CmdSend.lpCmd:Command-APDU
+	//	CmdRecv.lpData:Response-APDU
+	//使用(卡库,卡机)
+	ErrorCodeEnum ICCommand(CmdInfo sendBuf, CmdInfo& recvBuf) ;
+	//////////////////SAM 卡操作部分////////////////////
+	ErrorCodeEnum SAMActive(BYTE vcc = 0x30) { return Error_NotImpl; }//使用(卡库,卡机)
+	ErrorCodeEnum SAMDeactivate() { return Error_NotImpl; }//使用(卡库,卡机)
+	ErrorCodeEnum SAMWarmReset() { return Error_NotImpl; }//使用(卡库,卡机)
+	ErrorCodeEnum SAMQueryStatus(SAMStatus& samStatus) { return Error_NotImpl; }//使用(卡库,卡机)
+	ErrorCodeEnum SAMSelect(const int sn) { return Error_NotImpl; }//使用(卡库,卡机)
+	//即时制卡卡库需要实现SAMCommand,用来执行apdu指令
+	ErrorCodeEnum SAMCommand(CmdInfo sendBuf, CmdInfo& recvBuf) ;//使用(卡库,卡机)
+	//即时制卡卡库需要实现ActiveICCardATR,用来激活卡片,返回ATR
+	ErrorCodeEnum ActiveICCardATR(CmdInfo& atrBuf) ;//使用(卡库,卡机)
+
+	////////////////卡面打印部分(非即时制卡的卡面印刷,即时制卡的卡面打印接口为PrintCardFaceRightNow),部分机型(例如合肥分行大机)有此功能//////////////////
+	ErrorCodeEnum Print(BYTE*& data, const int dataSize, const int side) { return Error_NotImpl; }//废弃
+	ErrorCodeEnum QueryPrinterStatus() { return Error_NotImpl; }//废弃
+
+	////////////////////////////////////////////////////////////////////////////
+	////////非接(IC)部分 start,没有此部分,在接口实现中直接返回Error_NotImpl///////////////
+	////////////////////////////////////////////////////////////////////////////
+	//	Active contactless IC 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
+	//
+	ErrorCodeEnum ActiveContactlessICCard(char fstType, char scdType, char thdType, char& outType) ;//使用(卡库,卡机)
+	//
+	//	Deactivate contact IC card *****
+	//
+	ErrorCodeEnum DeactivateICCard() ; //使用(卡库,卡机)
+	//
+	//	Deactivate contactless IC card *****
+	//
+	ErrorCodeEnum DeactContactlessICCard() ;//使用(卡库,卡机)
+	//
+	//	RF Mifare Classic protocol operation
+	//	Arguments:
+	//	- eFunType:function type as load key,authentication and so on
+	//	- sendBuf:[parameter][data]
+	//	- recvBuf:[status(1byte)][return data]
+	//
+	ErrorCodeEnum MifareCommand(MifareFuctionEnum eFunType, CmdInfo sendBuf, CmdInfo& recvBuf) { return Error_NotImpl; }//废弃
+	//
+	//	RF Type A,B command.
+	//	APDU:Application Protocol Data Unit
+	//	Arguments:
+	// 	- CmdSend.lpCmd:Command-APDU
+	// 	- CmdRecv.lpData:Response-APDU
+	//
+	ErrorCodeEnum RFTypeABCommand(CmdInfo sendBuf, CmdInfo& recvBuf) ;//使用(卡库,卡机)
+	////////非接(IC)部分 end/////////////////////////////////////////////////////////
+
+	//	发卡机调用打开设备
+	//	1. btOpenType:设定通过哪种方式连接设备,由DevOpenType的枚举值组合。usb及蓝牙设备连接可忽略dwPort,dwBaudRate
+	//	2.通过pDevSN来指定连接对应设备号的蓝牙发卡机(考虑存在多台发卡机的情况)
+	//		例如通过蓝牙或者usb连接设备,则btOpenType = (DEV_OPEN_TYPE_USB|DEV_OPEN_TYPE_BLUETOOTH)
+	//	3. btType返回设备实际通过哪种方式相连,返回值参考DevOpenType(大机,卡库参考下一条)
+	//	4.对于大机(柜式可视柜台,卡库)dwPort,dwBaudRate传入端口,波特率,btOpenType为DEV_OPEN_TYPE_COM,pDevSN为""
+	//		,btType返回值表示卡槽数量(例如目前存在单卡槽1,双卡槽2,三卡槽3的机型)
+	//	*****
+	ErrorCodeEnum DevOpenEx(DWORD dwPort, DWORD dwBaudRate, BYTE btOpenType, const char* pDevSN, BYTE& btType) ;//使用(卡库,卡机)
+
+	/////////////////////////////////////////////////////////////////////////
+	///以下是便携式卡机特有API,接口实现中其他机型直接返回Error_NotImpl即可//
+	/////////////////////////////////////////////////////////////////////////
+
+	//	返回值Error_Succeed表示成功,其他值表示失败
+	//	iStatus   0:成功   -1:银行公钥不存在   -2:产生设备密钥故障  -x:其他厂商自定义故障
+	//	Cr1:随机数r1的密文; Cr3:随机数r3的密文,dKey:用银行公钥加密的设备公钥密文
+	//	r1,r3第16字节为数据完整性校验字节,例如r1为B1B2...B15B16,则B16=B1^B2^...^B15
+	ErrorCodeEnum TransferEnInit(int& iStatus, BYTE*& Cr1, int& lenR1, BYTE*& Cr3, int& lenR3, BYTE*& dKey, int& lenKey) ;//使用(刷卡器)
+
+	//	返回值Error_Succeed表示成功,其他值表示失败
+	//	iStatus   0:成功   -x:厂商自定义故障
+	//	r2第16字节为数据完整性校验字节,例如r2为B1B2...B15B16,则B16=B1^B2^...^B15
+	ErrorCodeEnum SetR2(int& iStatus, BYTE* pCr2, int lenR2) ;//使用(刷卡器)
+	//
+	//	设置会话密钥
+	//	pWorkingKey:会话密钥,传递16进制的字符形式,例如0x123456FFAB  --> "123456FFAB"
+	ErrorCodeEnum SendWorkingKey(const char* pWorkingKey) ;//使用(刷卡器)
+
+	//安全锁接口部分 begin
+	ErrorCodeEnum SLLoadKey(const SCIKeyInfo key) { return Error_NotImpl; }// 使用(刷卡器) 废弃
+	//case ParamBeep: value:0,close beep;value:1,open beep
+	//case ParamLed: value:0,close led;value:1,open led
+	//case ParamLevelTime: value:the duration of level,100ms per unit
+	//		ex.	the value 10 means duration time is 1 second
+	 ErrorCodeEnum SLSetParam(SCIParamType eType, int value) { return Error_NotImpl; }//废弃
+	ErrorCodeEnum SLLock() { return Error_NotImpl; }//废弃
+	ErrorCodeEnum SLUnLock(const SCICheckCode checkCode, bool bTemp = true) { return Error_NotImpl; }//废弃
+	ErrorCodeEnum SLGetTempData(SCITempData& ksnData, SCITempData& ramData) { return Error_NotImpl; }//废弃
+	ErrorCodeEnum SLOpenDoor(const SCITempData data) { return Error_NotImpl; }//废弃
+	//安全锁接口部分 end
+
+	//蓝牙控制部分 start
+	//蓝牙指令控制,命令参看SCIBluetoothCMD说明
+	ErrorCodeEnum BluetoothControl(SCIBluetoothCMD eCmd) { return Error_NotImpl; }//废弃
+	//修改配对密码
+	ErrorCodeEnum BluetoothModifyKey(unsigned char* key) { return Error_NotImpl; }//废弃
+	//修改蓝牙设备名称
+	ErrorCodeEnum BluetoothModifyName(unsigned char* name) { return Error_NotImpl; }//废弃
+	//获取版本信息
+	ErrorCodeEnum BluetoothGetVersion(char*& version) { return Error_NotImpl; }//废弃
+	//获取连接设备名称
+	ErrorCodeEnum BluetoothGetConnectName(unsigned char*& name) { return Error_NotImpl; }//废弃
+	//获取连接设备信号强度
+	ErrorCodeEnum BluetoothGetSignalStrength(unsigned char*& signal) { return Error_NotImpl; }//废弃
+	//蓝牙控制部分 end
+
+	//控制灯光
+	//eLight:所控制的灯 ;
+	//bOnOff:true 亮灯;fasle 灭灯
+	ErrorCodeEnum LightControl(SCILightType eLight, bool bOnOff) { return Error_NotImpl; }//废弃
+	//以百分比数值返回剩余电量(1-100),例如剩余51%,则bat赋值为51
+	ErrorCodeEnum QueryBatteryPower(int& bat) { return Error_NotImpl; }//废弃
+	//oiltest
+	//virtual ErrorCodeEnum EncryptData(TempData ramData, TempData bdk, TempData curksn, TempData &encryptedData) ;
+	//把卡片从读卡器移动到指定卡槽位
+	 ErrorCodeEnum MoveCardToSlot(int slot) ;//使用(卡库,卡机)
+	//把卡片从指定卡槽位移动到读卡器
+	 ErrorCodeEnum MoveCardFromSlot(int slot) ;//使用(卡库,卡机)
+	//读取卡号
+	//优先从IC卡解析卡号,如果纯磁条卡,则返回磁道解析的卡号
+	 ErrorCodeEnum ReadAccount(CardNo& cardNo) ;//使用(卡库,卡机)
+	//获取总卡槽数
+	 ErrorCodeEnum GetSlotSum(int& sum) ;//使用(卡库,卡机)
+	//获取卡槽状态
+	 ErrorCodeEnum QuerySlotsStatus(SlotStatus& slots, const int slot, bool bFull = false) ;//使用(卡库,卡机)
+	//即时制卡卡库专用接口
+	 ErrorCodeEnum PrintCardFaceRightNow(const KakuPrintInfo printInfo) ;//使用(卡库,卡机)
+
+	 /////////////////////////////////////http实现///////////////////////////////////////
+
+
+	 bool GetDevStatusHttp(CardIssuerStatus& devStatus);
+
+	 bool GetDeviceSNHttp(char*& pDevSN);
+
+	 bool MoveCardHttp(CardPosEnum eCardPos, int hopperNo = 1);
+
+	 bool SetCardInTypeHttp(CardInEnum eCardIn);
+
+	 bool MagReadHttp(MagTracks& magTracks);
+
+	 bool MagWriteHttp(MagTracks magTracks, MagWriteModeEnum eWriteMode);
+
+	 bool ActiveICCardHttp();
+
+	 bool ContactICHttp();
+
+	 bool ReleaseICHttp();
+
+	 bool WarmResetHttp();
+
+	 bool ICCommandHttp(CmdInfo sendBuf, CmdInfo& recvBuf);
+	 //////////////////SAM 卡操作部分////////////////////
+
+	 bool SAMCommandHttp(CmdInfo sendBuf, CmdInfo& recvBuf);
+
+	 bool ActiveICCardATRHttp(CmdInfo& atrBuf);
+
+	 bool ActiveContactlessICCardHttp(char fstType, char scdType, char thdType, char& outType);
+
+	 bool DeactivateICCardHttp();
+
+	 bool DeactContactlessICCardHttp();
+
+	 bool RFTypeABCommandHttp(CmdInfo sendBuf, CmdInfo& recvBuf);
+
+	 bool DevOpenExHttp(DWORD dwPort, DWORD dwBaudRate, BYTE btOpenType, const char* pDevSN, BYTE& btType);
+
+	 /////////////////////////////////////////////////////////////////////////
+	 ///以下是便携式卡机刷卡器特有API,接口实现中其他机型直接返回Error_NotImpl即可//
+	 /////////////////////////////////////////////////////////////////////////
+
+	 bool TransferEnInitHttp(int& iStatus, BYTE*& Cr1, int& lenR1, BYTE*& Cr3, int& lenR3, BYTE*& dKey, int& lenKey);
+
+	 bool SetR2Http(int& iStatus, BYTE* pCr2, int lenR2);
+
+	 bool SendWorkingKeyHttp(const char* pWorkingKey);
+
+	 //////////////卡库使用/////////////////////
+
+	 bool MoveCardToSlotHttp(int slot);
+
+	 bool MoveCardFromSlotHttp(int slot);
+
+	 bool ReadAccountHttp(CardNo& cardNo);
+
+	 bool GetSlotSumHttp(int& sum);
+
+	 bool QuerySlotsStatusHttp(SlotStatus& slots, const int slot, bool bFull = false);
+
+	 bool PrintCardFaceRightNowHttp(const KakuPrintInfo printInfo);
+
+	 /////////////////////////////////////http实现///////////////////////////////////////
+
+	 string depCfgPath;
+	 iniReader iniRead;
+	 string getUrl();
+	 bool commonSimpleHttp(string adapterInterName);
+
+};
+
+#endif //LIBFRAMEWORK_CARDISSUER_IMPL_H

+ 44 - 0
DevAdapter/simulator/cardissuerstore.1.1/CMakeLists.txt

@@ -0,0 +1,44 @@
+rvc_dev_define_module("CardIssuerStore")
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+set(${MODULE_PREFIX}_SRCS SHARED
+        cardissuer_impl.h
+		cardissuer_impl.cpp
+        )
+
+
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+
+#头文件地址
+target_include_directories(${MODULE_FULL_NAME} PRIVATE
+	${DevHeadPath}
+	${ModuleCommonHeadPath}
+	${RVC_FRAMEWORK_INCLUDES_DIR}
+	${CONAN_RVCFRAMEWORK_ROOT}/include
+	${OTHER_LIB_BASE_DIR}/liblog4vendor
+	${OTHER_LIB_BASE_DIR}/libRestfulFunc
+	${CONAN_INCLUDE_DIRS_JSONCPP}
+	${RVC_TOOLKIT_INCLUDE_DIR}
+)
+
+#库链接地址
+target_link_directories(${MODULE_FULL_NAME} PRIVATE
+    ${CONAN_LIB_DIRS_JSONCPP}
+	${RVC_FRAMEWORK_LIBRARIES_DIR}
+	${ThirdPartyLib}
+	${CONAN_RVCFRAMEWORK_ROOT}/lib
+)
+
+#需要链接的库
+set(${MODULE_PREFIX}_LIBS RestfulFunc ${CONAN_PKG_LIBS_JSONCPP} RVCComm ${VENDOR_LOG_LIB_NAME})
+if(MSVC)
+	list(APPEND ${MODULE_PREFIX}_LIBS Ws2_32 IPHLPAPI)
+endif(MSVC)
+target_link_libraries(
+	${MODULE_FULL_NAME} ${${MODULE_PREFIX}_LIBS} 
+)
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 1553 - 0
DevAdapter/simulator/cardissuerstore.1.1/cardissuer_impl.cpp

@@ -0,0 +1,1553 @@
+// dllmain.cpp : 定义 DLL 应用程序的入口点。
+#include "stdafx.h"
+#include "cardissuer_impl.h"
+
+#include "log4vendor.h"
+#include "path.h"
+
+#ifdef RVC_OS_WIN
+#include <direct.h>
+#define GetCurrentDir _getcwd
+
+#else
+#include <unistd.h>
+#include<cstring>
+#include <cstdio>
+
+#include <netdb.h>  //gethostbyname
+#include <arpa/inet.h>  //ntohl
+#include <unistd.h> // Linux系统中
+#include <netdb.h>  
+#include <net/if.h>  
+#include <arpa/inet.h> 
+#include <sys/ioctl.h>  
+#include <sys/types.h>  
+#include <sys/socket.h>
+#include <netinet/in.h>
+#define GetCurrentDir getcwd
+
+#endif
+
+#define MAX_SHOW 1024
+#define MAX_TRACK_SIZE 512
+#define ENTITY_NAME "CardIssuerStore"
+
+
+#ifdef RVC_OS_WIN
+BOOL APIENTRY DllMain(HMODULE hModule,
+	DWORD  ul_reason_for_call,
+	LPVOID lpReserved
+)
+{
+	switch (ul_reason_for_call)
+	{
+	case DLL_PROCESS_ATTACH:
+	case DLL_THREAD_ATTACH:
+	case DLL_THREAD_DETACH:
+	case DLL_PROCESS_DETACH:
+		break;
+	}
+	return TRUE;
+}
+#endif
+
+
+string get_current_directory() {
+	char buff[256];
+	GetCurrentDir(buff, 256);
+	string  current_working_directory(buff);
+	return current_working_directory;
+}
+
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass*& pBaseObj)
+{
+	pBaseObj = new CardIssuerImpl();
+	if (pBaseObj == NULL) {
+		return Error_Resource;
+	}
+	cmb::log_init_config config;
+	config.dev_name = ENTITY_NAME;
+#ifdef RVC_OS_WIN
+	config.log_dir = ("C:\\rvc\\dbg\\");
+#else
+	config.log_dir = ("/opt/rvc/dbg/");
+#endif 
+	std::string str;
+	cmb::log4vendor::init(config, str);
+	printf("init after: %s\n", str.c_str());
+
+	return Error_Succeed;
+}
+DEVICEBASE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass*& pBaseObj)
+{
+	if (pBaseObj == NULL) {
+		return Error_Param;
+	}
+	if (CardIssuerImpl* pTmp = dynamic_cast<CardIssuerImpl*>(pBaseObj))
+	{
+		delete pTmp;
+		pTmp = NULL;
+		return Error_Succeed;
+	}
+	return Error_Param;
+}
+
+
+CardIssuerImpl::CardIssuerImpl()
+{
+
+}
+
+CardIssuerImpl::~CardIssuerImpl()
+{
+
+}
+
+ErrorCodeEnum CardIssuerImpl::GetDevCategory(DevCategoryInfo& devCategory)
+{
+	strcpy(devCategory.szModel, "szModel");
+	strcpy(devCategory.szType, "szType");
+	strcpy(devCategory.szVendor, "szVendor=cmbszSimulator");
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CardIssuerImpl::Reset()
+{
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CardIssuerImpl::DevClose()
+{
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CardIssuerImpl::GetLastErr(DevErrorInfo& devErrInfo)
+{
+	static int times = 0;
+	char szMessage[1024];
+	sprintf(szMessage, "这是第 %d 条错误信息", ++times);
+	strcpy(devErrInfo.szErrMsg, szMessage);
+	devErrInfo.dwErrMsgLen = strlen(szMessage);
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CardIssuerImpl::GetDevStatus(CardIssuerStatus& devStatus)
+{
+	if (GetDevStatusHttp(devStatus)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::GetDeviceSN(char*& pDevSN)
+{
+	if (GetDeviceSNHttp(pDevSN)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::MoveCard(CardPosEnum eCardPos, int hopperNo)
+{
+	if (MoveCardHttp(eCardPos, hopperNo)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::SetCardInType(CardInEnum eCardIn)
+{
+	if (SetCardInTypeHttp(eCardIn)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::MagRead(MagTracks& magTracks)
+{
+	if (MagReadHttp(magTracks)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::MagWrite(MagTracks magTracks, MagWriteModeEnum eWriteMode)
+{
+	if (MagWriteHttp(magTracks, eWriteMode)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ActiveICCard()
+{
+	if (ActiveICCardHttp()) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ContactIC()
+{
+	if (ContactICHttp()) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ReleaseIC()
+{
+	if (ReleaseICHttp()) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::WarmReset()
+{
+	if (WarmResetHttp()) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ICCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+	if (ICCommandHttp(sendBuf, recvBuf)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::SAMCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+	if (SAMCommandHttp(sendBuf, recvBuf)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ActiveICCardATR(CmdInfo& atrBuf)
+{
+	if (ActiveICCardATRHttp(atrBuf)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ActiveContactlessICCard(char fstType, char scdType, char thdType, char& outType)
+{
+	if (ActiveContactlessICCardHttp(fstType, scdType, thdType, outType)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::DeactivateICCard()
+{
+	if (DeactivateICCardHttp()) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::DeactContactlessICCard()
+{
+	if (DeactContactlessICCardHttp()) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::RFTypeABCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+	if (RFTypeABCommandHttp(sendBuf, recvBuf)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::DevOpenEx(DWORD dwPort, DWORD dwBaudRate, BYTE btOpenType, const char* pDevSN, BYTE& btType)
+{
+	LOG4VTM(INFO, "当前目录:" << get_current_directory());
+	depCfgPath = get_current_directory() + SPLIT_SLASH_STR + "dep" + SPLIT_SLASH_STR + "cmbsz.ini";
+	bool ret = iniRead.ReadConfig(depCfgPath);
+	if (ret == false)
+	{
+		LOG4VTM(INFO, "dep ReadConfig is Error,cfg=" << depCfgPath);
+	}
+	if (DevOpenExHttp(dwPort, dwBaudRate, btOpenType, pDevSN, btType)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::TransferEnInit(int& iStatus, BYTE*& Cr1, int& lenR1, BYTE*& Cr3, int& lenR3, BYTE*& dKey, int& lenKey)
+{
+	if (TransferEnInitHttp(iStatus, Cr1, lenR1, Cr3, lenR3, dKey, lenKey)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::SetR2(int& iStatus, BYTE* pCr2, int lenR2)
+{
+	if (SetR2Http(iStatus, pCr2, lenR2)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::SendWorkingKey(const char* pWorkingKey)
+{
+	if (SendWorkingKeyHttp(pWorkingKey)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::MoveCardToSlot(int slot)
+{
+	if (MoveCardToSlotHttp(slot)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::MoveCardFromSlot(int slot)
+{
+	if (MoveCardFromSlotHttp(slot)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::ReadAccount(CardNo& cardNo)
+{
+	if (ReadAccountHttp(cardNo)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::GetSlotSum(int& sum)
+{
+	if (GetSlotSumHttp(sum)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::QuerySlotsStatus(SlotStatus& slots, const int slot, bool bFull /*= false*/)
+{
+	if (QuerySlotsStatusHttp(slots, slot, bFull)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+ErrorCodeEnum CardIssuerImpl::PrintCardFaceRightNow(const KakuPrintInfo printInfo)
+{
+	if (PrintCardFaceRightNowHttp(printInfo)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+}
+
+/////////////////////////////////////////
+
+bool CardIssuerImpl::GetDevStatusHttp(CardIssuerStatus& devStatus)
+{
+	LOG4VTM(INFO, "GetDevStatusHttp");
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "GetDevStatus";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "GetDevStatusHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int eMediaRet = rootRet["data"]["eMedia"].asInt();
+					devStatus.eMedia = (CardStatusEnum)eMediaRet;
+
+					int eRetainBinRet = rootRet["data"]["eRetainBin"].asInt();
+					devStatus.eRetainBin = (RtBinStatusEnum)eRetainBinRet;
+
+					int dwRetainCountRet = rootRet["data"]["dwRetainCount"].asInt();
+					devStatus.dwRetainCount = dwRetainCountRet;
+
+					for (int i = 0; i < 12; i++) {
+						int eIssuerBinRet = rootRet["data"]["eIssuerBin"][i].asInt();
+						devStatus.eIssuerBin[i] = (IssHopperStatusEnum)eIssuerBinRet;
+					}
+					for (int i = 0; i < 12; i++) {
+						int dwIssuerCountRet = rootRet["data"]["dwIssuerCount"][i].asInt();
+						devStatus.dwIssuerCount[i] = dwIssuerCountRet;
+					}
+					for (int i = 0; i < 8; i++) {
+						int eKakuTapeRet = rootRet["data"]["eKakuTape"][i].asInt();
+						devStatus.eKakuTape[i] = (KakuPrintStatusEnum)eKakuTapeRet;
+					}
+
+					LOG4VTM(INFO, "GetDevStatusHttp devStatus.eMedia=" << devStatus.eMedia);
+					LOG4VTM(INFO, "GetDevStatusHttp devStatus.eRetainBin=" << devStatus.eRetainBin);
+					LOG4VTM(INFO, "GetDevStatusHttp devStatus.dwRetainCount=" << devStatus.dwRetainCount);
+
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "GetDevStatusHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "GetDevStatusHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "GetDevStatusHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::GetDeviceSNHttp(char*& pDevSN)
+{
+	LOG4VTM(INFO, "GetDeviceSNHttp");
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "GetDeviceSN";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "GetDeviceSNHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					string devSNStr = rootRet["data"]["devSN"].asString();;
+					strncpy(pDevSN, devSNStr.c_str(), (128 > devSNStr.length()) ? devSNStr.length() : 128);
+					LOG4VTM(INFO, "GetDeviceSNHttp devSN=" << devSNStr);
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "GetDeviceSNHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "GetDeviceSNHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "GetDeviceSNHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::MoveCardHttp(CardPosEnum eCardPos, int hopperNo)
+{
+
+	LOG4VTM(INFO, "MoveCardHttp eCardPos=" << eCardPos << " hopperNo=" << hopperNo);
+	return commonSimpleHttp("MoveCard");
+}
+
+bool CardIssuerImpl::SetCardInTypeHttp(CardInEnum eCardIn)
+{
+	LOG4VTM(INFO, "SetCardInTypeHttp eCardIn=" << eCardIn);
+	return commonSimpleHttp("SetCardInType");
+}
+
+bool CardIssuerImpl::MagReadHttp(MagTracks& magTracks)
+{
+	LOG4VTM(INFO, "MagReadHttp");
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "MagRead";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "MagReadHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int eRangeRet = rootRet["data"]["eRange"].asInt();
+					magTracks.eRange = (TrackRange)eRangeRet;
+					LOG4VTM(INFO, "MagReadHttp magTracks.eRange=" << magTracks.eRange);
+					for (int i = 0; i < 3; i++) {
+						int  eSourceRet = rootRet["data"]["track"][i]["eSource"].asInt();
+						magTracks.track[i].eSource = (TrackSrcEnum)eSourceRet;
+
+						int  eStatusRet = rootRet["data"]["track"][i]["eStatus"].asInt();
+						magTracks.track[i].eStatus = (TrackDataStateEnum)eStatusRet;
+
+						int  dwSizeRet = rootRet["data"]["track"][i]["dwSize"].asInt();
+						magTracks.track[i].dwSize = dwSizeRet;
+
+						string  dataRet = rootRet["data"]["track"][i]["data"].asString();
+						//PBYTE pData = new BYTE[MAX_SHOW];
+						//ZeroMemory(pData, MAX_SHOW);
+						//int dataLen = StrBuf2HexBuf(dataRet.c_str(), &pData);
+						//memcpy(magTracks.track[i].data, pData, dataLen);//赋值
+						//delete[] pData;
+						memcpy(magTracks.track[i].data, dataRet.c_str(), dwSizeRet);//赋值
+						LOG4VTM(INFO, "MagReadHttp magTracks.track.eSource=" << magTracks.track[i].eSource);
+						LOG4VTM(INFO, "MagReadHttp magTracks.track.eStatus=" << magTracks.track[i].eStatus);
+						LOG4VTM(INFO, "MagReadHttp magTracks.track.dwSize=" << magTracks.track[i].dwSize);
+						LOG4VTM(INFO, "MagReadHttp magTracks.track.data.len=" << strlen((const char*)magTracks.track[i].data));
+					}
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "MagReadHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "MagReadHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "MagReadHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::MagWriteHttp(MagTracks magTracks, MagWriteModeEnum eWriteMode)
+{
+	LOG4VTM(INFO, "MagWriteHttp eWriteMode=" << eWriteMode);
+	return commonSimpleHttp("MagWrite");
+}
+
+bool CardIssuerImpl::ActiveICCardHttp()
+{
+	LOG4VTM(INFO, "ActiveICCardHttp");
+	return commonSimpleHttp("ActiveICCard");
+}
+
+bool CardIssuerImpl::ContactICHttp()
+{
+	LOG4VTM(INFO, "ContactICHttp");
+	return commonSimpleHttp("ContactIC");
+}
+
+bool CardIssuerImpl::ReleaseICHttp()
+{
+	LOG4VTM(INFO, "ReleaseICHttp");
+	return commonSimpleHttp("ReleaseIC");
+}
+
+bool CardIssuerImpl::WarmResetHttp()
+{
+	LOG4VTM(INFO, "WarmResetHttp");
+	return commonSimpleHttp("WarmReset");
+}
+
+bool CardIssuerImpl::ICCommandHttp(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+	char* show = new char[MAX_SHOW];
+	ZeroMemory(show, MAX_SHOW);
+	HexBuf2StrBuf(sendBuf.data, &show, sendBuf.dwSize);
+
+	LOG4VTM(INFO, "ICCommandHttp sendBuf=" << show);
+
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "ICCommand";//适配器接口名
+	//rootReq["dwSize"] = CSimpleStringA::Format("%d",sendBuf.dwSize).GetData();
+	//rootReq["dwData"] = CSimpleStringA::Format("%s",show).GetData();
+
+
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	delete[] show;
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "ICCommandHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int dwSizeRet = rootRet["data"]["dwSize"].asInt();
+					string  dataRet = rootRet["data"]["data"].asString();
+
+					LOG4VTM(INFO, "ICCommandHttp recvBuf.dwSize=" << dwSizeRet << ", recvBuf.dwData=" << dataRet);
+					//反解析
+					PBYTE pData = new BYTE[MAX_SHOW];
+					ZeroMemory(pData, MAX_SHOW);
+					int dataLen = StrBuf2HexBuf(dataRet.c_str(), &pData);
+					ZeroMemory(recvBuf.data, MAX_SHOW);
+
+					memcpy(recvBuf.data, pData, dataLen);//赋值
+					recvBuf.dwSize = dataLen;//赋值
+					LOG4VTM(INFO, "ICCommandHttp recvBuf.dwSize=" << recvBuf.dwSize << ", recvBuf.dwData=" << dataRet);
+					delete[] pData;
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "ICCommandHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "ICCommandHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "ICCommandHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::SAMCommandHttp(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+	char* show = new char[MAX_SHOW];
+	ZeroMemory(show, MAX_SHOW);
+	HexBuf2StrBuf(sendBuf.data, &show, sendBuf.dwSize);
+
+	LOG4VTM(INFO, "SAMCommandHttp sendBuf=" << show);
+
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "SAMCommand";//适配器接口名
+	//rootReq["CmdInfo"]["dwSize"] = CSimpleStringA::Format("%d", sendBuf.dwSize).GetData();
+	//rootReq["CmdInfo"]["dwData"] = CSimpleStringA::Format("%s", show).GetData();
+
+
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	delete[] show;
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "SAMCommandHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int dwSizeRet = rootRet["data"]["dwSize"].asInt();
+					string  dataRet = rootRet["data"]["data"].asString();
+
+					LOG4VTM(INFO, "SAMCommandHttp recvBuf.dwSize=" << dwSizeRet << ", recvBuf.dwData=" << dataRet);
+					//反解析
+					PBYTE pData = new BYTE[MAX_SHOW];
+					ZeroMemory(pData, MAX_SHOW);
+					int dataLen = StrBuf2HexBuf(dataRet.c_str(), &pData);
+					ZeroMemory(recvBuf.data, MAX_SHOW);
+
+					memcpy(recvBuf.data, pData, dataLen);//赋值
+					recvBuf.dwSize = dataLen;//赋值
+					LOG4VTM(INFO, "SAMCommandHttp recvBuf.dwSize=" << recvBuf.dwSize << ", recvBuf.dwData=" << dataRet);
+					delete[] pData;
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "SAMCommandHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "SAMCommandHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "SAMCommandHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::ActiveICCardATRHttp(CmdInfo& atrBuf)
+{
+	LOG4VTM(INFO, "ActiveICCardATRHttp");
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "ActiveICCardATR";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "ActiveICCardATRHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int dwSizeRet = rootRet["data"]["dwSize"].asInt();
+					string  dataRet = rootRet["data"]["data"].asString();
+
+					LOG4VTM(INFO, "ActiveICCardATRHttp recvBuf.dwSize=" << dwSizeRet << ", recvBuf.dwData=" << dataRet);
+					//反解析
+					PBYTE pData = new BYTE[MAX_SHOW];
+					ZeroMemory(pData, MAX_SHOW);
+					int dataLen = StrBuf2HexBuf(dataRet.c_str(), &pData);
+					ZeroMemory(atrBuf.data, MAX_SHOW);
+
+					memcpy(atrBuf.data, pData, dataLen);//赋值
+					atrBuf.dwSize = dataLen;//赋值
+					LOG4VTM(INFO, "ActiveICCardATRHttp recvBuf.dwSize=" << atrBuf.dwSize << ", recvBuf.dwData=" << dataRet);
+					delete[] pData;
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "ActiveICCardATRHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "ActiveICCardATRHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "ActiveICCardATRHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::ActiveContactlessICCardHttp(char fstType, char scdType, char thdType, char& outType)
+{
+	LOG4VTM(INFO, "ActiveContactlessICCardHttp fstType=" << fstType << ", scdType=" << scdType << ", thdType=" << thdType);
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "ActiveContactlessICCard";//适配器接口名
+	//rootReq["fstType"] = fstType;
+	//rootReq["scdType"] = scdType;
+	//rootReq["thdType"] = thdType;
+
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "ActiveContactlessICCardHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					string outTypeRet = rootRet["data"]["outType"].asString();
+					outType = outTypeRet.c_str()[0];
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "ActiveContactlessICCardHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "ActiveContactlessICCardHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "ActiveContactlessICCardHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::DeactivateICCardHttp()
+{
+	LOG4VTM(INFO, "DeactivateICCardHttp");
+	return commonSimpleHttp("DeactivateICCard");
+}
+
+bool CardIssuerImpl::DeactContactlessICCardHttp()
+{
+	LOG4VTM(INFO, "DeactContactlessICCardHttp");
+	return commonSimpleHttp("DeactContactlessICCard");
+}
+
+bool CardIssuerImpl::RFTypeABCommandHttp(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+	char* show = new char[MAX_SHOW];
+	ZeroMemory(show, MAX_SHOW);
+	HexBuf2StrBuf(sendBuf.data, &show, sendBuf.dwSize);
+
+	LOG4VTM(INFO, "RFTypeABCommandHttp sendBuf=" << show);
+
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "RFTypeABCommand";//适配器接口名
+	//rootReq["CmdInfo"]["dwSize"] = (int)sendBuf.dwSize;
+	//rootReq["CmdInfo"]["dwData"] = show;
+
+
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	delete[] show;
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "RFTypeABCommandHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int dwSizeRet = rootRet["data"]["dwSize"].asInt();
+					string  dataRet = rootRet["data"]["data"].asString();
+
+					LOG4VTM(INFO, "RFTypeABCommandHttp recvBuf.dwSize=" << dwSizeRet << ", recvBuf.dwData=" << dataRet);
+					//反解析
+					PBYTE pData = new BYTE[MAX_SHOW];
+					ZeroMemory(pData, MAX_SHOW);
+					int dataLen = StrBuf2HexBuf(dataRet.c_str(), &pData);
+					ZeroMemory(recvBuf.data, MAX_SHOW);
+
+					memcpy(recvBuf.data, pData, dataLen);//赋值
+					recvBuf.dwSize = dataLen;//赋值
+					LOG4VTM(INFO, "RFTypeABCommandHttp recvBuf.dwSize=" << recvBuf.dwSize << ", recvBuf.dwData=" << dataRet);
+					delete[] pData;
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "RFTypeABCommandHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "RFTypeABCommandHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "RFTypeABCommandHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::DevOpenExHttp(DWORD dwPort, DWORD dwBaudRate, BYTE btOpenType, const char* pDevSN, BYTE& btType)
+{
+	LOG4VTM(INFO, "DevOpenExHttp dwPort=" << dwPort << " dwBaudRate=" << dwBaudRate << " btOpenType=" << btOpenType << " pDevSN=" << pDevSN);
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "DevOpenEx";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "DevOpenExHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int btTypeRet = rootRet["data"]["btType"].asInt();
+					btType = btTypeRet;
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "DevOpenExHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "DevOpenExHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "DevOpenExHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::TransferEnInitHttp(int& iStatus, BYTE*& Cr1, int& lenR1, BYTE*& Cr3, int& lenR3, BYTE*& dKey, int& lenKey)
+{
+	LOG4VTM(INFO, "TransferEnInitHttp");
+
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "TransferEnInit";//适配器接口名
+
+
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "TransferEnInitHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					iStatus = rootRet["data"]["iStatus"].asInt();
+					if (iStatus == 0) {
+						int lenR1Ret = rootRet["data"]["lenR1"].asInt();
+						lenR1 = lenR1Ret;
+						int lenR3Ret = rootRet["data"]["lenR3"].asInt();
+						lenR3 = lenR3Ret;
+						int lenKeyRet = rootRet["data"]["lenKey"].asInt();
+						lenKey = lenKeyRet;
+
+						string  Cr1Ret = rootRet["data"]["Cr1"].asString();
+						string  Cr3Ret = rootRet["data"]["Cr3"].asString();
+						string  dKeyRet = rootRet["data"]["dKey"].asString();
+
+						//PBYTE pData = new BYTE[2048];
+						//ZeroMemory(pData, 2048);
+						//int dataLen = StrBuf2HexBuf(Cr1Ret.c_str(), &pData);
+						//memcpy(Cr1, pData, dataLen);//赋值
+
+						//ZeroMemory(pData, MAX_TRACK_SIZE);
+						//dataLen = StrBuf2HexBuf(Cr3Ret.c_str(), &pData);
+						//memcpy(Cr3, pData, dataLen);//赋值
+
+						//ZeroMemory(pData, MAX_TRACK_SIZE);
+						//dataLen = StrBuf2HexBuf(dKeyRet.c_str(), &pData);
+						//memcpy(dKey, pData, dataLen);//赋值
+						//delete[] pData;
+						memcpy(Cr1, Cr1Ret.c_str(), lenR1Ret);//赋值
+						memcpy(Cr3, Cr3Ret.c_str(), lenR3Ret);//赋值
+						memcpy(dKey, dKeyRet.c_str(), lenKeyRet);//赋值
+
+						LOG4VTM(INFO, "TransferEnInitHttp lenR1" << lenR1);
+						LOG4VTM(INFO, "TransferEnInitHttp lenR3" << lenR3);
+						LOG4VTM(INFO, "TransferEnInitHttp lenKey" << lenKey);
+						LOG4VTM(INFO, "TransferEnInitHttp Cr1=" << sizeof(Cr1));
+						LOG4VTM(INFO, "TransferEnInitHttp Cr3=" << sizeof(Cr3));
+						LOG4VTM(INFO, "TransferEnInitHttp dKey=" << sizeof(dKey));
+						return true;
+					}
+					else {
+						return false;
+					}
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "TransferEnInitHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "TransferEnInitHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "TransferEnInitHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::SetR2Http(int& iStatus, BYTE* pCr2, int lenR2)
+{
+	LOG4VTM(INFO, "SetR2Http pCr2Len=" << sizeof(pCr2) << ", lenR2=" << lenR2);
+	if (commonSimpleHttp("SetR2")) {
+		iStatus = 0;
+		return true;
+	}
+	else {
+		iStatus = 1;
+		return false;
+	}
+}
+
+bool CardIssuerImpl::SendWorkingKeyHttp(const char* pWorkingKey)
+{
+	LOG4VTM(INFO, "SendWorkingKeyHttp pWorkingKey=" << pWorkingKey);
+	return commonSimpleHttp("SendWorkingKey");
+}
+
+
+
+bool CardIssuerImpl::MoveCardToSlotHttp(int slot)
+{
+	LOG4VTM(INFO, "MoveCardToSlotHttp slot=" << slot);
+	return commonSimpleHttp("MoveCardToSlot");
+}
+
+bool CardIssuerImpl::MoveCardFromSlotHttp(int slot)
+{
+	LOG4VTM(INFO, "MoveCardFromSlotHttp slot=" << slot);
+	return commonSimpleHttp("MoveCardFromSlot");
+}
+
+bool CardIssuerImpl::ReadAccountHttp(CardNo& cardNo)
+{
+	LOG4VTM(INFO, "ReadAccountHttp");
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "ReadAccount";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "ReadAccountHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int dwSizeRet = rootRet["data"]["dwSize"].asInt();
+					cardNo.dwSize = dwSizeRet;
+					int dwTrack2SizeRet = rootRet["data"]["dwTrack2Size"].asInt();
+					cardNo.dwTrack2Size = dwTrack2SizeRet;
+					int dwTrack3SizeRet = rootRet["data"]["dwTrack3Size"].asInt();
+					cardNo.dwTrack3Size = dwTrack3SizeRet;
+
+					string  accountRet = rootRet["data"]["account"].asString();
+					string  track2Ret = rootRet["data"]["track2"].asString();
+					string  track3Ret = rootRet["data"]["track3"].asString();
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.dwSize=" << cardNo.dwSize);
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.dwTrack2Size=" << cardNo.dwTrack2Size);
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.dwTrack3Size=" << cardNo.dwTrack3Size);
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.account=" << accountRet.c_str());
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.track2=" << track2Ret.c_str());
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.track3=" << track3Ret.c_str());
+
+					//PBYTE pData = new BYTE[MAX_MAG_TRACK_SIZE];
+					//ZeroMemory(pData, MAX_MAG_TRACK_SIZE);
+					//int dataLen = StrBuf2HexBuf(accountRet.c_str(), &pData);
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.account=" << pData);
+					//memcpy(cardNo.account, pData, dataLen);//赋值
+					//delete[] pData;
+
+					//pData = new BYTE[MAX_MAG_TRACK_SIZE];
+					//ZeroMemory(pData, MAX_MAG_TRACK_SIZE);
+					//dataLen = StrBuf2HexBuf(track2Ret.c_str(), &pData);
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.track2=" << pData);
+					//memcpy(cardNo.track2, pData, dataLen);//赋值
+					//delete[] pData;
+
+					//pData = new BYTE[MAX_MAG_TRACK_SIZE];
+					//ZeroMemory(pData, MAX_MAG_TRACK_SIZE);
+					//dataLen = StrBuf2HexBuf(track3Ret.c_str(), &pData);
+					//LOG4VTM(INFO, "ReadAccountHttp cardNo.track3=" << pData);
+					//memcpy(cardNo.track3, pData, dataLen);//赋值
+					//delete[] pData;
+					memcpy(cardNo.account, accountRet.c_str(), cardNo.dwSize);//赋值
+					memcpy(cardNo.track2, track2Ret.c_str(), cardNo.dwTrack2Size);//赋值
+					memcpy(cardNo.track3, track3Ret.c_str(), cardNo.dwTrack3Size);//赋值
+
+					LOG4VTM(INFO, "ReadAccountHttp cardNo.dwSize=" << cardNo.dwSize);
+					LOG4VTM(INFO, "Before dwTrack2Size");
+					LOG4VTM(INFO, "ReadAccountHttp cardNo.dwTrack2Size=" << cardNo.dwTrack2Size);
+					LOG4VTM(INFO, "After dwTrack2Size");
+					LOG4VTM(INFO, "ReadAccountHttp cardNo.dwTrack3Size=" << cardNo.dwTrack3Size);
+					LOG4VTM(INFO, "ReadAccountHttp cardNo.account=" << strlen(cardNo.account));
+					LOG4VTM(INFO, "ReadAccountHttp cardNo.track2=" << strlen(cardNo.track2));
+					LOG4VTM(INFO, "ReadAccountHttp cardNo.track3=" << strlen(cardNo.track3));
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "ReadAccountHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "ReadAccountHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "ReadAccountHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::GetSlotSumHttp(int& sum)
+{
+	LOG4VTM(INFO, "GetSlotSumHttp");
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "GetSlotSum";//适配器接口名
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "GetSlotSumHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int sumRet = rootRet["data"]["sum"].asInt();
+					sum = sumRet;
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "GetSlotSumHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "GetSlotSumHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "GetSlotSumHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::QuerySlotsStatusHttp(SlotStatus& slots, const int slot, bool bFull /*= false*/)
+{
+	LOG4VTM(INFO, "QuerySlotsStatusHttp slot=" << slot << " bFull=" << bFull);
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = "QuerySlotsStatus";//适配器接口名
+	//rootReq["slot"] = slot;
+	//rootReq["bFull"] = bFull ? 1 : 0;//转换成0和1表示
+
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "QuerySlotsStatusHttp parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					int sumRet = rootRet["data"]["dwSize"].asInt();
+					slots.dwSize = sumRet;
+					for (int i = 0; i < sumRet; i++) {
+						slots.status[i] = rootRet["data"]["status"][i].asInt();
+					}
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, "QuerySlotsStatusHttp return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, "QuerySlotsStatusHttp [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, "QuerySlotsStatusHttp req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool CardIssuerImpl::PrintCardFaceRightNowHttp(const KakuPrintInfo printInfo)
+{
+	LOG4VTM(INFO, "PrintCardFaceRightNowHttp printInfo.formPath=" << printInfo.formPath << " printInfo.fields=" << printInfo.fields);
+	return commonSimpleHttp("PrintCardFaceRightNow");
+}
+
+string CardIssuerImpl::getUrl()
+{
+	string urlStr = iniRead.ReadString("server", "url", "");
+	if (urlStr.empty()) {
+		LOG4VTM(INFO, "url is empty, use default url");
+		return "http://localhost:8080/avs/imitate/simulateDataN";
+	}
+	else {
+		return urlStr;
+	}
+}
+
+bool CardIssuerImpl::commonSimpleHttp(string adapterInterName)
+{
+	CommonReq cReq;
+	CommonRet cRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = ENTITY_NAME;
+	rootReq["adapterInterName"] = adapterInterName;//适配器接口名
+	string strErrPrefix = adapterInterName + "http";
+	cReq.m_url = getUrl();
+	cReq.m_timeOut = 30;
+	string jsonReq = writer.write(rootReq);
+	cReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(cReq, cRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(cRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, strErrPrefix << " parse resp is fail,url=" << cReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				bool isResult = rootRet["data"]["result"].asBool();
+				if (isResult) {
+					return true;
+				}
+				else {
+					return false;
+				}
+			}
+			else {
+				LOG4VTM(INFO, strErrPrefix << " return [data] is null");
+				return false;
+			}
+		}
+		else {
+			LOG4VTM(INFO, strErrPrefix << " [success] is false,");
+			return false;
+		}
+	}
+	else {
+		LOG4VTM(INFO, strErrPrefix << " req fail,err=%s" << cRet.m_errMsg.c_str());
+		return false;
+	}
+}
+

+ 302 - 0
DevAdapter/simulator/cardissuerstore.1.1/cardissuer_impl.h

@@ -0,0 +1,302 @@
+#ifndef LIBFRAMEWORK_CARDISSUER_IMPL_H
+#define LIBFRAMEWORK_CARDISSUER_IMPL_H
+#include <SpBase.h>
+#include "CardIssuerClass.h"
+#include "../../DeviceSimulator.h"
+#include "IHttpFunc.h"
+#include "json/json.h"
+#include <string>
+
+using namespace std;
+
+typedef struct CommonReq : CHTTPReq {
+	string m_reqStr;
+	string ToJson() {
+		return m_reqStr;
+	}
+} CommonReq;
+
+typedef struct CommonRet : CHTTPRet {
+	string m_retStr;
+	bool Parse(string strData) {
+		m_retStr = strData;
+		return true;
+	}
+} CommonRet;
+
+class CardIssuerImpl : public CardIssuerClass
+{
+public:
+	CardIssuerImpl();
+	~CardIssuerImpl();
+	static void HttpsLogCallBack(const char* logtxt) {}
+
+	//DeviceBaseClass
+	ErrorCodeEnum GetDevCategory(DevCategoryInfo& devCategory);
+	ErrorCodeEnum Reset();
+	ErrorCodeEnum DevClose();
+	ErrorCodeEnum GetLastErr(DevErrorInfo& devErrInfo);
+
+	//本接口几乎废弃不用。连接卡机,请使用DevOpenEx替代本接口
+	ErrorCodeEnum DevOpen(DWORD dwPort, DWORD dwBaudRate) { return Error_NotImpl; }//废弃
+	
+	//	Get card issuer status
+	//使用(卡库,卡机)
+	ErrorCodeEnum GetDevStatus(CardIssuerStatus& devStatus);
+	//
+	//	Get device serial number.
+	//	设备唯一标识,且需贴在设备外壳上
+	// 使用(pad)
+	ErrorCodeEnum GetDeviceSN(char*& pDevSN) ;
+	//
+	//	Move card to specified position.
+	//	hopperNo:多卡箱发卡时指定发卡箱号(面对发卡机,从左往右依次是1,2,3,...号卡箱)
+	//		卡库:卡片从卡库加卡箱移动到读卡器,eCardPos为CI_MOVECARD_FROM_HOPPER,hopperNo固定传入99
+	//		卡库:卡片从卡库加卡箱移动到读卡器,若加卡箱已经无卡,返回Error_Dev_HopperHasNoCard
+	//使用(卡库,卡机)*****
+	ErrorCodeEnum MoveCard(CardPosEnum eCardPos, int hopperNo = 1) ;
+	//
+	//	Set card entry
+	//使用(卡库,卡机)*****
+	ErrorCodeEnum SetCardInType(CardInEnum eCardIn) ;
+
+	//
+	//	Read data from magnetic track.
+	//使用(卡库,卡机)
+	ErrorCodeEnum MagRead(MagTracks& magTracks) ;
+	
+	//	Write data to magnetic track.
+	//使用(卡库)*****
+	ErrorCodeEnum MagWrite(MagTracks magTracks, MagWriteModeEnum eWriteMode) ;
+	//
+	//	Set retract counter
+	ErrorCodeEnum SetRetractCounter(DWORD dwCount) { return Error_NotImpl; }	//废弃
+	//
+	//	Set issuer counter
+	//	hopperNo:多卡箱发卡时指定发卡箱号(面对发卡机,从左往右依次是1,2,3,...号卡箱)
+	ErrorCodeEnum SetIssuerCounter(DWORD dwCount, int hopperNo = 1) { return Error_NotImpl; }//废弃
+	//
+	//	Active contact IC card
+	//使用(卡库,卡机)*****
+	ErrorCodeEnum ActiveICCard() ;
+	//
+	//	Move IC card to contact position
+	//使用(卡库,卡机)*****
+	ErrorCodeEnum ContactIC() ;
+	//
+	//	Release IC contact
+	//使用(卡库,卡机)*****
+	ErrorCodeEnum ReleaseIC() ;
+	//
+	//	Warm reset card(IC)
+	//使用(卡库,卡机)*****
+	ErrorCodeEnum WarmReset() ;
+	
+	//	APDU:Application Protocol Data Unit
+	//	CmdSend.lpCmd:Command-APDU
+	//	CmdRecv.lpData:Response-APDU
+	//使用(卡库,卡机)
+	ErrorCodeEnum ICCommand(CmdInfo sendBuf, CmdInfo& recvBuf) ;
+	//////////////////SAM 卡操作部分////////////////////
+	ErrorCodeEnum SAMActive(BYTE vcc = 0x30) { return Error_NotImpl; }//使用(卡库,卡机)
+	ErrorCodeEnum SAMDeactivate() { return Error_NotImpl; }//使用(卡库,卡机)
+	ErrorCodeEnum SAMWarmReset() { return Error_NotImpl; }//使用(卡库,卡机)
+	ErrorCodeEnum SAMQueryStatus(SAMStatus& samStatus) { return Error_NotImpl; }//使用(卡库,卡机)
+	ErrorCodeEnum SAMSelect(const int sn) { return Error_NotImpl; }//使用(卡库,卡机)
+	//即时制卡卡库需要实现SAMCommand,用来执行apdu指令
+	ErrorCodeEnum SAMCommand(CmdInfo sendBuf, CmdInfo& recvBuf) ;//使用(卡库,卡机)
+	//即时制卡卡库需要实现ActiveICCardATR,用来激活卡片,返回ATR
+	ErrorCodeEnum ActiveICCardATR(CmdInfo& atrBuf) ;//使用(卡库,卡机)
+
+	////////////////卡面打印部分(非即时制卡的卡面印刷,即时制卡的卡面打印接口为PrintCardFaceRightNow),部分机型(例如合肥分行大机)有此功能//////////////////
+	ErrorCodeEnum Print(BYTE*& data, const int dataSize, const int side) { return Error_NotImpl; }//废弃
+	ErrorCodeEnum QueryPrinterStatus() { return Error_NotImpl; }//废弃
+
+	////////////////////////////////////////////////////////////////////////////
+	////////非接(IC)部分 start,没有此部分,在接口实现中直接返回Error_NotImpl///////////////
+	////////////////////////////////////////////////////////////////////////////
+	//	Active contactless IC 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
+	//
+	ErrorCodeEnum ActiveContactlessICCard(char fstType, char scdType, char thdType, char& outType) ;//使用(卡库,卡机)
+	//
+	//	Deactivate contact IC card *****
+	//
+	ErrorCodeEnum DeactivateICCard() ; //使用(卡库,卡机)
+	//
+	//	Deactivate contactless IC card *****
+	//
+	ErrorCodeEnum DeactContactlessICCard() ;//使用(卡库,卡机)
+	//
+	//	RF Mifare Classic protocol operation
+	//	Arguments:
+	//	- eFunType:function type as load key,authentication and so on
+	//	- sendBuf:[parameter][data]
+	//	- recvBuf:[status(1byte)][return data]
+	//
+	ErrorCodeEnum MifareCommand(MifareFuctionEnum eFunType, CmdInfo sendBuf, CmdInfo& recvBuf) { return Error_NotImpl; }//废弃
+	//
+	//	RF Type A,B command.
+	//	APDU:Application Protocol Data Unit
+	//	Arguments:
+	// 	- CmdSend.lpCmd:Command-APDU
+	// 	- CmdRecv.lpData:Response-APDU
+	//
+	ErrorCodeEnum RFTypeABCommand(CmdInfo sendBuf, CmdInfo& recvBuf) ;//使用(卡库,卡机)
+	////////非接(IC)部分 end/////////////////////////////////////////////////////////
+
+	//	发卡机调用打开设备
+	//	1. btOpenType:设定通过哪种方式连接设备,由DevOpenType的枚举值组合。usb及蓝牙设备连接可忽略dwPort,dwBaudRate
+	//	2.通过pDevSN来指定连接对应设备号的蓝牙发卡机(考虑存在多台发卡机的情况)
+	//		例如通过蓝牙或者usb连接设备,则btOpenType = (DEV_OPEN_TYPE_USB|DEV_OPEN_TYPE_BLUETOOTH)
+	//	3. btType返回设备实际通过哪种方式相连,返回值参考DevOpenType(大机,卡库参考下一条)
+	//	4.对于大机(柜式可视柜台,卡库)dwPort,dwBaudRate传入端口,波特率,btOpenType为DEV_OPEN_TYPE_COM,pDevSN为""
+	//		,btType返回值表示卡槽数量(例如目前存在单卡槽1,双卡槽2,三卡槽3的机型)
+	//	*****
+	ErrorCodeEnum DevOpenEx(DWORD dwPort, DWORD dwBaudRate, BYTE btOpenType, const char* pDevSN, BYTE& btType) ;//使用(卡库,卡机)
+
+	/////////////////////////////////////////////////////////////////////////
+	///以下是便携式卡机特有API,接口实现中其他机型直接返回Error_NotImpl即可//
+	/////////////////////////////////////////////////////////////////////////
+
+	//	返回值Error_Succeed表示成功,其他值表示失败
+	//	iStatus   0:成功   -1:银行公钥不存在   -2:产生设备密钥故障  -x:其他厂商自定义故障
+	//	Cr1:随机数r1的密文; Cr3:随机数r3的密文,dKey:用银行公钥加密的设备公钥密文
+	//	r1,r3第16字节为数据完整性校验字节,例如r1为B1B2...B15B16,则B16=B1^B2^...^B15
+	ErrorCodeEnum TransferEnInit(int& iStatus, BYTE*& Cr1, int& lenR1, BYTE*& Cr3, int& lenR3, BYTE*& dKey, int& lenKey) ;//使用(刷卡器)
+
+	//	返回值Error_Succeed表示成功,其他值表示失败
+	//	iStatus   0:成功   -x:厂商自定义故障
+	//	r2第16字节为数据完整性校验字节,例如r2为B1B2...B15B16,则B16=B1^B2^...^B15
+	ErrorCodeEnum SetR2(int& iStatus, BYTE* pCr2, int lenR2) ;//使用(刷卡器)
+	//
+	//	设置会话密钥
+	//	pWorkingKey:会话密钥,传递16进制的字符形式,例如0x123456FFAB  --> "123456FFAB"
+	ErrorCodeEnum SendWorkingKey(const char* pWorkingKey) ;//使用(刷卡器)
+
+	//安全锁接口部分 begin
+	ErrorCodeEnum SLLoadKey(const SCIKeyInfo key) { return Error_NotImpl; }// 使用(刷卡器) 废弃
+	//case ParamBeep: value:0,close beep;value:1,open beep
+	//case ParamLed: value:0,close led;value:1,open led
+	//case ParamLevelTime: value:the duration of level,100ms per unit
+	//		ex.	the value 10 means duration time is 1 second
+	 ErrorCodeEnum SLSetParam(SCIParamType eType, int value) { return Error_NotImpl; }//废弃
+	ErrorCodeEnum SLLock() { return Error_NotImpl; }//废弃
+	ErrorCodeEnum SLUnLock(const SCICheckCode checkCode, bool bTemp = true) { return Error_NotImpl; }//废弃
+	ErrorCodeEnum SLGetTempData(SCITempData& ksnData, SCITempData& ramData) { return Error_NotImpl; }//废弃
+	ErrorCodeEnum SLOpenDoor(const SCITempData data) { return Error_NotImpl; }//废弃
+	//安全锁接口部分 end
+
+	//蓝牙控制部分 start
+	//蓝牙指令控制,命令参看SCIBluetoothCMD说明
+	ErrorCodeEnum BluetoothControl(SCIBluetoothCMD eCmd) { return Error_NotImpl; }//废弃
+	//修改配对密码
+	ErrorCodeEnum BluetoothModifyKey(unsigned char* key) { return Error_NotImpl; }//废弃
+	//修改蓝牙设备名称
+	ErrorCodeEnum BluetoothModifyName(unsigned char* name) { return Error_NotImpl; }//废弃
+	//获取版本信息
+	ErrorCodeEnum BluetoothGetVersion(char*& version) { return Error_NotImpl; }//废弃
+	//获取连接设备名称
+	ErrorCodeEnum BluetoothGetConnectName(unsigned char*& name) { return Error_NotImpl; }//废弃
+	//获取连接设备信号强度
+	ErrorCodeEnum BluetoothGetSignalStrength(unsigned char*& signal) { return Error_NotImpl; }//废弃
+	//蓝牙控制部分 end
+
+	//控制灯光
+	//eLight:所控制的灯 ;
+	//bOnOff:true 亮灯;fasle 灭灯
+	ErrorCodeEnum LightControl(SCILightType eLight, bool bOnOff) { return Error_NotImpl; }//废弃
+	//以百分比数值返回剩余电量(1-100),例如剩余51%,则bat赋值为51
+	ErrorCodeEnum QueryBatteryPower(int& bat) { return Error_NotImpl; }//废弃
+	//oiltest
+	//virtual ErrorCodeEnum EncryptData(TempData ramData, TempData bdk, TempData curksn, TempData &encryptedData) ;
+	//把卡片从读卡器移动到指定卡槽位
+	 ErrorCodeEnum MoveCardToSlot(int slot) ;//使用(卡库,卡机)
+	//把卡片从指定卡槽位移动到读卡器
+	 ErrorCodeEnum MoveCardFromSlot(int slot) ;//使用(卡库,卡机)
+	//读取卡号
+	//优先从IC卡解析卡号,如果纯磁条卡,则返回磁道解析的卡号
+	 ErrorCodeEnum ReadAccount(CardNo& cardNo) ;//使用(卡库,卡机)
+	//获取总卡槽数
+	 ErrorCodeEnum GetSlotSum(int& sum) ;//使用(卡库,卡机)
+	//获取卡槽状态
+	 ErrorCodeEnum QuerySlotsStatus(SlotStatus& slots, const int slot, bool bFull = false) ;//使用(卡库,卡机)
+	//即时制卡卡库专用接口
+	 ErrorCodeEnum PrintCardFaceRightNow(const KakuPrintInfo printInfo) ;//使用(卡库,卡机)
+
+	 /////////////////////////////////////http实现///////////////////////////////////////
+
+
+	 bool GetDevStatusHttp(CardIssuerStatus& devStatus);
+
+	 bool GetDeviceSNHttp(char*& pDevSN);
+
+	 bool MoveCardHttp(CardPosEnum eCardPos, int hopperNo = 1);
+
+	 bool SetCardInTypeHttp(CardInEnum eCardIn);
+
+	 bool MagReadHttp(MagTracks& magTracks);
+
+	 bool MagWriteHttp(MagTracks magTracks, MagWriteModeEnum eWriteMode);
+
+	 bool ActiveICCardHttp();
+
+	 bool ContactICHttp();
+
+	 bool ReleaseICHttp();
+
+	 bool WarmResetHttp();
+
+	 bool ICCommandHttp(CmdInfo sendBuf, CmdInfo& recvBuf);
+	 //////////////////SAM 卡操作部分////////////////////
+
+	 bool SAMCommandHttp(CmdInfo sendBuf, CmdInfo& recvBuf);
+
+	 bool ActiveICCardATRHttp(CmdInfo& atrBuf);
+
+	 bool ActiveContactlessICCardHttp(char fstType, char scdType, char thdType, char& outType);
+
+	 bool DeactivateICCardHttp();
+
+	 bool DeactContactlessICCardHttp();
+
+	 bool RFTypeABCommandHttp(CmdInfo sendBuf, CmdInfo& recvBuf);
+
+	 bool DevOpenExHttp(DWORD dwPort, DWORD dwBaudRate, BYTE btOpenType, const char* pDevSN, BYTE& btType);
+
+	 /////////////////////////////////////////////////////////////////////////
+	 ///以下是便携式卡机刷卡器特有API,接口实现中其他机型直接返回Error_NotImpl即可//
+	 /////////////////////////////////////////////////////////////////////////
+
+	 bool TransferEnInitHttp(int& iStatus, BYTE*& Cr1, int& lenR1, BYTE*& Cr3, int& lenR3, BYTE*& dKey, int& lenKey);
+
+	 bool SetR2Http(int& iStatus, BYTE* pCr2, int lenR2);
+
+	 bool SendWorkingKeyHttp(const char* pWorkingKey);
+
+	 //////////////卡库使用/////////////////////
+
+	 bool MoveCardToSlotHttp(int slot);
+
+	 bool MoveCardFromSlotHttp(int slot);
+
+	 bool ReadAccountHttp(CardNo& cardNo);
+
+	 bool GetSlotSumHttp(int& sum);
+
+	 bool QuerySlotsStatusHttp(SlotStatus& slots, const int slot, bool bFull = false);
+
+	 bool PrintCardFaceRightNowHttp(const KakuPrintInfo printInfo);
+
+	 /////////////////////////////////////http实现///////////////////////////////////////
+
+	 string depCfgPath;
+	 iniReader iniRead;
+	 string getUrl();
+	 bool commonSimpleHttp(string adapterInterName);
+
+};
+
+#endif //LIBFRAMEWORK_CARDISSUER_IMPL_H

+ 12 - 8
Module/include/DevEntityCommBase.hpp

@@ -155,24 +155,28 @@ inline ErrorCodeEnum CDevAdptEntityBase::ExtractVendorLibName()
 	ErrorCodeEnum erroCode = GetFunction()->OpenConfig(Config_Root, spRootConfig);
 	if (IS_SUCCEED(erroCode)) 
 	{
-		CSimpleStringA strDeviceEntityName = GetEntityName();
-		if (strDeviceEntityName.Compare("CardIssuerStore", true) == 0 || strDeviceEntityName.Compare("CardIssuerStand", true) == 0) {
-			strDeviceEntityName = "CardIssuer";
-		}
-		CSimpleStringA strSection = CSimpleStringA("Device.") + strDeviceEntityName;
-		vendorLibInfo.strDevice = strDeviceEntityName;
+		CSimpleStringA strDeviceEntityName = GetEntityName();		
 		
 		CSystemRunInfo runInfo = { 0 };
 		ErrorCodeEnum ec = GetFunction()->GetSystemRunInfo(runInfo);
-
-		if (runInfo.autoTest) //识别成测试模式的条件
+		if (ec == Error_Succeed && runInfo.autoTest) //识别成测试模式的条件
 		{
+			vendorLibInfo.strDevice = strDeviceEntityName;
 			vendorLibInfo.strVendor = "simulator";
 			vendorLibInfo.strVersion = "1";
 			vendorLibInfo.strBatch = "1";
 		}
 		else
 		{
+			if (strDeviceEntityName.Compare("CardIssuerStore", true) == 0 || strDeviceEntityName.Compare("CardIssuerStand", true) == 0) {
+				strDeviceEntityName = "CardIssuer";
+			}
+			CSimpleStringA strSection = CSimpleStringA("Device.") + strDeviceEntityName;
+			vendorLibInfo.strDevice = strDeviceEntityName;
+
+			CSystemRunInfo runInfo = { 0 };
+			ErrorCodeEnum ec = GetFunction()->GetSystemRunInfo(runInfo);
+
 			spRootConfig->ReadConfigValue(strSection, "Vendor", vendorLibInfo.strVendor);
 			spRootConfig->ReadConfigValue(strSection, "Version", vendorLibInfo.strVersion);
 			spRootConfig->ReadConfigValue(strSection, "Batch", vendorLibInfo.strBatch);