Răsfoiți Sursa

!10426 1.可视柜台终端跨平台优化_准入实体跨平台功能优化 2. 可视柜台自动化验证_终端应用测试模式启动改造
Merge pull request !10426 from 80310970/T24NX471_AccessHttpMerge_0814

Gifur 1 an în urmă
părinte
comite
0ffea6cebd

+ 6 - 0
CMakeLists.txt

@@ -716,12 +716,17 @@ if(DEVOPS_ON)
 	endif(DEVOPS_ON_CMAKE_PRD)
 endif(DEVOPS_ON)
 
+if(NOT DEVOPS_ON_CMAKE_PRD)
+	install(PROGRAMS "${CMAKE_SOURCE_DIR}/addin/cfg/simulator/cmbsz.ini" DESTINATION ${RVC_VENDOR_PATH} COMPONENT scripts)
+endif(NOT DEVOPS_ON_CMAKE_PRD)
+
 if(MSVC)
 	configure_file("${CMAKE_SOURCE_DIR}/addin/packaging/WIN/installbat.in" "${CMAKE_BINARY_DIR}/install.bat" @ONLY NEWLINE_STYLE CRLF)
 	install(PROGRAMS "${CMAKE_BINARY_DIR}/install.bat" DESTINATION "${PACK_INSTALL_RUN_DIR}/./.." COMPONENT scripts)
 	install(FILES "${CMAKE_SOURCE_DIR}/addin/packaging/WIN/Readme.txt" DESTINATION "${PACK_INSTALL_RUN_DIR}/./.." COMPONENT scripts)
 	if(NOT DEVOPS_ON_CMAKE_PRD)
 		install(PROGRAMS "${CMAKE_SOURCE_DIR}/addin/packaging/WIN/kill.bat" DESTINATION ${RVC_BASE_PATH} COMPONENT scripts)
+		install(PROGRAMS "${CMAKE_SOURCE_DIR}/addin/packaging/WIN/test.vbs" DESTINATION ${RVC_BASE_PATH} COMPONENT scripts)
 	endif(NOT DEVOPS_ON_CMAKE_PRD)
 	file(GLOB VENDOR_ROOT_CONFIG_FILES "${CMAKE_SOURCE_DIR}/addin/hardwarecfg/WIN/root*.ini")
 	install(FILES ${VENDOR_ROOT_CONFIG_FILES} DESTINATION "${PACK_INSTALL_RUN_DIR}/hardwarecfg" COMPONENT scripts)
@@ -729,6 +734,7 @@ else(MSVC)
 	install(PROGRAMS "${CMAKE_SOURCE_DIR}/addin/startup_scripts/spexplorer.sh" DESTINATION "${RVC_BASE_PATH}" COMPONENT scripts)
 	if(NOT DEVOPS_ON_CMAKE_PRD)
 		install(PROGRAMS "${CMAKE_SOURCE_DIR}/addin/packaging/UOS/kill.sh" DESTINATION ${RVC_BASE_PATH} COMPONENT scripts)
+		install(PROGRAMS "${CMAKE_SOURCE_DIR}/addin/packaging/UOS/test.sh" DESTINATION ${RVC_BASE_PATH} COMPONENT scripts)
 	endif(NOT DEVOPS_ON_CMAKE_PRD)
 	configure_file("${CMAKE_SOURCE_DIR}/addin/packaging/UOS/installsub.in" "${CMAKE_BINARY_DIR}/installsub.sh" @ONLY NEWLINE_STYLE UNIX)
 	install(PROGRAMS "${CMAKE_BINARY_DIR}/installsub.sh" DESTINATION "${PACK_INSTALL_RVC_DIR}/Resources" COMPONENT scripts)

+ 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

+ 1 - 2
Framework/Common/SpBase.h

@@ -529,6 +529,7 @@ struct CSystemRunInfo
 	DebugLevelEnum eDebugLevel;
 	FrameworkStateEnum eState;
 	DWORD dwBootOption;
+	BOOL autoTest;
 	CAutoArray<CSimpleStringA> strRunningEntityNames;
 	bool bBasicCfgWork;
 	bool bErrCfgWork;
@@ -1663,7 +1664,6 @@ SPBASE_API void LogTrace(const char* pszMessage, const char* pszSourceFile, cons
 SPBASE_API CSimpleStringA GetSysErrMsg(int nErrCode);
 SPBASE_API const char *_GetFileName(const char *pszFilePath);
 
-#ifdef RVC_OS_LINUX
 /*
 基于当前mod中包含有restful模块,需要把数据从framework中传递到librestful,会比较困难
 (1)实际上大部分实体都没有加载restful模块,所以难以进行显示调用进行初始化。
@@ -1673,7 +1673,6 @@ SPBASE_API const char *_GetFileName(const char *pszFilePath);
 */
 #define MAX_TOKEN_LEN 256
 SPBASE_API void SpGetToken(char* channelId, char* token, char* terminalno, char* reserve1);
-#endif
 
 #ifdef RVC_OS_WIN //TODO: duplicate ?
 #define LOG_TRACE(pMsg, ...) \

+ 0 - 2
Framework/spbase/SpBase.cpp

@@ -422,7 +422,6 @@ SPBASE_API void LogTrace(const char* pszMessage, const char* pszFile, const int
 }
 
 #include "log.h"
-#ifdef RVC_OS_LINUX
 SPBASE_API void SpGetToken(char* channelId, char* token, char* terminalno, char* reserve1)
 {
 	sp_env_t* env = sp_get_env();
@@ -445,7 +444,6 @@ SPBASE_API void SpGetToken(char* channelId, char* token, char* terminalno, char*
 	else if (NULL == env->cfg->shell_ini->token)
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SpGetToken can not get token!env->cfg->shell_ini->token == NULL");
 }
-#endif
 
 
 

+ 9 - 0
Framework/spbase/SpEntity.cpp

@@ -1494,6 +1494,15 @@ ErrorCodeEnum SpEntity::GetSystemRunInfo(CSystemRunInfo &Info)
         }
 	}
 
+#ifndef DEVOPS_ON_PRD
+	//非生产情况下,才支持测试模式
+	Info.autoTest = FALSE;
+	if (cfg->args->auto_test)
+	{
+		Info.autoTest = TRUE;
+	}
+#endif
+
 	if (cfg->args->start_entities != NULL && strlen(cfg->args->start_entities) != 0) {
 		Info.dwBootOption |= BootOption_Entity;
 	}

+ 4 - 0
Framework/spbase/sp_cfg.cpp

@@ -2601,6 +2601,10 @@ int sp_cfg_create(sp_dir_t* dir, const sp_cfg_start_args_t* args, sp_cfg_t** p_c
 		memset(cfg->args, 0, sizeof(sp_cfg_start_args_t));
 		cfg->args->start_entities = shm_strdup(args->start_entities);
 		cfg->args->test_mode = args->test_mode;
+#ifndef DEVOPS_ON_PRD
+		//非生产情况下,才支持测试模式
+		cfg->args->auto_test = args->auto_test;
+#endif
 		cfg->args->debug_mode = args->debug_mode;
 		cfg->args->guardian_mode = args->guardian_mode;
 		cfg->args->sign_verifity = args->sign_verifity;

+ 4 - 0
Framework/spbase/sp_cfg.h

@@ -22,6 +22,10 @@ typedef struct sp_cfg_start_args_t {
 	char* arguments;
 	char* start_entities;    /*split with ';' for supported multi entities*/
 	char test_mode;         /*1: run as test mode, trigger test deamon entity to invoke onTest*/
+#ifndef DEVOPS_ON_PRD
+//非生产情况下,才支持测试模式
+	char auto_test;			/*1: run as auto test mode, loadup simulator adapter */
+#endif
 	char debug_mode;    /*trace memory alloca and cpu etc resource */
 	char guardian_mode;
 	char sign_verifity;

+ 9 - 1
Framework/spshell/spshell.cpp

@@ -578,6 +578,7 @@ void DisplayUsage()
 		"--entity {EntityName}  --启动特定的实体,选项后面输入实体名称\n"
 		"--guardian                    --以后台进程的方式运行,暂未实现\n"
 		"--test                            --以测试模式运行\n"
+		"--autotest                      --自动化验证\n"
 		"--debug                       --以调试模式运行,输出更为详细的日志\n"
 		"--benchmark               --以压力测试的模式启动\n"
 		"--kill                             --直接杀死终端相关进程,比如 spshell, sphost 等\n"
@@ -662,6 +663,7 @@ sp_cfg_start_args_t* DealWithArgs(int argc, char** argv)
 		{"entity", required_argument, 0, 'E' },
 		{"guardian", no_argument, 0, 'G'},
 		{"test", no_argument, 0, 'T'},
+		{"autotest", no_argument, 0, 'C'},
 		{"debug", no_argument, 0, 'D'},
 		{"ipc", required_argument, 0, 'I'},
 		{"shutdown", no_argument, 0, 'S'},
@@ -683,8 +685,14 @@ sp_cfg_start_args_t* DealWithArgs(int argc, char** argv)
 
 	int spshell_index = 0;
 	int c;
-	while ((c = getopt_long(argc, argv, "E:GTDI:SKBU:HVOR::Y::J::A:?", spshell_options, &spshell_index)) != EOF) {
+	while ((c = getopt_long(argc, argv, "E:GTCDI:SKBU:HVOR::Y::J::A:?", spshell_options, &spshell_index)) != EOF) {
 		switch (c) {
+		case 'C':
+#ifndef DEVOPS_ON_PRD
+			//非生产情况下,才支持测试模式
+			args->auto_test = 1;
+#endif // DEVOPS_ON_PRD
+			break;
 		case 'E':
 		{
 			if (optarg != NULL) {

+ 28 - 8
Module/include/DevEntityCommBase.hpp

@@ -155,15 +155,35 @@ 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 strDeviceEntityName = GetEntityName();		
+		
+#ifndef DEVOPS_ON_PRD
+		//非生产情况下,才支持测试模式
+		CSystemRunInfo runInfo = { 0 };
+		ErrorCodeEnum ec = GetFunction()->GetSystemRunInfo(runInfo);
+		if (ec == Error_Succeed && runInfo.autoTest) //识别成测试模式的条件
+		{
+			vendorLibInfo.strDevice = strDeviceEntityName;
+			vendorLibInfo.strVendor = "simulator";
+			vendorLibInfo.strVersion = "1";
+			vendorLibInfo.strBatch = "1";
+		}
+		else
+#endif
+		{
+			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);
 		}
-		CSimpleStringA strSection = CSimpleStringA("Device.") + strDeviceEntityName;
-		vendorLibInfo.strDevice = strDeviceEntityName;
-		spRootConfig->ReadConfigValue(strSection, "Vendor", vendorLibInfo.strVendor);
-		spRootConfig->ReadConfigValue(strSection, "Version", vendorLibInfo.strVersion);
-		spRootConfig->ReadConfigValue(strSection, "Batch", vendorLibInfo.strBatch);
 	}
 
 	if (IS_SUCCEED(erroCode)) {

+ 4 - 1
Module/include/EventCode.h

@@ -204,14 +204,17 @@ static const char* Device_Type_Table[] = {
 #define ERR_ACCESSAUTH_SET_LOCALE_TIME               0x50210006  //设置本地时间错误
 #define ERR_ACCESSAUTH_GET_SYS_VAR                   0x50210007  //获取系统变量错误
 #define ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT      0x50210008  //获取终端设备的指纹错误
+#define ERR_ACCESSAUTH_GET_IP_FAILED				 0x50210009  //获取终端设备的IP地址失败
+#define ERR_ACCESSAUTH_GET_MAC_FAILED				 0x5021000A  //获取终端设备的MAC地址失败
 
-#define ERR_ACCESSAUTH_CONNECT_PINPAD					0x50220001  //连接pinpad错误
+#define ERR_ACCESSAUTH_CONNECT_PINPAD					0x50220001  //实体已启动,连接pinpad错误
 #define ERR_ACCESSAUTH_FROM_PINPAD						0x50220002  //来自pinpad的错误
 #define ERR_ACCESSAUTH_CONNECT_TOKEN_SERVICE			0x50220003  //连接令牌管理实体(Token server)错误
 #define ERR_ACCESSAUTH_FROM_TOKEN_SERVICE				0x50220004  //来自令牌管理的错误
 #define ERR_ACCESSAUTH_FROM_TOKEN_SERVICE_SET_KEYS		 0x50220005  //来自令牌管理的错误(SetKeyPair)
 #define ERR_ACCESSAUTH_FROM_TOKEN_SERVICE_SET_TOKEN		 0x50220006  //来自令牌管理的错误(SetToken)
 #define ERR_ACCESSAUTH_FROM_TOKEN_SERVICE_SET_SHAREKEY	 0x50220007  //来自令牌管理的错误(SetSharedSK)
+#define ERR_ACCESSAUTH_CONNECT_PINPAD_UNLOAD			 0x50220008  //实体未启动,连接pinpad错误
 
 #define ERR_ACCESSAUTH_RVC_INIT                      0x50230001  //调用KMC接口RVCInit错误
 #define ERR_ACCESSAUTH_INIT_KMC                      0x50230002  //调用KMC接口InitKMC错误

+ 2 - 0
Module/mod_IDCertificate/IDCertificate_UserErrorCode.h

@@ -29,6 +29,8 @@
 #define IDCertificate_UserErrorCode_ReadAndScan_NotHanZi	(IDCertificate_UserErrorCode_Start + 28) //读取身份证非汉字 错误码为 2010021c
 #define IDCertificate_UserErrorCode_ReadAndScan_GetIDInfo	(IDCertificate_UserErrorCode_Start + 29) //读取身份证信息 错误码为 2010021d
 #define IDCertificate_UserErrorCode_ReadAndScan_TransImgFaild (IDCertificate_UserErrorCode_Start + 30) // 扫描图片获取失败错误码为 2010021e
+#define IDCertificate_UserErrorCode_ReadAndScan_NotOnReading	0x2010021f //实体不在读证状态
+
 
 //#define IDCertificate_UserErrorCode_Real_Root_Config		(IDCertificate_UserErrorCode_Start + 31) //加载实际的root配置
 

+ 7 - 1
Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp

@@ -3511,6 +3511,7 @@ unordered_map<int, long long> oldProcessTime;
 unordered_map<int, long long> newProcessTime;
 unordered_map<int, CSimpleStringA> processName;
 unordered_map<int, double> processCpu;
+string sysProcName = "[System Process]|System|Registry|smss.exe|csrss.exe|services.exe|wininit.exe";
 
 bool cmp(const pair<int, double>& a, const pair<int, double>& b) {
     return a.second > b.second;
@@ -3617,6 +3618,11 @@ void ResourceWatcherFSM::GetSystemCPUStatus()
             continue;
         }
 
+        if (sysProcName.find(processName[tPid].GetData()) != std::string::npos)
+        {
+            continue;
+        }
+
         // 转换为百分比
         double tRatio = 100.0 * (newProcessTime[tPid] - oldProcessTime[tPid]) / (kernel + user);
         if (tRatio > 0.0);
@@ -3649,7 +3655,7 @@ void ResourceWatcherFSM::GetSystemCPUStatus()
     if (cpuRatio > (double)m_cpuHighPercent)
     {
         cpuWarnTime = cpuWarnTime % cpuWarnThreshold;   
-        if (cpuWarnTime == 0) //每达到一次阈值告警一次
+        if (cpuWarnThreshold == 0) //每达到一次阈值告警一次
         {
             CSimpleStringA warn = CSimpleStringA::Format("{\"type\":\"cpu\", \"total_used\":\" %.2f", cpuRatio);
             warn = warn + "%\"" + procWarn + "}";

+ 86 - 313
Module/mod_accessauth/AccessAuthFSM.cpp

@@ -7,8 +7,11 @@
 #include  <stdlib.h>
 #include "fileutil.h"
 #include "CommEntityUtil.hpp"
+#include "CommEntityRestful.hpp"
+#include "SpUtility.h"
 #include "comm.h"
 #include "PinPad_client_g.h"
+#include <codecvt>
 using namespace PinPad;
 
 #ifdef RVC_OS_WIN
@@ -22,10 +25,6 @@ using namespace PinPad;
 #include <algorithm>
 #pragma comment(lib, "IPHLPAPI.lib")
 #define ALLOW_MULTI_NETWORKD_CARDS
-
-#else
-#include "CommEntityRestful.hpp"
-#include "SpUtility.h"
 #endif // RVC_OS_WIN
 
 int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len)
@@ -130,50 +129,6 @@ struct TimeSynTask : ITaskSp
 		CSystemStaticInfo si;
 		m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
 
-#ifdef RVC_OS_WIN
-		IHttpFunc* client;
-		client = create_http(m_fsm->HttpsLogCallBack);
-		CSessionkeySynReq timeSynReq;
-		CSessionkeySynRet timeSynRet;
-
-		timeSynReq.terminalNo = si.strTerminalID.GetData();
-		timeSynReq.curTime = CSmallDateTime::GetNow().GetTime64();
-		timeSynReq.m_url = m_fsm->GetmAccessAuthHost();
-		timeSynReq.m_url += "/api/v3/sessionkey";//v3 新接口,返回title、content
-		long beg = GetTickCount();
-		bool ret = client->Post(timeSynReq, timeSynRet);
-		long end = GetTickCount();
-
-		if (ret) {
-			if (timeSynRet.m_userCode.compare(ACS_SUCCESS)) {
-				m_fsm->AuthLogWarn(timeSynRet, timeSynReq.m_url, "获取会话密钥");
-				if (client) client->Destory();
-				return;
-			}
-
-
-			int decodedSessionKeyLen = 0;
-			char* decodedSessionKey = MyBase64::Hex2Str(timeSynRet.data.sessionKey.c_str(), decodedSessionKeyLen);
-
-			DWORD rc = m_fsm->HandleTimeSyn(timeSynRet.data.timeDiff, (BYTE*)decodedSessionKey);
-			delete decodedSessionKey;
-			if (rc == Error_Succeed) {
-				auto pEvent = new FSMEvent(CAccessAuthFSM::Event_EndSyncTime);
-				m_fsm->PostEventFIFO(pEvent);
-			}
-			else {
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("TimeSynTask HandleTimeSyn error = %08X", rc);
-			}
-		}
-		else {
-			m_fsm->AuthLogWarn(timeSynRet, timeSynReq.m_url, "获取会话密钥");
-
-			FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenCancel);
-			pEvent->param1 = AccessAuthorization_UserErrorCode_ACS_FAIL;
-			m_fsm->PostEventFIFO(pEvent);
-		}
-		client->Destory();
-#else
 		struct TimeSynReqStructJson
 		{
 			std::string terminalNo;
@@ -198,6 +153,19 @@ struct TimeSynTask : ITaskSp
 		SP::Module::Restful::FulfillRequestJsonBody(&config, timeSyncReq);
 		RestfulClient client = RestfulClient::getInstance();
 
+		if (m_fsm->containsChinese(m_fsm->GetmAccessAuthHost().GetData()))
+		{
+			result.statusCode = 6;
+			m_fsm->AuthLogWarn(result, m_fsm->GetmAccessAuthHost().GetData(), "获取会话密钥");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("TimeSynTask Connect Failed.");
+
+			FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenCancel);
+			pEvent->param1 = AccessAuthorization_UserErrorCode_ACS_FAIL;
+			m_fsm->PostEventFIFO(pEvent);
+
+			return;
+		}
+
 		std::string test;
 		test = config.GetRequestUri();
 
@@ -220,7 +188,7 @@ struct TimeSynTask : ITaskSp
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("authVersion: %d", timeSyncAns.authVersion);
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sessionKey: %s", timeSyncAns.sessionKey.c_str());
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("reserved: %s", timeSyncAns.reserved.c_str());
-			};
+	};
 			printFunc();
 
 			int decodedSessionKeyLen = 0;
@@ -236,7 +204,7 @@ struct TimeSynTask : ITaskSp
 			else {
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("TimeSynTask HandleTimeSyn error = %08X", rc);
 			}
-		}
+}
 		else {
 			std::string errDetail(result.WhatError());
 			if (errDetail.find("Error resolving address") != std::string::npos) {
@@ -266,7 +234,6 @@ struct TimeSynTask : ITaskSp
 			pEvent->param1 = AccessAuthorization_UserErrorCode_ACS_FAIL;
 			m_fsm->PostEventFIFO(pEvent);
 		}
-#endif // RVC_OS_WIN
 	}
 };
 
@@ -285,97 +252,19 @@ struct UpdateWKTask : ITaskSp
 		}
 		CSystemStaticInfo si;
 		m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
-		
-#ifdef RVC_OS_WIN
-		IHttpFunc* client;
-		client = create_http(m_fsm->HttpsLogCallBack);
-		CAccessAuthUpdateWKReq updateWKReq;
-		updateWKReq.terminalNo = si.strTerminalID.GetData();
-		auto tmkpair = m_entity->GenerateTmkToKMC();//first是加密的,seconde是没加密的
-		updateWKReq.encRandom = tmkpair.first;
-
-		PinPadService_ClientBase* pPinPad = new PinPadService_ClientBase(this->m_entity);
-		auto errRc = pPinPad->Connect();
-		if (errRc == Error_Succeed)
-		{
-			PinPadService_GetCheckCode_Req req = {};
-			PinPadService_GetCheckCode_Ans ans = {};
-
-			req.mSN.Init(1);
-			req.wSN.Init(1);
-			req.mSN[0] = 1;
-			req.wSN[0] = 0;
-			errRc = (*pPinPad)(EntityResource::getLink().upgradeLink())->GetCheckCode(req, ans, 10000);
-			if (errRc == Error_Succeed)
-			{
-				updateWKReq.tpkKeyCheck = ans.checkcode[0].GetData();
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("keyChek:%s.", updateWKReq.tpkKeyCheck.c_str());
-				updateWKReq.keyIndex = ans.index[0].GetData();
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Index:%s.", updateWKReq.keyIndex.c_str());
-			}
-			else
-			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get keyChek && keyIndex failed.");
-			}
 
-			pPinPad->GetFunction()->CloseSession();
-		}
-		else
+		if (m_fsm->containsChinese(m_fsm->GetmAccessAuthHost().GetData()))
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to pinpad failed.error code:%d", errRc);
-		}
-
-		CAccessAuthUpdateWKRet updateWKRet;
-		updateWKReq.m_url = m_fsm->GetmAccessAuthHost();
-		updateWKReq.m_url += "/api/v5/wkupdate";
-		long beg = GetTickCount();
-		bool ret = client->Post(updateWKReq, updateWKRet);
-		long end = GetTickCount();
-
-		if (ret) {
-			if (updateWKRet.m_userCode.compare(ACS_SUCCESS)) {
-				m_fsm->doWarnMsg(ERR_ACCESSAUTH_UPDATE_WK,
-					GetOutPutStr("%s%s%s%s", "UpdateWKTask", updateWKRet.m_userCode.c_str(), "message", updateWKRet.m_errMsg.c_str()).c_str());
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)
-					(GetOutPutStr("%s%s%s%s", "UpdateWKTask", updateWKRet.m_userCode.c_str(), "message", updateWKRet.m_errMsg.c_str()).c_str());
-				if (client) client->Destory();
-				return;
-			}
-
+			m_fsm->doWarnMsg(ERROR_ACCESSAUTH_CONNECT_ACS,
+				GetOutPutStr("%s", "连接总行ACS准入服务失败(UpdateWKTask).").c_str(), true);
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5212")("UpdateWKTask Connect Failed.");
 
+			FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenCancel);
+			m_fsm->PostEventFIFO(pEvent);
 
-			ErrorCodeEnum eLoadErr = m_entity->LoadKeysToPinPadACS(tmkpair.second, updateWKRet.tpk,
-				updateWKRet.edk, updateWKRet.keyIndex,updateWKRet.tpkKeyCheck,updateWKRet.edkKeyCheck);
-			if (eLoadErr == Error_Succeed) {
-				if (client) client->Destory();
-				return;
-			}
-			else {
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("UpdateWKTask 密钥加载失败,请检查密码键盘连接. error = %08X", eLoadErr);
-			}
-		}
-		else {
-			CSimpleStringA acsResoultCode = "RTA520F";
-			int acsErrCode = ERROR_ACCESSAUTH_CONNECT_ACS_x;
-			if (updateWKRet.m_sysCode == 6)
-			{
-				acsResoultCode = "RTA520D";
-				acsErrCode = ERROR_ACCESSAUTH_CONNECT_ACS_6;
-			}
-			else if (updateWKRet.m_sysCode == 28)
-			{
-				acsResoultCode = "RTA520E";
-				acsErrCode = ERROR_ACCESSAUTH_CONNECT_ACS_28;
-			}
-			m_fsm->doWarnMsg(acsErrCode,
-				GetOutPutStr("%s%d", "连接总行ACS准入服务失败(StageReport).", updateWKRet.m_sysCode).c_str());
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setBeginTime(beg).setEndTime(end).
-				setResultCode(acsResoultCode.GetData()).
-				setResultMsg(updateWKRet.m_errMsg.c_str())
-				(GetOutPutStr("%s%d", "连接总行ACS准入服务失败(StageReport).", updateWKRet.m_sysCode).c_str());
+			return;
 		}
-		client->Destory();
-#else
+		
 		struct UpdateWKReq
 		{
 			std::string terminalNo;
@@ -466,14 +355,13 @@ struct UpdateWKTask : ITaskSp
 		else {
 			m_fsm->doWarnMsg(ERROR_ACCESSAUTH_CONNECT_ACS,
 				GetOutPutStr("%s%s", "连接总行ACS准入服务失败(UpdateWKTask).", result.WhatError().c_str()).c_str(), true);
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA520G")("UpdateWKTask Connect Failed.");
-		}
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5212")("UpdateWKTask Connect Failed.");
+	}
 
 	UpdateWKRetError:
 
 		FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenCancel);
 		m_fsm->PostEventFIFO(pEvent);
-#endif // RVC_OS_WIN
 	}
 };
 
@@ -498,62 +386,6 @@ struct GetTokenTask : ITaskSp
 		CSystemStaticInfo si;
 		m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
 		
-#ifdef RVC_OS_WIN
-		IHttpFunc* client;
-		client = create_http(m_fsm->HttpsLogCallBack);
-		CAccessAuthGetTokenReq getTokenReq;
-
-		if (m_fsm->GetTokenReq(&getTokenReq) != Error_Succeed) {
-			if (client) client->Destory();
-			return;
-		}
-
-		CAccessAuthGetTokenRet getTokenRet;
-		getTokenReq.m_url = m_fsm->GetmAccessAuthHost();
-		getTokenReq.m_url += "/api/v3/access"; //v3新接口,返回title,content
-
-		long beg = GetTickCount();
-		bool ret = client->Post(getTokenReq, getTokenRet);
-		long end = GetTickCount();
-
-		if (ret) {
-			if (getTokenRet.m_userCode.compare(ACS_SUCCESS)) {
-				m_fsm->AuthLogWarn(getTokenRet, getTokenReq.m_url, "获取准入token");
-				if (client) client->Destory();
-				return;
-			}
-
-
-			if (getTokenRet.data.flag != 0 /*&& flag?*/) //判断是否需要告警,通过标志位,标志位待确定
-			{
-				CSimpleStringA tmsg = CSimpleStringA::Format("{\"errcode\": \"%s\", \"message\": %s}",
-					getTokenRet.m_userCode.c_str(), getTokenRet.data.warnMessage.c_str());
-				m_fsm->GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", tmsg.GetData(), true);
-			}
-			else
-			{
-				m_fsm->GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", "", true);
-			}
-
-			DWORD rc = m_fsm->HandleGetToken((BYTE*)getTokenRet.data.sharedKey.enToken.c_str(), (BYTE*)getTokenRet.data.sharedKey.sharedSK.c_str(),
-				(BYTE*)getTokenRet.data.accessToken.enToken.c_str(), (BYTE*)getTokenRet.data.accessToken.retHash.c_str());
-			if (rc == Error_Succeed) {
-				FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenSucc);
-				m_fsm->PostEventFIFO(pEvent);
-				if (client) client->Destory();
-				return;
-			}
-			else {
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTokenTask HandleGetToken error = %08X", rc);
-			}
-		}
-		else {
-			m_fsm->AuthLogWarn(getTokenRet, getTokenReq.m_url, "获取准入token");
-		}
-		FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenFail);
-		m_fsm->PostEventFIFO(pEvent);
-		if (client) client->Destory();
-#else
 		CAutoArray<CSimpleStringA> devNames;
 		DWORD rc = m_fsm->GetAllDevices(m_entity, devNames);
 
@@ -607,6 +439,18 @@ struct GetTokenTask : ITaskSp
 		HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->GetmAccessAuthHost().GetData(), &SpGetToken);
 		config.SetChildUri("/api/v3/access");
 
+		if (m_fsm->containsChinese(m_fsm->GetmAccessAuthHost().GetData()))
+		{
+			result.statusCode = 6;
+			m_fsm->AuthLogWarn(result, m_fsm->GetmAccessAuthHost().GetData(), "获取准入token");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTokenTask Connect Failed.");
+
+			FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenFail);
+			m_fsm->PostEventFIFO(pEvent);
+
+			return;
+		}
+
 		getTokenReqJson.installVersion = getTokenReq.installVersion;
 		getTokenReqJson.terminalCharacter = getTokenReq.terminalCharacter;
 		getTokenReqJson.terminalNo = getTokenReq.terminalNo;
@@ -644,7 +488,7 @@ struct GetTokenTask : ITaskSp
 			{
 				m_fsm->GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", "", true);
 			}
-				
+
 			DWORD rc = m_fsm->HandleGetToken((BYTE*)getTokenAns.sharedKey.enToken.c_str(), (BYTE*)getTokenAns.sharedKey.sharedSK.c_str(),
 				(BYTE*)getTokenAns.accessToken.enToken.c_str(), (BYTE*)getTokenAns.accessToken.retHash.c_str());
 
@@ -685,7 +529,6 @@ struct GetTokenTask : ITaskSp
 		}
 		FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenFail);
 		m_fsm->PostEventFIFO(pEvent);
-#endif // RVC_OS_WIN
 	}
 };
 
@@ -697,54 +540,53 @@ struct InitDeviceTask :public ITaskSp
 
 	void Process()
 	{
-#ifdef RVC_OS_WIN
-		if (m_fsm->GetmInitDeviceHost().IsNullOrEmpty()) {
-			LogWarn(Severity_Middle, Error_Unexpect, AccessAuthorization_UserErrorCode_InitDev_NULL, "加密通道Url为空");
-			return;
+		return;
+	}
+};
+
+
+#ifdef RVC_OS_LINUX
+bool isChineseChar(const char* p) {
+	if (*p >= 0x80) { // ASCII字符的最高位是0,非ASCII字符的最高位是1
+		char firstByte = *p;
+		if ((firstByte & 0xE0) == 0xE0) { // 3字节的UTF-8字符
+			return (*++p >= 0x80) && (*++p >= 0x80) && // 第二、三个字节都是10xxxxxx
+				((firstByte & 0xFE) != 0xFE) && // 排除0xFE00~0xFEFF的特殊区域
+				((*(unsigned char*)p - 0x80) <= 0xBF);
 		}
-		m_fsm->SetDevPubKey("");
-		IHttpFunc* client;
-		client = create_http(m_fsm->HttpsLogCallBack);
-		CAccessAuthInitDeviceReq initDeviceReq;
-		initDeviceReq.cr1 = m_req.CR1;
-		initDeviceReq.cr3 = m_req.CR3;
-		initDeviceReq.cDevPubKey = m_req.CDevPubKey;
-		initDeviceReq.r2 = m_req.R2;
-		initDeviceReq.vendor = m_req.Verdor;
-		CSystemStaticInfo si;
-		m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
-		initDeviceReq.terminalNo = si.strTerminalID;
-		CAccessAuthInitDeviceRet initDeviceRet;
-		initDeviceReq.m_url = m_fsm->GetmInitDeviceHost();
-		initDeviceReq.m_url = initDeviceReq.m_url + "/api/v3/initdevice";
-		long beg = GetTickCount();
-		bool ret = client->Post(initDeviceReq, initDeviceRet);
-		long end = GetTickCount();
-
-		if (ret) {
-			if (initDeviceRet.m_userCode.compare(ACS_SUCCESS)) {
-				m_fsm->AuthLogWarn(initDeviceRet, initDeviceReq.m_url, "初始设备", false);
-			}
-			else {
-				if (m_fsm->m_ctxInitDev != NULL) {
-					m_fsm->m_ctxInitDev->Ans.R1 = initDeviceRet.r1.c_str();
-					m_fsm->m_ctxInitDev->Ans.EncR2 = initDeviceRet.cr2.c_str();
-					m_fsm->m_ctxInitDev->Ans.R3 = initDeviceRet.r3.c_str();
-					m_fsm->SetDevPubKey(initDeviceRet.devPubKey.c_str());
-					m_fsm->m_ctxInitDev->Answer(Error_Succeed);
-					m_fsm->m_ctxInitDev.Clear();
-				}
-			}
+		else if ((firstByte & 0xC0) == 0xC0) { // 2字节的UTF-8字符
+			return (*++p >= 0x80) && // 第二个字节是10xxxxxx
+				((firstByte & 0xFE) != 0xFE);
 		}
-		else {
-			m_fsm->AuthLogWarn(initDeviceRet, initDeviceReq.m_url, "初始设备", false);
+}
+	return false;
+}
+
+bool CAccessAuthFSM::containsChinese(const std::string& str) {
+	for (size_t i = 0; i < str.size(); i++) {
+		if (isChineseChar(str.c_str() + i)) {
+			return true;
 		}
-		if (client) client->Destory();
+	}
+	return false;
+}
 #else
-		return;
-#endif // RVC_OS_WIN
+bool CAccessAuthFSM::containsChinese(const std::string& str) {
+	int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
+	wchar_t* wideStr = new wchar_t[len];
+	MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, wideStr, len);
+
+	for (int i = 0; i < len; i++) {
+		if (wideStr[i] >= 0x4E00 && wideStr[i] <= 0x9FFF) {
+			delete[] wideStr;
+			return true;
+		}
 	}
-};
+
+	delete[] wideStr;
+	return false;
+}
+#endif // RVC_OS_WIN
 
 
 void CAccessAuthFSM::doWarnMsg(int errReason, std::string errMsg, bool bNeedEvent, string varMsg)
@@ -758,17 +600,7 @@ void CAccessAuthFSM::doWarnMsg(int errReason, std::string errMsg, bool bNeedEven
 #endif // RVC_OS_WIN
 	if (bNeedEvent) 
 	{
-#ifdef RVC_OS_WIN
-		std::string alaramMSg(fullErrMsg);
-		if (alaramMSg.length() >= 255) {
-			std::string tmp = alaramMSg.substr(0, 252);
-			tmp += "...";
-			alaramMSg = tmp;
-		}
-		const ErrorCodeEnum ec = m_pEntity->GetFunction()->SetSysVar("AuthErrMsg", alaramMSg.c_str(), true);
-#else
 		const ErrorCodeEnum ec = m_pEntity->GetFunction()->SetSysVar("AuthErrMsg", fullErrMsg.c_str(), true);
-#endif // RVC_OS_WIN
 		if (ec != Error_Succeed) {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Update SysVar failed: 0x%X", ec);
 		}
@@ -979,22 +811,14 @@ bool CAccessAuthFSM::DecryptWithSessionKey(BYTE* encText, int encTextLen, BYTE*
 {
 	BYTE key[16] = { 0 };
 	memcpy(key, ((CAccessAuthEntity*)m_pEntity)->m_AuthSessionKey, 16);
-#ifdef RVC_OS_WIN
-	char* keyTmp = MyBase64::Str2Hex((char*)key, 16);
-#else
 	char* keyTmp = Str2Hex((char*)key, 16);
-#endif // RVC_OS_WIN
 	delete keyTmp;
 
 	if (!DecWithSM4_ECB(key, encText, encTextLen, decTest, &decTestLen)) {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("DecryptWithSessionKey ECB error.");
 		return false;
 	}
-#ifdef RVC_OS_WIN
-	keyTmp = MyBase64::Str2Hex((char*)decTest, decTestLen);
-#else
 	keyTmp = Str2Hex((char*)decTest, decTestLen);
-#endif // RVC_OS_WIN
 	delete keyTmp;
 	return true;
 }
@@ -1092,17 +916,10 @@ DWORD CAccessAuthFSM::HandleGetToken(BYTE* enToken1, BYTE* sharedKey, BYTE* enTo
 	char* enToken1_acs, * sharedKey_acs, * enToken2_acs, * hash_acs;
 	int enToken1_acs_len = 0, sharedKey_acs_len = 0, enToken2_acs_len = 0, hash_acs_len = 0;
 
-#ifdef RVC_OS_WIN
-	enToken1_acs = MyBase64::Hex2Str((char*)enToken1, enToken1_acs_len);
-	sharedKey_acs = MyBase64::Hex2Str((char*)sharedKey, sharedKey_acs_len);
-	enToken2_acs = MyBase64::Hex2Str((char*)enToken2, enToken2_acs_len);
-	hash_acs = MyBase64::Hex2Str((char*)retHash, hash_acs_len);
-#else
 	enToken1_acs = Hex2Str((char*)enToken1, enToken1_acs_len);
 	sharedKey_acs = Hex2Str((char*)sharedKey, sharedKey_acs_len);
 	enToken2_acs = Hex2Str((char*)enToken2, enToken2_acs_len);
 	hash_acs = Hex2Str((char*)retHash, hash_acs_len);
-#endif // RVC_OS_WIN
 
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("HandleGetToken")("enToken1_acs_len=%d", enToken1_acs_len);
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("HandleGetToken")("sharedKey_acs_len=%d", sharedKey_acs_len);
@@ -1138,11 +955,7 @@ DWORD CAccessAuthFSM::HandleGetToken(BYTE* enToken1, BYTE* sharedKey, BYTE* enTo
 		rc = Error_Bug;
 		pEntity->SetAuthErrMsg("返回令牌校验不通过");
 		pEntity->GetFunction()->SetSysVar("AuthErrMsg", "返回令牌校验不通过", true);
-#ifdef RVC_OS_WIN
-		char* sm3Ret = MyBase64::Str2Hex((char*)sm3, 32);
-#else
 		char* sm3Ret = Str2Hex((char*)sm3, 32);
-#endif // RVC_OS_WIN
 		delete sm3Ret;
 		doWarnMsg(ERR_ACCESSAUTH_TOKEN_HASH, "返回令牌校验不通过", true);
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(GetOutPutStr("%s%s", "Hash", "返回令牌校验不通过").c_str());
@@ -1212,6 +1025,7 @@ DWORD CAccessAuthFSM::GetEncTerminalInfo(CBlob& encInfo)
 		int i = 0;
 		for (; ent->h_addr_list[i] != NULL; ++i) {
 			struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
+			//99开头行内办公网,10开头行内业务网。规范出自《招商银行总行网络规范汇编(2017年版).pdf》
 			if (in->S_un.S_un_b.s_b1 == 99 || in->S_un.S_un_b.s_b1 == 10)
 				break;
 		}
@@ -1336,11 +1150,7 @@ DWORD CAccessAuthFSM::GetTokenReq(CAccessAuthGetTokenReq* getTokenReq)
 		return ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT;
 	}
 	char tmp[256] = { 0 };
-#ifdef RVC_OS_WIN
-	char* fingerPrintHex = MyBase64::Str2Hex((char*)fingerPrint, 64);
-#else
 	char* fingerPrintHex = Str2Hex((char*)fingerPrint, 64);
-#endif // RVC_OS_WIN
 	memcpy(tmp, fingerPrintHex, 64);
 	getTokenReq->terminalCharacter = tmp;
 	delete fingerPrintHex;
@@ -1351,11 +1161,7 @@ DWORD CAccessAuthFSM::GetTokenReq(CAccessAuthGetTokenReq* getTokenReq)
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetEncTerminalInfo failed:%d", rc);
 		return rc;
 	}
-#ifdef RVC_OS_WIN
-	char* pTmp = MyBase64::Str2Hex((char*)encInfo.m_pData, encInfo.m_iLength);
-#else
 	char* pTmp = Str2Hex((char*)encInfo.m_pData, encInfo.m_iLength);
-#endif // RVC_OS_WIN
 	getTokenReq->encTerminalInfo = pTmp;
 	delete pTmp;
 	getTokenReq->terminalNo = si.strTerminalID.GetData();
@@ -1420,22 +1226,6 @@ void CAccessAuthFSM::UpdateWK()
 
 DWORD CAccessAuthFSM::InitDevice(SpReqAnsContext<AccessAuthService_InitDev_Req, AccessAuthService_InitDev_Ans>::Pointer& ctx)
 {
-#ifdef RVC_OS_WIN
-	DWORD rc = 0;
-
-	InitDeviceReq req;
-	memset(&req, 0, sizeof(req));
-	strncpy(req.CR1, (const char*)ctx->Req.EncR1, sizeof(req.CR1));
-	strncpy(req.R2, (const char*)ctx->Req.R2, sizeof(req.R2));
-	strncpy(req.CR3, (const char*)ctx->Req.EncR3, sizeof(req.CR3));
-	strncpy(req.CDevPubKey, (const char*)ctx->Req.EncDevPubKey, sizeof(req.CDevPubKey));
-	strncpy(req.Verdor, (const char*)ctx->Req.Vendor, sizeof(req.Verdor));
-
-	m_ctxInitDev = ctx;
-	CSmartPointer<InitDeviceTask> initDeviceTask = new InitDeviceTask(this, req);
-	GetEntityBase()->GetFunction()->PostThreadPoolTask(initDeviceTask.GetRawPointer());
-#endif // RVC_OS_WIN
-
 	return Error_Succeed;
 }
 
@@ -1455,27 +1245,15 @@ template<class T>
 void CAccessAuthFSM::AuthLogWarn(const T& ret, const string& url, const string& method, bool bNeedEvent)
 {
 	CSimpleStringA msg;
-#ifdef RVC_OS_WIN
-	if (ret.m_userCode != "0" && ret.m_sysCode != 200)
-#else
 	if (!ret.ResponseOK())
-#endif // RVC_OS_WIN
 	{
 		int acsErrCode = ERROR_ACCESSAUTH_CONNECT_ACS_x;
-#ifdef RVC_OS_WIN
-	if (ret.m_sysCode == 6) {
-#else
-	if (ret.statusCode == 6) {
-#endif
+		if (ret.statusCode == 6) {
 			acsErrCode = ERROR_ACCESSAUTH_CONNECT_ACS_6;
 			msg = CSimpleStringA::Format("%s失败:域名解析失败,请尝试重启应用", method.c_str());
 
 		}
-#ifdef RVC_OS_WIN
-	else if (ret.m_sysCode == 28) {
-#else
-	else if (ret.statusCode == 28) {
-#endif
+		else if (ret.statusCode == 28) {
 			acsErrCode = ERROR_ACCESSAUTH_CONNECT_ACS_28;
 			msg = CSimpleStringA::Format("%s失败:连接总行服务超时,请尝试重启应用", method.c_str());
 		}
@@ -1485,15 +1263,10 @@ void CAccessAuthFSM::AuthLogWarn(const T& ret, const string& url, const string&
 		doWarnMsg(acsErrCode, msg.GetData(), bNeedEvent);
 	}
 	else {
-#ifdef RVC_OS_WIN
-		msg = CSimpleStringA::Format("{\"errcode\": \"%s\", \"message\": %s}",
-			ret.m_userCode.c_str(), ret.m_errMsg.c_str());
-#else
 		SP::Module::Restful::CommResponseJson responseStatus;
 		SP::Module::Restful::GetStatusFromDebranchResponse(ret.content, responseStatus);
 		msg = CSimpleStringA::Format("{\"errcode\": \"%s\", \"message\": %s}",
 			responseStatus.errorCode.c_str(), responseStatus.errorMsg.c_str());
-#endif // RVC_OS_WIN
 		doWarnMsg(ERR_ACCESSAUTH_SERVICE_FAILED, msg.GetData(), bNeedEvent);
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA520A")("准入服务端报错");
 	}

+ 1 - 0
Module/mod_accessauth/AccessAuthFSM.h

@@ -503,6 +503,7 @@ public:
 	ErrorCodeEnum GetIntFromCS(const char* pcSection, const char* pcKey, int& retInt);
 	ErrorCodeEnum GetStrFromCS(const char* pcSection, const char* pcKey, CSimpleStringA& retStr);
 
+	bool containsChinese(const std::string& str);
 	void SetNetworkCheckingState(bool busing = true)
 	{
 		m_fNetworkChecking = busing;

+ 1 - 6
Module/mod_accessauth/comm.cpp

@@ -218,6 +218,7 @@ char* Str2Hex(const char* src, int srcLen)
 				char addressBuffer[INET_ADDRSTRLEN];
 				inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
 				//printf("%s IP Address %s\n", ifAddrStruct->ifa_name, addressBuffer);
+				//99开头行内办公网,10开头行内业务网。规范出自《招商银行总行网络规范汇编(2017年版).pdf》
 				if (!no_begin_with(addressBuffer, "99") || !no_begin_with(addressBuffer, "10")) {
 					memset(ip, 0, sizeof(ip));
 					strcpy(ip, addressBuffer);
@@ -243,12 +244,6 @@ char* Str2Hex(const char* src, int srcLen)
 		return 0;
 	}
 
-	//invalid function
-	bool get_cpu_id_by_asm(std::string& cpu_id)
-	{
-		return(true);
-	}
-
 	void parse_cpu_id(const char* file_name, const char* match_words, std::string& cpu_id)
 	{
 		cpu_id.c_str();

+ 23 - 222
Module/mod_accessauth/mod_AccessAuth.cpp

@@ -4,9 +4,11 @@
 #include "RVCComm.h"
 #include "access_basefun.h"
 #include <fileutil.h>
+#include <iniutil.h>
 #include <cmath>
 #include "Event.h"
 #include "comm.h"
+#include "CommEntityRestful.hpp"
 #include "TokenKeeper_client_g.h"
 using namespace TokenKeeper;
 #include "PinPad_client_g.h"
@@ -19,9 +21,7 @@ using namespace PinPad;
 #include "DeviceBaseClass.h"
 #include "MyBase64.h"
 #else
-#include "CommEntityRestful.hpp"
 #include "DeviceBaseClass.h"
-#include <iniutil.h>
 #endif
 
 #define KEY_SIZE 16
@@ -40,73 +40,19 @@ struct InitializerInitMKTask : ITaskSp
 	{
 		CSystemStaticInfo si;
 		m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
-#ifdef RVC_OS_WIN
-		IHttpFunc* client;
-		client = create_http(m_fsm->HttpsLogCallBack);
-		CInitlizerMKReq initMKReq;
-		CInitlizerMKRet initMKRet;
+		CInitlizerMKReq initMKReq;//oiltest dev module count
 		bool initFlag = m_entity->SendInitMKReqACS(initMKReq);
-
 		if (!initFlag)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5204")("连接密码键盘异常");
 			m_entity->EndInitMK(ERR_ACCESSAUTH_CONNECT_PINPAD, "连接密码键盘异常,请检查");//,待完善细化错误码oiltest
-			client->Destory();
+			return;
 		}
 
-		auto tmkpair = m_entity->GenerateTmkToKMC();
-		initMKReq.encRandom = tmkpair.first;
-		initMKReq.m_url = m_entity->GetInitUrl();
-		initMKReq.m_url += "/api/v5/initmk";
-		long beg = GetTickCount();
-		bool ret = client->Post(initMKReq, initMKRet);
-		long end = GetTickCount();
-
-		if (ret) {
-			if (initMKRet.m_userCode.compare(ACS_SUCCESS)) {
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("InitializerInitMKTask")("initmk failed.");
-				if (client) client->Destory();
-				m_entity->EndInitMK(ERR_INITIALIZER_EXCEPTION, CSimpleStringA::Format("%s,%s"
-					, initMKRet.m_userCode.c_str(), initMKRet.m_errMsg.c_str()));
-				return;
-			}
-
-			//服务端返回成功再将数据写入AcessAuthourization.ini
-			CSmartPointer<IConfigInfo> pConfig;
-			auto rc = m_entity->GetFunction()->OpenConfig(Config_Run, pConfig);
-			rc = pConfig->WriteConfigValue("TerminalPD", "PrivateKey", m_entity->m_privateKey);
-			if (rc != Error_Succeed) {
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write pri key failed.");
-				m_entity->EndInitMK(ERR_INITIALIZER_EXCEPTION, "私钥写入失败,请重新初始化。");
-				return;
-			}
-
-			if (m_entity->HasPinPad()) {
-				if (m_entity->LoadKeysToPinPadACS(tmkpair.second, initMKRet.tpk, initMKRet.edk, initMKRet.keyIndex,initMKRet.tpkKeyCheck,initMKRet.edkKeyCheck) == Error_Succeed)
-					m_entity->EndInitMK(Error_Succeed, "");
-				else
-				{
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5204")("连接密码键盘异常");
-					m_entity->EndInitMK(ERR_ACCESSAUTH_CONNECT_PINPAD, "密钥加载失败,请检查密码键盘连接。");//,待完善细化错误码oiltest
-				}
-			}
-			else
-				m_entity->EndInitMK(Error_Succeed, "");
-		}
-		else {
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("InitializerInitMKTask").setBeginTime(beg).setEndTime(end).
-				setResultCode(std::to_string(LONGLONG(initMKRet.m_sysCode)).c_str()).
-				setResultMsg(initMKRet.m_errMsg.c_str())("InitializerInitMKTask Connect Failed.");
-			m_entity->EndInitMK(ERR_INITIALIZER_EXCEPTION, CSimpleStringA::Format("初始化服务连接失败。%d", ret).GetData());
-		}
-		client->Destory();
-#else
-		CInitlizerMKReq initMKReq;//oiltest dev module count
-		bool initFlag = m_entity->SendInitMKReqACS(initMKReq);
-		if (!initFlag)
+		if (m_fsm->containsChinese(m_fsm->GetmAccessAuthHost().GetData()))
 		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5204")("连接密码键盘异常");
-			m_entity->EndInitMK(ERR_ACCESSAUTH_CONNECT_PINPAD, "连接密码键盘异常,请检查");//,待完善细化错误码oiltest
+			m_entity->EndInitMK(ERR_INITIALIZER_EXCEPTION, CSimpleStringA::Format("初始化服务连接失败,URL含中文。").GetData());
+			return;
 		}
 
 		auto tmkpair = m_entity->GenerateTmkToKMC();
@@ -196,8 +142,9 @@ struct InitializerInitMKTask : ITaskSp
 			SP::Module::Restful::CommResponseJson responseStatus;
 			SP::Module::Restful::GetStatusFromDebranchResponse(result.content, responseStatus);
 			if (!responseStatus.IsOperatedOK()) {
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("update wk failed: %s", responseStatus.errorMsg.c_str());
-				m_entity->EndInitMK(ERR_INITIALIZER_EXCEPTION, responseStatus.errorMsg.c_str());
+				CSimpleStringA errMsg = CSimpleStringA::Format("%s|%s", responseStatus.errorCode.c_str(), responseStatus.errorMsg.c_str());
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("initmk failed: %s", errMsg.GetData());
+				m_entity->EndInitMK(ERR_INITIALIZER_EXCEPTION, errMsg.GetData());
 			}
 			else {
 				//服务端返回成功再将数据写入AcessAuthourization.ini
@@ -229,7 +176,6 @@ struct InitializerInitMKTask : ITaskSp
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("post wk failed: %s", result.WhatError().c_str());
 			m_entity->EndInitMK(ERR_INITIALIZER_EXCEPTION, CSimpleStringA::Format("初始化服务连接失败。%s", result.WhatError().c_str()).GetData());
 		}
-#endif //RVC_OS_WIN
 	}
 };
 
@@ -592,26 +538,16 @@ bool CAccessAuthEntity::SaveAuthKey(BYTE *pKey)
 	}
 
 	char privateKey[BUF_SIZE] = { 0 };
-#ifdef RVC_OS_WIN
-	iniPath = runInfoPath + "\\runcfg\\AccessAuthorization.ini";
-	GetPrivateProfileString("TerminalPD", "PrivateKey", "", privateKey, BUF_SIZE, iniPath.GetData());
-#else
 	iniPath = runInfoPath + SPLIT_SLASH_STR "runcfg" SPLIT_SLASH_STR "AccessAuthorization.ini";
 	char* tmp = inifile_read_str(iniPath.GetData(), "TerminalPD", "PrivateKey", "");
 	strcpy(privateKey, tmp);
 	delete tmp;
-#endif // RVC_OS_WIN
 
 	if (strlen(privateKey) <= 0) {
-#ifdef RVC_OS_WIN
-		iniPath = runInfoPath + "\\runcfg\\Initializer.ini";
-		GetPrivateProfileString("TerminalPD", "PrivateKey", "", privateKey, BUF_SIZE, iniPath.GetData());
-#else
 		iniPath = runInfoPath + SPLIT_SLASH_STR "runcfg" SPLIT_SLASH_STR "Initializer.ini";
 		char* tmp2 = inifile_read_str(iniPath.GetData(), "TerminalPD", "PrivateKey", "");
 		strcpy(privateKey, tmp2);
 		delete tmp2;
-#endif // RVC_OS_WIN
 		if (strlen(privateKey) <= 0)
 		{
 			printPasswdError("私钥为空,请重置秘钥进行初始化");
@@ -621,11 +557,7 @@ bool CAccessAuthEntity::SaveAuthKey(BYTE *pKey)
 
 	int decodedPrivateKeyLen;
 
-#ifdef RVC_OS_WIN
-	char* pDecodedPrivateKey = MyBase64::Hex2Str(privateKey, decodedPrivateKeyLen);
-#else
 	char* pDecodedPrivateKey = Hex2Str(privateKey, decodedPrivateKeyLen);
-#endif // RVC_OS_WIN
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("privateKey len:%d, decodedPrivateKeyLen=%d", strlen(privateKey), decodedPrivateKeyLen);
 
 	char pDecryptPrivateKey[BUF_SIZE] = { 0 };
@@ -643,11 +575,7 @@ bool CAccessAuthEntity::SaveAuthKey(BYTE *pKey)
 	char pKeyLen[4] = { 0 };
 	memcpy(pKeyLen, pKey, 4);
 	int kenLen = Char2Int(pKeyLen);
-#ifdef RVC_OS_WIN
-	char* pEncodeKey = MyBase64::Str2Hex((char*)pKey,kenLen + 4);
-#else
 	char* pEncodeKey = Str2Hex((char*)pKey, kenLen + 4);
-#endif
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("kenLen=%d", kenLen);
 	delete pEncodeKey;
 	char* key = new char[kenLen + 1];
@@ -699,21 +627,13 @@ ErrorCodeEnum CAccessAuthEntity::EncryptDataWithSessionKey(const CBlob &raw, CBl
 	BYTE* pEncData = new BYTE[1024];
 	int pEncDataSize = 1024;
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pEncDataSize=%d", pEncDataSize);
-#ifdef RVC_OS_WIN
-	char* pPlainInfo = MyBase64::Str2Hex((char*)raw.m_pData, raw.m_iLength);
-#else
 	char* pPlainInfo = Str2Hex((char*)raw.m_pData, raw.m_iLength);
-#endif
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("raw Length=%d", raw.m_iLength);
 	delete[] pPlainInfo;
 	
 	char sessionKey[KEY_SIZE] = { 0 };
 	memcpy(sessionKey,m_AuthSessionKey,KEY_SIZE);
-#ifdef RVC_OS_WIN
-	char* tmpKey = MyBase64::Str2Hex((char*)m_AuthSessionKey, KEY_SIZE);
-#else
 	char* tmpKey = Str2Hex((char*)m_AuthSessionKey, KEY_SIZE);
-#endif // RVC_OS_WIN
 	delete[] tmpKey;
 
 	if (!EncWithSM4_ECB((BYTE*)sessionKey, (BYTE*)(raw.m_pData), raw.m_iLength, pEncData, &pEncDataSize)) {
@@ -723,19 +643,11 @@ ErrorCodeEnum CAccessAuthEntity::EncryptDataWithSessionKey(const CBlob &raw, CBl
 	
 	enc.Attach(pEncData,pEncDataSize);
 
-#ifdef RVC_OS_WIN
-	char* tmp = MyBase64::Str2Hex((char*)pEncData, pEncDataSize);
-#else
 	char* tmp = Str2Hex((char*)pEncData, pEncDataSize);
-#endif // RVC_OS_WIN
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pEncData size:%d", pEncDataSize);
 	delete[] tmp;
 
-#ifdef RVC_OS_WIN
-	tmp = MyBase64::Str2Hex((char*)enc.m_pData, enc.m_iLength);
-#else
 	tmp = Str2Hex((char*)enc.m_pData, enc.m_iLength);
-#endif // RVC_OS_WIN
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("EncWithSM4_ECB data size:%d", enc.m_iLength);
 	delete[] tmp;
 
@@ -790,9 +702,9 @@ bool CAccessAuthEntity::GetTerminalFingerPrint(BYTE *pBuf, int &nBufLen)
 		strErrMsg = CSimpleStringA::Format("查询CPU ID失败,请重启机器并重新初始化");
 		SetAuthErrMsg((const char*)strErrMsg);
 
-		m_FSM.doWarnMsg(ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETCPUID,
 			GetOutPutStr("%s%s", "Processor", "False").c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5213")
 			(GetOutPutStr("%s%s", "Processor", "False").c_str());
 		return false;
 	}
@@ -804,9 +716,9 @@ bool CAccessAuthEntity::GetTerminalFingerPrint(BYTE *pBuf, int &nBufLen)
 		strErrMsg = CSimpleStringA::Format("查询主板序列号失败,  请重启机器并重新初始化");
 		SetAuthErrMsg((const char*)strErrMsg);
 
-		m_FSM.doWarnMsg(ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETBASEBOARDSN,
 			GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5214")
 			(GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
 		return false;
 	}
@@ -821,8 +733,10 @@ bool CAccessAuthEntity::GetTerminalFingerPrint(BYTE *pBuf, int &nBufLen)
 		strErrMsg = CSimpleStringA::Format("查询磁盘序列号失败, 请重启机器并重新初始化");
 		SetAuthErrMsg((const char*)strErrMsg);
 
-		m_FSM.doWarnMsg(ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_DISKDRIVESN,
 			GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5215")
+			(GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
 		return false;
 	}
 	strRet += "|";
@@ -872,16 +786,6 @@ bool CAccessAuthEntity::GetTerminalFingerPrint(BYTE *pBuf, int &nBufLen)
 	return true;
 }
 
-#ifdef RVC_OS_WIN
-#define RSAPUBKEY_BITLEN 1024
-struct PublicKeyBlob
-{
-	PUBLICKEYSTRUC  publickeystruc;
-	RSAPUBKEY rsapubkey;
-	BYTE modulus[RSAPUBKEY_BITLEN / 8];
-};
-#endif // RVC_OS_WIN
-
 // 生成RSA密钥对,并导出公钥
 bool CAccessAuthEntity::GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& pubkey)
 {
@@ -892,8 +796,8 @@ bool CAccessAuthEntity::GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& p
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("GetPath runinfo error=%d.", rc);
 		return false;
 	}
+	runInfoPath += SPLIT_SLASH_STR "runcfg" SPLIT_SLASH_STR;
 #ifdef RVC_OS_WIN
-	runInfoPath += "\\runcfg\\";
 	DWORD dwAttr = GetFileAttributes(runInfoPath.GetData());
 	if (dwAttr == 0xFFFFFFFF)  //目录不存在则创建   
 	{
@@ -903,7 +807,6 @@ bool CAccessAuthEntity::GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& p
 		}
 	}
 #else
-	runInfoPath += SPLIT_SLASH_STR "runcfg" SPLIT_SLASH_STR;
 	if (!dir_is_exist(runInfoPath.GetData()))
 	{
 		if (dir_create(runInfoPath.GetData()) != 0)
@@ -935,11 +838,7 @@ bool CAccessAuthEntity::GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& p
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("iPublicKeyLen=%d,iPrivateKeyLen=%d", iPublicKeyLen, iPrivateKeyLen);
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("[btPublicKey=%s]", (char*)btPublicKey);
 
-#ifdef RVC_OS_WIN
-	char* pEncode = MyBase64::Str2Hex((char*)btPublicKey, iPublicKeyLen);
-#else
 	char* pEncode = Str2Hex((char*)btPublicKey, iPublicKeyLen);
-#endif // RVC_OS_WIN
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("pEncode=%s,%d", pEncode, strlen(pEncode));
 
 	/*rc = pConfig->WriteConfigValue("TerminalPD", "PublicKey", pEncode);
@@ -962,11 +861,7 @@ bool CAccessAuthEntity::GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& p
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("sm4 encrypt pri key success.");
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("cryptPrivateKeyLen=%d", cryptPrivateKeyLen);
 
-#ifdef RVC_OS_WIN
-	char* pEncodedCryptPrivateKey = MyBase64::Str2Hex((char*)pCryptPrivateKey, cryptPrivateKeyLen);
-#else
 	char* pEncodedCryptPrivateKey = Str2Hex((char*)pCryptPrivateKey, cryptPrivateKeyLen);
-#endif // RVC_OS_WIN
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("encode pri key success.");
 
 	m_privateKey = pEncodedCryptPrivateKey;
@@ -982,11 +877,7 @@ bool CAccessAuthEntity::GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& p
 	delete[] pEncode;
 	delete[] pEncodedCryptPrivateKey;
 
-#ifdef RVC_OS_WIN
-	char* pDecode = MyBase64::Hex2Str(publicKey.GetData(), nBufLen);
-#else
 	char* pDecode = Hex2Str(publicKey.GetData(), nBufLen);
-#endif // RVC_OS_WIN
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("pDecode=[%s],len=%d", pDecode, nBufLen);
 
 	memcpy(pBuf, pDecode, nBufLen);
@@ -1000,7 +891,6 @@ int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimp
 {
 	isPinPadMac = false;
 	bPinPadOnline = false;
-	m_bNewSMFWB = false;
 	CSimpleStringA strErrMsg;
 	CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
 
@@ -1077,24 +967,15 @@ int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimp
 							if (!strBluetoothID.IsNullOrEmpty())
 								bBluetooth = true;
 						}
-#ifdef RVC_OS_WIN
-						else if (!strnicmp((LPCTSTR)arr2[0], "PM", strlen("PM")))
-						{
-							CSimpleStringA strPM = arr2[1];
-
-							if (!strPM.IsNullOrEmpty() && strPM.Compare("V3.0", true) == 0)
-								m_bNewSMFWB = true;
-						}
-#endif // RVC_OS_WIN
 					}
 				}
 			}
 		}
-		else if (rc == Error_NotInit)
+		else if(rc == Error_NotInit)
 		{
 			if (!HasPinPad())
 				isPinPadMac = false;
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pinpad NOT INIT!");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pinpad NOT INIT!, state: %d", ans.state);
 			return nRet; //此时nRet = -1, pinpad调用失败
 		}
 		else
@@ -1367,42 +1248,6 @@ bool CAccessAuthEntity::SendInitMKReqACS(CInitlizerMKReq& initMKReq)
 {
 	LOG_FUNCTION();
 	CSmartPointer<IEntityFunction> pFunc = GetFunction();
-#ifdef RVC_OS_LINUX
-	if (HasPinPad())
-	{
-		CSmartPointer<IConfigInfo> pConfig;
-		DWORD rc = pFunc->OpenConfig(Config_CenterSetting, pConfig);
-		if (rc != Error_Succeed)
-		{
-			LogWarn(Severity_Middle, (ErrorCodeEnum)rc, ERR_INITIALIZER_FILE_ERROR,
-				GetOutPutStr("%s%08X%s%s", "OpenConfig", rc, "File", "Config_CenterSetting").c_str());
-			rc = ERR_INITIALIZER_FILE_ERROR;
-			return rc;
-		}
-
-		CSimpleStringA strSubBankNo, strBranchNo;
-		rc = pConfig->ReadConfigValue("Initializer", "SubBankNo", strSubBankNo);
-		if (rc == Error_Succeed)
-			rc = pConfig->ReadConfigValue("Initializer", "BranchNo", strBranchNo);
-
-		if (rc != Error_Succeed)
-		{
-			LogWarn(Severity_Low, (ErrorCodeEnum)rc, ERR_INITIALIZER_FILE_ERROR,
-				GetOutPutStr("%s%08X%s%s", "ReadConfigValue", rc, "File", "SubBankNo & BranchNo").c_str());
-			rc = ERR_INITIALIZER_FILE_ERROR;
-			return rc;
-		}
-
-		// 1:3des only; 2: sm4 only; 3: both 3des and sm4
-		int nCapability = GetPinPadCapability();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pinpad capability: %d", nCapability);
-	}
-	else
-	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("has no pinpad, not need init MK");
-	}
-#endif // RVC_OS_LINUX
-
 	CSimpleStringA strPinPadID = "", strDeviceID = "";
 	bool isPinPadMac, bPinPadOnline;
 	int nRet = GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, isPinPadMac, bPinPadOnline);
@@ -1576,13 +1421,6 @@ void CAccessAuthEntity::EndInitMK(DWORD rc, const char *pszErrMsg)
 ErrorCodeEnum CAccessAuthEntity::LoadKeysToPinPadACS(string TMK, string TPK, string EDK, string index, string tpkCheck, string edkCheck)
 {
 	LOG_FUNCTION();
-#ifdef RVC_OS_WIN
-	if (m_bNewSMFWB && m_FSM.GetDevPubKey().GetLength() <= 0)
-	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("新蓝牙多合一密钥初始化依赖加密通道建立时的设备公钥,不具备,跳过密钥初始化");
-		return Error_Succeed;
-	}
-#endif // RVC_OS_WIN
 	//加载到密码键盘
 	PinPadService_ClientBase* pPinPad = new PinPadService_ClientBase(this);
 	auto rc = pPinPad->Connect();
@@ -1590,24 +1428,8 @@ ErrorCodeEnum CAccessAuthEntity::LoadKeysToPinPadACS(string TMK, string TPK, str
 	{
 		PinPadService_LoadKeysSM_Req req = {};
 		req.initializeflag = true;
-		if (m_bNewSMFWB)
-		{
-			//oilyang@20220902 to encrypte tmp using device public key
-			req.smflag = 11;
-			auto tmkpairDev = GenerateTmkToDevice();
-			if (tmkpairDev.first.length() <= 0)
-			{
-				//oiltest todo 补充错误信息
-				return Error_Unexpect;
-			}
-			else
-				req.masterkey = tmkpairDev.first.c_str();
-		}
-		else
-		{
-			req.smflag = 1;
-			req.masterkey = TMK.c_str();
-		}
+		req.smflag = 1;
+		req.masterkey = TMK.c_str();
 
 		req.workingkey1 = TPK.c_str();
 		req.workingkey2 = EDK.c_str();
@@ -1710,31 +1532,18 @@ pair<string, string> CAccessAuthEntity::EncryptedByPubKey(CSimpleStringA pubKey,
 	if (pubKey.GetLength() <= 0)
 		return make_pair("", "");
 	PCHAR strRam = new CHAR[512];
-#ifdef RVC_OS_WIN
-	ZeroMemory(strRam, 512);
-#else
 	memset(strRam, 0, 512);
-#endif // RVC_OS_WIN
 	memcpy(strRam, &(m_btRam[0]), 16);
 	HexBuf2StrBuf((PBYTE)m_btRam, &strRam, 16);
 	const int MAX_KEY_SIZE = 256;
 	char random_enc_bypbk[MAX_KEY_SIZE];
-#ifdef RVC_OS_WIN
-	ZeroMemory(random_enc_bypbk, MAX_KEY_SIZE);
-#else
 	memset(random_enc_bypbk, 0, MAX_KEY_SIZE);
-#endif // RVC_OS_WIN
 	//公钥加密随机数
 	int outMsgLen = MAX_KEY_SIZE;
 	PBYTE pxxKey = new BYTE[256];
 	PBYTE pOldPubKey = new BYTE[256];
-#ifdef RVC_OS_WIN
-	ZeroMemory(pxxKey, 256);
-	ZeroMemory(pOldPubKey, 256);
-#else
 	memset(pOldPubKey, 0, 256);
 	memset(pxxKey, 0, 256);
-#endif // RVC_OS_WIN
 
 	int size = StrBuf2HexBuf(pubKey.GetData(), &pOldPubKey);
 	if (bNeed04Head)
@@ -1752,12 +1561,8 @@ pair<string, string> CAccessAuthEntity::EncryptedByPubKey(CSimpleStringA pubKey,
 	}
 
 	PBYTE tmp_enc_bypbk = new BYTE[112];
-#ifdef RVC_OS_WIN
-	ZeroMemory(tmp_enc_bypbk, 112);
-#else
 	memset(tmp_enc_bypbk, 0, 112);
-#endif // RVC_OS_WIN
-	//tmp_enc_bypbk[0] = 0x04;
+	
 	if (bNeed04Head)
 	{
 		memcpy(tmp_enc_bypbk, &(random_enc_bypbk[1]), 112);
@@ -1771,11 +1576,7 @@ pair<string, string> CAccessAuthEntity::EncryptedByPubKey(CSimpleStringA pubKey,
 
 
 	PCHAR pBlock = new CHAR[512];
-#ifdef RVC_OS_WIN
-	ZeroMemory(pBlock, 512);
-#else
 	memset(pBlock, 0, 512);
-#endif // RVC_OS_WIN
 	BYTE tmpRandomEnc[512];
 	memset(tmpRandomEnc, 0, 512);
 	memcpy(tmpRandomEnc, &(tmp_enc_bypbk[0]), outMsgLen - 1);

+ 0 - 2
Module/mod_accessauth/mod_AccessAuth.h

@@ -34,7 +34,6 @@ public:
 	CAccessAuthEntity()
 	{
 		m_eErrNum = Error_Succeed;
-		m_bNewSMFWB = false;
 		m_iGetTermSysInfo = 0;
 	}
 	virtual ~CAccessAuthEntity()
@@ -193,7 +192,6 @@ protected:
 
 private:
 	bool GenerateRandomNum();
-	bool m_bNewSMFWB;
 	BYTE m_btRam[16], m_btTermSysInfoSM3[32];
 	int m_iGetTermSysInfo;//0:初始值,尚未完成获取过程 1:成功 -1:失败
 };

+ 13 - 0
Module/mod_healthmanager/mod_healthmanager.h

@@ -89,6 +89,19 @@ public:
 
 	virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext) 
 	{
+		CSystemRunInfo runInfo = { 0 };
+		ErrorCodeEnum ec = GetFunction()->GetSystemRunInfo(runInfo);
+		if (runInfo.autoTest) //测试模式,该模式下无需启动guardian
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Test mode, no need to start guardian.");
+			m_bNeedGuardian = false;
+			if (CheckGuardianIsRun() > 0)//or true?
+			{
+				bool bStop = StopGuardian();
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Test mode, guardian running, to stop guardian:%d", bStop);
+			}
+		}
+
 		ErrorCodeEnum eErrCode = m_fsm.Init(this);
 		if (eErrCode == Error_Succeed) {
             DoRestart();

+ 2 - 0
addin/cfg/simulator/cmbsz.ini

@@ -0,0 +1,2 @@
+[server]
+url=http://emulator.paasuat.cmbchina.cn/emulator/avs/retrieveEmulatorData

+ 63 - 0
addin/packaging/UOS/test.sh

@@ -0,0 +1,63 @@
+#!/bin/sh
+
+MY_PATH="`dirname \"$0\"`"              # relative
+MY_PATH="`( cd \"$MY_PATH\" && pwd )`"  # absolutized and normalized
+
+
+
+bootscripts=""
+
+
+check_dir_exists() {
+	if [ ! -d "$*" ]; then
+		echo "\n"
+		echo "=============================================================="
+		echo "   文件夹 $* 不存在!  "
+		echo "==============================================================\n"
+		exit 2
+	fi
+}
+
+check_file_exists() {
+	if [ ! -f "$*" ]; then
+		echo "\n"
+		echo "=============================================================="
+		echo "   文件 $* 不存在!  "
+		echo "==============================================================\n"
+		exit 2
+	fi
+}
+
+versionpath=""
+versionpath=$MY_PATH"/active.txt"
+# echo $versionpath
+line=""
+version=$(cat $versionpath)
+version=`echo ${version} | sed -e 's/^[ \t]*//g' -e 's/^[ \t]*$//g'`
+if [ -z "$version" ]; then
+    echo "\n"
+	echo "=============================================================="
+	echo "   文件 ${versionpath} 不存在或内容为空!  "
+	echo "==============================================================\n"
+	exit 1
+fi
+
+if [  "$(gsettings get com.deepin.dde.dock hide-mode)" != "'keep-hidden'" ]; then
+	gsettings set com.deepin.dde.dock hide-mode keep-hidden
+fi
+
+# add library search path
+LIBDIR=${MY_PATH}"/"${version}"/bin"
+check_dir_exists ${LIBDIR}
+
+bootscripts=$LIBDIR"/spshellstart.sh"
+echo $bootscripts
+chmod 766 $bootscripts
+
+if [ $# -eq 0 ]
+then
+	sudo $bootscripts --autotest
+else
+	# echo $#
+	sudo $bootscripts $*
+fi

+ 29 - 0
addin/packaging/WIN/test.vbs

@@ -0,0 +1,29 @@
+base_dir = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName, "\"))
+version_path = base_dir & "active.txt"
+version = ReadVersion(version_path)
+bin_path = base_dir & version & "\bin\spshell.exe --autotest"
+Run bin_path
+
+Sub Run(ByVal sFile)
+Dim shell
+	Set shell = CreateObject("WScript.Shell")
+	shell.Run sFile, 1, false
+	Set shell = nothing
+End Sub
+
+Function ReadVersion(sFile)
+	Dim fs
+	Dim tfs
+	Set fs = CreateObject("Scripting.FileSystemObject")
+	Set tfs = fs.OpenTextFile(sFile, 1, True)
+	ReadVersion = Trim(tfs.ReadLine)
+	tfs.Close
+	Set tfs = Nothing
+	Set fs = Nothing
+End Function
+
+Dim objShell
+Set objShell = WScript.CreateObject("WScript.Shell")
+
+objShell.Run "https://emulatorsimulator.paasuat.cmbchina.cn/"
+Set objShell = Nothing