Browse Source

Z991239-5251 #comment 硬件模拟器跨平台

陈纪林80310970 1 year ago
parent
commit
2a908820b5
36 changed files with 5346 additions and 0 deletions
  1. 333 0
      DevAdapter/DeviceSimulator.h
  2. 22 0
      DevAdapter/simulator/CMakeLists.txt
  3. 45 0
      DevAdapter/simulator/FingerPrint.1.1/CMakeLists.txt
  4. 382 0
      DevAdapter/simulator/FingerPrint.1.1/FingerPrint_impl.cpp
  5. 82 0
      DevAdapter/simulator/FingerPrint.1.1/FingerPrint_impl.h
  6. 44 0
      DevAdapter/simulator/FingerPrint.7.1/CMakeLists.txt
  7. 95 0
      DevAdapter/simulator/FingerPrint.7.1/FingerPrint_Impl.cpp
  8. 35 0
      DevAdapter/simulator/FingerPrint.7.1/FingerPrint_Impl.h
  9. 41 0
      DevAdapter/simulator/cardissuer.1.1/CMakeLists.txt
  10. 1532 0
      DevAdapter/simulator/cardissuer.1.1/cardissuer_impl.cpp
  11. 302 0
      DevAdapter/simulator/cardissuer.1.1/cardissuer_impl.h
  12. 44 0
      DevAdapter/simulator/cardswiper.1.1/CMakeLists.txt
  13. 199 0
      DevAdapter/simulator/cardswiper.1.1/cardswiper_impl.cpp
  14. 58 0
      DevAdapter/simulator/cardswiper.1.1/cardswiper_impl.h
  15. 39 0
      DevAdapter/simulator/contactlesscard.1.1/CMakeLists.txt
  16. 71 0
      DevAdapter/simulator/contactlesscard.1.1/contactless_impl.cpp
  17. 109 0
      DevAdapter/simulator/contactlesscard.1.1/contactless_impl.h
  18. 39 0
      DevAdapter/simulator/devctrl.1.1/CMakeLists.txt
  19. 72 0
      DevAdapter/simulator/devctrl.1.1/devctrl_impl.cpp
  20. 44 0
      DevAdapter/simulator/devctrl.1.1/devctrl_impl.h
  21. 39 0
      DevAdapter/simulator/gpio.1.1/CMakeLists.txt
  22. 71 0
      DevAdapter/simulator/gpio.1.1/gpio_impl.cpp
  23. 58 0
      DevAdapter/simulator/gpio.1.1/gpio_impl.h
  24. 39 0
      DevAdapter/simulator/gpio.1.2/CMakeLists.txt
  25. 156 0
      DevAdapter/simulator/gpio.1.2/gpio_impl.cpp
  26. 62 0
      DevAdapter/simulator/gpio.1.2/gpio_impl.h
  27. 38 0
      DevAdapter/simulator/hspscanner.1.1/CMakeLists.txt
  28. 71 0
      DevAdapter/simulator/hspscanner.1.1/hspscanner_impl.cpp
  29. 113 0
      DevAdapter/simulator/hspscanner.1.1/hspscanner_impl.h
  30. 39 0
      DevAdapter/simulator/idcer.1.1/CMakeLists.txt
  31. 619 0
      DevAdapter/simulator/idcer.1.1/idcer.cmbsz.cpp
  32. 134 0
      DevAdapter/simulator/idcer.1.1/idcer.cmbsz.h
  33. 23 0
      DevAdapter/simulator/include/demo.h
  34. 44 0
      DevAdapter/simulator/pinpad.1.1/CMakeLists.txt
  35. 205 0
      DevAdapter/simulator/pinpad.1.1/pinpad_impl.cpp
  36. 47 0
      DevAdapter/simulator/pinpad.1.1/pinpad_impl.h

+ 333 - 0
DevAdapter/DeviceSimulator.h

@@ -0,0 +1,333 @@
+//用于定义实现一些模拟器通用的函数功能
+#include <string>
+#include <stdio.h>
+#include <stdlib.h>
+#include <fstream>
+#include <string>
+#include <map>
+#ifdef RVC_OS_WIN
+#include <WinSock2.h>
+#else
+#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>
+#endif
+
+//读取配置文件功能类
+class iniReader
+{
+public:
+	iniReader()
+	{
+	}
+	~iniReader()
+	{
+	}
+	bool ReadConfig(const std::string& filename)
+	{
+		settings_.clear();
+		std::ifstream infile(filename.c_str());//构造默认调用open,所以可以不调用open
+		//std::ifstream infile;
+		//infile.open(filename.c_str());
+		//bool ret = infile.is_open()
+		if (!infile) {
+			return false;
+		}
+		std::string line, key, value, section;
+		std::map<std::string, std::string> k_v;
+		std::map<std::string, std::map<std::string, std::string> >::iterator it;
+		while (getline(infile, line))
+		{
+			if (AnalyseLine(line, section, key, value))
+			{
+				it = settings_.find(section);
+				if (it != settings_.end())
+				{
+					k_v[key] = value;
+					it->second = k_v;
+				}
+				else
+				{
+					k_v.clear();
+					settings_.insert(std::make_pair(section, k_v));
+				}
+			}
+			key.clear();
+			value.clear();
+		}
+		infile.close();
+		return true;
+	}
+
+	std::string ReadString(const char* section, const char* item, const char* default_value)
+	{
+		std::string tmp_s(section);
+		std::string tmp_i(item);
+		std::string def(default_value);
+		std::map<std::string, std::string> k_v;
+		std::map<std::string, std::string>::iterator it_item;
+		std::map<std::string, std::map<std::string, std::string> >::iterator it;
+		it = settings_.find(tmp_s);
+		if (it == settings_.end())
+		{
+			//printf("111");
+			return def;
+		}
+		k_v = it->second;
+		it_item = k_v.find(tmp_i);
+		if (it_item == k_v.end())
+		{
+			//printf("222");
+			return def;
+		}
+		return it_item->second;
+	}
+
+	int ReadInt(const char* section, const char* item, const int& default_value)
+	{
+		std::string tmp_s(section);
+		std::string tmp_i(item);
+		std::map<std::string, std::string> k_v;
+		std::map<std::string, std::string>::iterator it_item;
+		std::map<std::string, std::map<std::string, std::string> >::iterator it;
+		it = settings_.find(tmp_s);
+		if (it == settings_.end())
+		{
+			return default_value;
+		}
+		k_v = it->second;
+		it_item = k_v.find(tmp_i);
+		if (it_item == k_v.end())
+		{
+			return default_value;
+		}
+		return atoi(it_item->second.c_str());
+	}
+
+	float ReadFloat(const char* section, const char* item, const float& default_value)
+	{
+		std::string tmp_s(section);
+		std::string tmp_i(item);
+		std::map<std::string, std::string> k_v;
+		std::map<std::string, std::string>::iterator it_item;
+		std::map<std::string, std::map<std::string, std::string> >::iterator it;
+		it = settings_.find(tmp_s);
+		if (it == settings_.end())
+		{
+			return default_value;
+		}
+		k_v = it->second;
+		it_item = k_v.find(tmp_i);
+		if (it_item == k_v.end())
+		{
+			return default_value;
+		}
+		return atof(it_item->second.c_str());
+	}
+
+private:
+	bool IsSpace(char c)
+	{
+		if (' ' == c || '\t' == c)
+			return true;
+		return false;
+	}
+
+	bool IsCommentChar(char c)
+	{
+		switch (c)
+		{
+		case '#':
+			return true;
+		default:
+			return false;
+		}
+	}
+
+	void Trim(std::string& str)
+	{
+		if (str.empty())
+		{
+			return;
+		}
+		int i, start_pos, end_pos;
+		for (i = 0; i < str.size(); ++i) {
+			if (!IsSpace(str[i])) {
+				break;
+			}
+		}
+		if (i == str.size())
+		{
+			str = "";
+			return;
+		}
+		start_pos = i;
+		for (i = str.size() - 1; i >= 0; --i) {
+			if (!IsSpace(str[i])) {
+				break;
+			}
+		}
+		end_pos = i;
+		str = str.substr(start_pos, end_pos - start_pos + 1);
+	}
+
+	bool AnalyseLine(const std::string& line, std::string& section, std::string& key, std::string& value)
+	{
+		if (line.empty())
+			return false;
+		int start_pos = 0, end_pos = line.size() - 1, pos, s_startpos, s_endpos;
+		if ((pos = line.find("#")) != -1)
+		{
+			if (0 == pos)
+			{
+				return false;
+			}
+			end_pos = pos - 1;
+		}
+		if (((s_startpos = line.find("[")) != -1) && ((s_endpos = line.find("]"))) != -1)
+		{
+			section = line.substr(s_startpos + 1, s_endpos - 1);
+			return true;
+		}
+		std::string new_line = line.substr(start_pos, start_pos + 1 - end_pos);
+		if ((pos = new_line.find('=')) == -1)
+			return false;
+		key = new_line.substr(0, pos);
+		value = new_line.substr(pos + 1, end_pos + 1 - (pos + 1));
+		Trim(key);
+		if (key.empty()) {
+			return false;
+		}
+		Trim(value);
+		if ((pos = value.find("\r")) > 0)
+		{
+			value.replace(pos, 1, "");
+		}
+		if ((pos = value.find("\n")) > 0)
+		{
+			value.replace(pos, 1, "");
+		}
+		return true;
+	}
+
+private:
+	//std::map<std::string, std::string> settings_;
+	std::map<std::string, std::map<std::string, std::string> >settings_;
+};
+
+
+//读取本地IP功能函数
+std::string GetLocalIP()
+{
+	return "123";
+#ifdef RVC_OS_WIN
+	//hostent* ent = gethostbyname(NULL);
+	//if (ent && ent->h_addr_list[0] != NULL)
+	//{
+	//	int i = 0;
+	//	for (; ent->h_addr_list[i] != NULL; ++i)
+	//	{
+	//		struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
+	//		if (in->S_un.S_un_b.s_b1 == 99 || in->S_un.S_un_b.s_b1 == 10)
+	//			break;
+	//	}
+
+	//	if (ent->h_addr_list[i] == NULL)
+	//		i = 0;
+
+	//	auto in = (struct in_addr*)ent->h_addr_list[i];
+	//	char xIP[64] = {};
+	//	sprintf(xIP, "%d.%d.%d.%d", in->S_un.S_un_b.s_b1, in->S_un.S_un_b.s_b2, in->S_un.S_un_b.s_b3, in->S_un.S_un_b.s_b4);
+	//	//LOG4VTM(INFO, ("ip:%s", xIP));
+
+	//	return std::string(xIP);
+	//}
+#else
+	std::string re = "";
+	int sfd, intr;
+	struct ifreq buf[16];
+	struct ifconf ifc;
+	sfd = socket(AF_INET, SOCK_DGRAM, 0);
+	if (sfd < 0)
+		return "wrong 1: get ip socket failed";
+	ifc.ifc_len = sizeof(buf);
+	ifc.ifc_buf = (caddr_t)buf;
+	if (ioctl(sfd, SIOCGIFCONF, (char*)&ifc))
+		return "wrong 2: get ip ioctl failed";
+	intr = ifc.ifc_len / sizeof(struct ifreq);
+	while (intr-- > 0 && ioctl(sfd, SIOCGIFADDR, (char*)&buf[intr]));
+	close(sfd);
+	unsigned long ip = ntohl(((struct sockaddr_in*)(&buf[intr].ifr_addr))->sin_addr.s_addr);
+
+	char* str = new char[1024];
+	sprintf(str, "%u.%u.%u.%u", ip >> 24 & 0xFF, ip >> 16 & 0xFF, ip >> 8 & 0xFF, ip >> 0 & 0xFF);
+	re = str;
+	return re;
+#endif
+}
+
+
+std::string GetValueFromIni(const std::string& filePath, const std::string& section, const std::string& key) {
+    std::ifstream file(filePath);
+    std::string line;
+    std::string value;
+    bool sectionFound = false;
+
+    while (std::getline(file, line)) {
+        if (!sectionFound && line == "[" + section + "]") {
+            sectionFound = true;
+        }
+        else if (sectionFound) {
+            size_t found = line.find(key);
+            if (found != std::string::npos) {
+                size_t equalsPos = line.find("=");
+                value = line.substr(equalsPos + 1);
+                break;
+            }
+        }
+    }
+
+    return value;
+}
+
+
+int StrBuf2HexBuf(LPCTSTR strBuf, PBYTE* hexBuf)
+{
+	int len = strlen(strBuf);
+	if (len == 0 || len % 2 != 0)
+		return 0;
+	BYTE* buf = new BYTE[len / 2];
+	if (buf == NULL)
+		return 0;
+	int j = 0;
+	for (int i = 0; i < len;)
+	{
+		int tmpVal;
+		sscanf(strBuf + i, "%2X", &tmpVal);
+		buf[j] = tmpVal;
+		//buf[j] = char2int(strBuf[i])*16 + char2int(strBuf[i+1]);
+		i += 2;
+		j++;
+	}
+	//memcpy(buf,strBuf,len);
+	*hexBuf = buf;
+	return j;
+}
+
+int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len)
+{
+	char* tmpStr = *strBuf;
+	int count = 0;
+	for (int i = 0; i < len; ++i)
+	{
+		sprintf(tmpStr + count, "%0.2X", hexBuf[i]);
+		count += 2;
+	}
+	return 0;
+}

+ 22 - 0
DevAdapter/simulator/CMakeLists.txt

@@ -0,0 +1,22 @@
+cmake_minimum_required(VERSION 2.8)
+
+STRING( REGEX REPLACE ".*/(.*)" "\\1" CURRENT_VENDOR ${CMAKE_CURRENT_SOURCE_DIR} )
+message(STATUS "CURRENT_VENDOR : ${CURRENT_VENDOR}")
+project(${CURRENT_VENDOR} C CXX)
+
+set(CMAKE_COLOR_MAKEFILE ON)
+if(MSVC)
+	add_definitions(-DDEVICEBASE_EXPORTS -DDEMO_LIBRARY_EXPORTS)
+endif(MSVC)
+# VENDOR_CURRENT_{DEPS|INCLUDE|ASSET|LIB|BIN}_DIR 等定义已集成到该宏内
+rvc_define_dependen_dirs()
+
+# 遍历当前目录下带有CMakeLists.txt文件的文件夹
+rvc_traverse_sub_cmake_dirs()
+
+#  =-=-=-=-=-=-=-=-=-= {VendorName}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_aggereate_runtime_file()
+
+
+
+

+ 45 - 0
DevAdapter/simulator/FingerPrint.1.1/CMakeLists.txt

@@ -0,0 +1,45 @@
+# 声明模块名称的前缀和名称
+rvc_dev_define_module("FingerPrint")
+
+# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+# 包含要编译的实现文件,rvc_dev_config_library 内使用
+set(${MODULE_PREFIX}_SRCS SHARED
+	FingerPrint_impl.cpp
+	FingerPrint_impl.h
+)
+
+# 适配器工程需要通过此宏替代 add_library
+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 RVCComm ${CONAN_PKG_LIBS_JSONCPP} ${VENDOR_LOG_LIB_NAME})
+target_link_libraries(
+	${MODULE_FULL_NAME} ${${MODULE_PREFIX}_LIBS} 
+)
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 382 - 0
DevAdapter/simulator/FingerPrint.1.1/FingerPrint_impl.cpp

@@ -0,0 +1,382 @@
+#include "stdafx.h"
+#include "FingerPrint_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
+#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 GetLocalIP()
+//{
+//#ifdef RVC_OS_WIN
+//	hostent* ent = gethostbyname(NULL);
+//	if (ent && ent->h_addr_list[0] != NULL)
+//	{
+//		int i = 0;
+//		for (; ent->h_addr_list[i] != NULL; ++i)
+//		{
+//			struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
+//			if (in->S_un.S_un_b.s_b1 == 99 || in->S_un.S_un_b.s_b1 == 10)
+//				break;
+//		}
+//
+//		if (ent->h_addr_list[i] == NULL)
+//			i = 0;
+//
+//		auto in = (struct in_addr*)ent->h_addr_list[i];
+//		char xIP[64] = {};
+//		sprintf(xIP, "%d.%d.%d.%d", in->S_un.S_un_b.s_b1, in->S_un.S_un_b.s_b2, in->S_un.S_un_b.s_b3, in->S_un.S_un_b.s_b4);
+//		LOG4VTM(INFO, ("ip:%s", xIP));
+//
+//		return string(xIP);
+//	}
+//#else
+//	std::string re = "";
+//	int sfd, intr;
+//	struct ifreq buf[16];
+//	struct ifconf ifc;
+//	sfd = socket(AF_INET, SOCK_DGRAM, 0);
+//	if (sfd < 0)
+//		return "wrong 1: get ip socket failed";
+//	ifc.ifc_len = sizeof(buf);
+//	ifc.ifc_buf = (caddr_t)buf;
+//	if (ioctl(sfd, SIOCGIFCONF, (char*)&ifc))
+//		return "wrong 2: get ip ioctl failed";
+//	intr = ifc.ifc_len / sizeof(struct ifreq);
+//	while (intr-- > 0 && ioctl(sfd, SIOCGIFADDR, (char*)&buf[intr]));
+//	close(sfd);
+//	unsigned long ip = ntohl(((struct sockaddr_in*)(&buf[intr].ifr_addr))->sin_addr.s_addr);
+//
+//	char* str = new char[1024];
+//	sprintf(str, "%u.%u.%u.%u", ip >> 24 & 0xFF, ip >> 16 & 0xFF, ip >> 8 & 0xFF, ip >> 0 & 0xFF);
+//	re = str;
+//	return re;
+//#endif
+//}
+string get_current_directory() {
+	char buff[256];
+	GetCurrentDir(buff, 256);
+	string  current_working_directory(buff);
+	return current_working_directory;
+}
+
+void writeFile(const char* filename)
+{
+	FILE* fp = fopen(filename, "wb");
+	fprintf(fp, "fingerImage");
+	string content = "fingerImage";
+	fwrite(content.c_str(), content.length(), 1, fp);
+	fclose(fp);
+}
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass*& pBaseObj)
+{
+	pBaseObj = new FingerPrintImpl();
+	if (pBaseObj == NULL) {
+		return Error_Resource;
+	}
+	cmb::log_init_config config;
+	config.dev_name = "FingerPrint";
+#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 (FingerPrintImpl* pTmp = dynamic_cast<FingerPrintImpl*>(pBaseObj))
+	{
+		delete pTmp;
+		pTmp = NULL;
+		return Error_Succeed;
+	}
+	return Error_Param;
+}
+
+FingerPrintImpl::FingerPrintImpl()
+{
+
+}
+
+FingerPrintImpl::~FingerPrintImpl()
+{
+
+}
+
+ErrorCodeEnum FingerPrintImpl::GetDevCategory(DevCategoryInfo& devCategory)
+{
+	strcpy(devCategory.szModel, "szModel");
+	strcpy(devCategory.szType, "szType");
+	strcpy(devCategory.szVendor, "szVendor=cmbszSimulator");
+	return Error_Succeed;
+}
+
+ErrorCodeEnum FingerPrintImpl::Reset()
+{
+	return Error_Succeed;
+}
+
+ErrorCodeEnum FingerPrintImpl::DevClose()
+{
+	return Error_Succeed;
+}
+
+ErrorCodeEnum FingerPrintImpl::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 FingerPrintImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
+{
+	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);
+	}
+    return Error_Succeed;
+}
+
+ErrorCodeEnum FingerPrintImpl::Image2Feature(const char* imageName, LPBYTE lpbFeature, int& iLength)
+{
+	return Error_Succeed;
+	//imageName写入的文件,lpbFeature 特征码,iLength特征码长度
+	string imgName(imageName);
+	string imgPath = get_current_directory() + SPLIT_SLASH_STR + "dep" + SPLIT_SLASH_STR + imgName;
+	writeFile(imgPath.c_str());
+	//获取特征码
+	if (Image2FeatureHttp(lpbFeature, iLength)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+
+}
+
+ErrorCodeEnum FingerPrintImpl::Image2Template(const char* imagePath1, const char* imagePath2, const char* imagePath3, LPBYTE lpbTemplate, int& iLength)
+{
+	//获取模板特征码
+	LOG4VTM(INFO, "imagePath1 path = " << imagePath1);
+	LOG4VTM(INFO, "imagePath2 path = " << imagePath2);
+	LOG4VTM(INFO, "imagePath3 path = " << imagePath3);
+	if (Image2TemplateHttp(lpbTemplate, iLength)) {
+		return Error_Succeed;
+	}
+	else {
+		return Error_Exception;
+	}
+	return Error_Succeed;
+}
+
+ErrorCodeEnum FingerPrintImpl::Match(LPBYTE lpbTemplate[], int iTemplateLen[], int templateNum, LPBYTE lbpFeature, int& iFeatureLen, int level /*= 3*/)
+{
+	return Error_NotImpl;
+}
+
+ErrorCodeEnum FingerPrintImpl::Cancel()
+{
+	return Error_NotImpl;
+}
+
+bool FingerPrintImpl::Image2FeatureHttp(LPBYTE lpbFeature, int& iLength)
+{
+	Image2FeatureReq fReq;
+	Image2FeatureRet fRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = "FingerPrint";
+	rootReq["method"] = "getFingerPrint";//实体对外接口名
+	rootReq["adapterInterName"] = "Image2Feature";//适配器接口名
+
+	//fReq.m_url = "http://localhost:8080/avs/imitate/simulateData";
+	string urlStr = iniRead.ReadString("server", "url", "");
+	if (urlStr.empty()) {
+		LOG4VTM(INFO, "Image2FeatureHttp req fail,url is empty, use default url");
+		fReq.m_url = "http://localhost:8080/avs/imitate/simulateData";
+	}
+	else {
+		fReq.m_url = urlStr;
+	}
+	fReq.m_timeOut = 10;
+	string jsonReq = writer.write(rootReq);
+	fReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(fReq, fRet);
+	if (ret) {
+		LOG4VTM(INFO, "Image2FeatureHttp fRet.m_retStr = " << fRet.m_retStr);
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(fRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "Image2FeatureHttp parse resp is fail,url=" << fReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				string strFeature = rootRet["data"]["feature"].asString();
+				if (strFeature.length() != 684) {
+					LOG4VTM(INFO, "Image2FeatureHttp return feature length is not right,len = " << strFeature.length());
+					return false;
+				}
+				else {
+					LOG4VTM(INFO, "Image2FeatureHttp return feature len = " << strFeature.length() << " feature = " << strFeature.c_str());
+				}
+#ifdef RVC_OS_WIN
+				strcpy_s((char*)lpbFeature, 1024, strFeature.c_str());
+#else
+				strncpy((char*)lpbFeature, strFeature.c_str(), 684);
+#endif
+				iLength = strFeature.length();
+				LOG4VTM(INFO, "Image2FeatureHttp return feature len =" << strFeature.length() << ", lpbFeature = " << lpbFeature);
+				return true;
+			}
+			else {
+				LOG4VTM(INFO, "Image2FeatureHttp return [data] is null");
+				return false;//查询失败
+			}
+		}
+		else {
+			LOG4VTM(INFO, "Image2FeatureHttp [success] is false,url= " << fReq.m_url.c_str());
+			return false;//查询失败
+		}
+	}
+	else {
+		LOG4VTM(INFO, "Image2FeatureHttp req fail,err=%s" << fRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+bool FingerPrintImpl::Image2TemplateHttp(LPBYTE lpbTemplate, int& iLength)
+{
+	Image2TemplateReq fReq;
+	Image2TemplateRet fRet;
+	IHttpFunc* client;
+	client = create_http(HttpsLogCallBack);
+
+	Json::Value rootReq;
+	Json::FastWriter writer;
+
+	rootReq["ip"] = GetLocalIP();
+	rootReq["entityName"] = "FingerPrint";
+	rootReq["method"] = "generateTemplate";
+	rootReq["adapterInterName"] = "Image2Template";//???
+
+	string urlStr = iniRead.ReadString("server", "url", "");
+	if (urlStr.empty()) {
+		LOG4VTM(INFO, "Image2FeatureHttp req fail,url is empty, use default url");
+		fReq.m_url = "http://localhost:8080/avs/imitate/simulateData";
+	}
+	else {
+		fReq.m_url = urlStr;
+	}
+	fReq.m_timeOut = 10;
+	string jsonReq = writer.write(rootReq);
+	fReq.m_reqStr = jsonReq;//请求参数
+
+	bool ret = client->Post(fReq, fRet);
+	if (ret) {
+		Json::Reader reader;
+		Json::Value rootRet;
+		if (!reader.parse(fRet.m_retStr, rootRet, false))
+		{
+			LOG4VTM(INFO, "Image2TemplateHttp parse resp is fail,url=" << fReq.m_url.c_str());
+			return false;//失败
+		}
+		bool isSucc = rootRet["success"].asBool();
+		if (isSucc) {
+			//解析数据
+			if (rootRet.isMember("data")) {
+				string strFeature = rootRet["data"]["template"].asString();
+				if (strFeature.length() != 684) {
+					LOG4VTM(INFO, "Image2TemplateHttp return feature length is not right,len = " << strFeature.length());
+					return false;
+				}
+				else {
+					LOG4VTM(INFO, "Image2TemplateHttp return feature len = " << strFeature.length() << " feature = " << strFeature.c_str());
+				}
+#ifdef RVC_OS_WIN
+				strcpy_s((char*)lpbTemplate, 1024, strFeature.c_str());
+#else
+				strncpy((char*)lpbTemplate, strFeature.c_str(), 684);
+#endif
+				iLength = strFeature.length();
+				LOG4VTM(INFO, "Image2TemplateHttp return feature len =" << strFeature.length() << ", lpbFeature = " << lpbTemplate);
+				return true;
+			}
+			else {
+				LOG4VTM(INFO, ("Image2TemplateHttp return [data] is null"));
+				return false;//查询失败
+			}
+		}
+		else {
+			LOG4VTM(INFO, "Image2TemplateHttp [success] is false,url= " << fReq.m_url.c_str());
+			return false;//查询失败
+		}
+	}
+	else {
+		LOG4VTM(INFO, "Image2TemplateHttp req fail,err=%s" << fRet.m_errMsg.c_str());
+		return false;
+	}
+}
+
+
+

+ 82 - 0
DevAdapter/simulator/FingerPrint.1.1/FingerPrint_impl.h

@@ -0,0 +1,82 @@
+#ifndef LIBFRAMEWORK_FINGERPRINT_IMPL_H
+#define LIBFRAMEWORK_FINGERPRINT_IMPL_H
+#include <SpBase.h>
+#include "RVCComm.h"
+#include "FingerPrintClass.h"
+#include "IHttpFunc.h"
+#include <string>
+#include "../../DeviceSimulator.h"
+#include "json/json.h"
+
+typedef struct Image2FeatureReq : CHTTPReq {
+	string m_reqStr;
+	string ToJson() {
+		return m_reqStr;
+	}
+} Image2FeatureReq;
+
+typedef struct Image2FeatureRet : CHTTPRet {
+	string m_retStr;
+	bool Parse(string strData) {
+		m_retStr = strData;
+		return true;
+	}
+} Image2FeatureRet;
+
+typedef struct Image2TemplateReq : CHTTPReq {
+	string m_reqStr;
+	string ToJson() {
+		return m_reqStr;
+	}
+} Image2TemplateReq;
+
+typedef struct Image2TemplateRet : CHTTPRet {
+	string m_retStr;
+	bool Parse(string strData) {
+		m_retStr = strData;
+		return true;
+	}
+} Image2TemplateRet;
+
+
+class FingerPrintImpl : public FingerPrintClass
+{
+public:
+	FingerPrintImpl();
+	~FingerPrintImpl();
+	static void HttpsLogCallBack(const char* logtxt) {}
+
+	//DeviceBaseClass
+	ErrorCodeEnum GetDevCategory(DevCategoryInfo& devCategory);
+	ErrorCodeEnum Reset();
+	ErrorCodeEnum DevClose();
+	ErrorCodeEnum GetLastErr(DevErrorInfo& devErrInfo);
+
+	// Open Device
+	ErrorCodeEnum DevOpen(DWORD dwPort, DWORD dwBaudRate);
+
+	//采集指纹图片及对应特征值,imagePath保存图片名,lpbFeature保存对应特征,iLength:输入代表特征lpbFeature最大可用长度,输出为特征lpbFeature实际长度
+	//imagePath为传入的图片名,采集到的指纹图像请按此名称保存在dep目录下,lpbFeature为对应指纹图像特征
+	//Compute features
+	ErrorCodeEnum Image2Feature(const char* imageName, LPBYTE lpbFeature, int& iLength);
+
+	//生成特征模板(注册时使用)
+	//imagePath1、imagePath2、imagePath3表示生成特征需要输入的三张图片名称,由应用传入,lpbTemplate表示输出特征模板,iLength表示模板长度
+	ErrorCodeEnum Image2Template(const char* imagePath1, const char* imagePath2, const char* imagePath3, LPBYTE lpbTemplate, int& iLength);
+
+	//比对校验
+	//lpbTemplate和iTemplateLen分别表示输入的一组特征模板及其对应的长度,templateNum为数组长度(即模板个数)
+	//lbpFeature表示待校验的指纹特征,iFeatureLen表示其长度,level表示校验等级,默认取3
+	ErrorCodeEnum Match(LPBYTE lpbTemplate[], int iTemplateLen[], int templateNum, LPBYTE lbpFeature, int& iFeatureLen, int level = 3);
+
+	//取消采集指纹
+	ErrorCodeEnum Cancel();
+
+	bool Image2FeatureHttp(LPBYTE lpbFeature, int& iLength);
+
+	bool Image2TemplateHttp(LPBYTE lpbTemplate, int& iLength);
+
+	string depCfgPath;
+	iniReader iniRead;
+};
+#endif //LIBFRAMEWORK_FINGERPRINT_IMPL_H

+ 44 - 0
DevAdapter/simulator/FingerPrint.7.1/CMakeLists.txt

@@ -0,0 +1,44 @@
+# 声明模块名称的前缀和名称
+rvc_dev_define_module("FingerPrint")
+
+# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "7")
+set(${MODULE_PREFIX}_BATCH "1")
+
+# 包含要编译的实现文件,rvc_dev_config_library 内使用
+set(${MODULE_PREFIX}_SRCS SHARED
+	FingerPrint_Impl.cpp
+)
+
+# 适配器工程需要通过此宏替代 add_library
+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 RVCComm ${CONAN_PKG_LIBS_JSONCPP} ${VENDOR_LOG_LIB_NAME})
+target_link_libraries(
+	${MODULE_FULL_NAME} ${${MODULE_PREFIX}_LIBS} 
+)
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 95 - 0
DevAdapter/simulator/FingerPrint.7.1/FingerPrint_Impl.cpp

@@ -0,0 +1,95 @@
+/*
+ * Create by LocalUser on 2020/9/22
+*/
+
+#include "FingerPrint_Impl.h"
+#include<cstring>
+#include <cstdio>
+
+FingerPrintImpl::FingerPrintImpl()
+{
+
+}
+
+FingerPrintImpl::~FingerPrintImpl()
+{
+
+}
+
+ErrorCodeEnum FingerPrintImpl::GetDevCategory(DevCategoryInfo& devCategory)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	strcpy(devCategory.szModel, "szModel");
+	strcpy(devCategory.szType, "szType");
+	strcpy(devCategory.szVendor, "szVendor");
+	return err;
+}
+
+ErrorCodeEnum FingerPrintImpl::Reset()
+{
+	ErrorCodeEnum err = Error_Unexpect;
+	m_mode = 0;
+	return err;
+}
+
+ErrorCodeEnum FingerPrintImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	
+	return err;
+}
+
+ErrorCodeEnum FingerPrintImpl::Image2Feature(const char* imageName, LPBYTE lpbFeature, int& iLength)
+{
+	return Error_NotImpl;
+}
+
+ErrorCodeEnum FingerPrintImpl::Image2Template(const char* imagePath1, const char* imagePath2, const char* imagePath3, LPBYTE lpbTemplate, int& iLength)
+{
+	return Error_NotImpl;
+}
+
+ErrorCodeEnum FingerPrintImpl::Match(LPBYTE lpbTemplate[], int iTemplateLen[], int templateNum, LPBYTE lbpFeature, int& iFeatureLen, int level /* = 3 */)
+{
+	return Error_NotImpl;
+}
+
+ErrorCodeEnum FingerPrintImpl::Cancel()
+{
+	return Error_Succeed;
+}
+
+ErrorCodeEnum FingerPrintImpl::DevClose()
+{
+	ErrorCodeEnum err = Error_Succeed;
+	return err;
+}
+
+ErrorCodeEnum FingerPrintImpl::GetLastErr(DevErrorInfo& devErrInfo)
+{
+	return Error_Succeed;
+}
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass*& baseObj)
+{
+	baseObj = new FingerPrintImpl();
+	if (baseObj == NULL) {
+		return Error_Resource;
+	}
+	else {
+		return Error_Succeed;
+	}
+}
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass*& pBaseObj)
+{
+	if (pBaseObj == NULL) {
+		return Error_Param;
+	}
+	if (FingerPrintImpl * pTmp = dynamic_cast<FingerPrintImpl*>(pBaseObj))
+	{
+		delete pTmp;
+		pTmp = NULL;
+		return Error_Succeed;
+	}
+	return Error_Param;
+}

+ 35 - 0
DevAdapter/simulator/FingerPrint.7.1/FingerPrint_Impl.h

@@ -0,0 +1,35 @@
+/*
+ * Created by LocalUser on 2020/9/22	
+*/
+
+#ifndef LIBFRAMEWORK_FINGERPRINT_IMPL_H
+#define LIBFRAMEWORK_FINGERPRINT_IMPL_H
+
+#include "FingerPrintClass.h"
+
+class FingerPrintImpl : public FingerPrintClass
+{
+public:
+	FingerPrintImpl();
+	~FingerPrintImpl();
+
+	ErrorCodeEnum DevOpen(DWORD dwPort, DWORD dwBaudRate);
+
+	//DeviceBaseClass
+	ErrorCodeEnum GetDevCategory(DevCategoryInfo& devCategory);
+	ErrorCodeEnum Reset();
+	ErrorCodeEnum DevClose();
+	ErrorCodeEnum GetLastErr(DevErrorInfo& devErrInfo);
+
+	//FingerPrintClass
+	virtual ErrorCodeEnum Image2Feature(const char* imageName, LPBYTE lpbFeature, int& iLength);
+	virtual ErrorCodeEnum Image2Template(const char* imagePath1, const char* imagePath2, const char* imagePath3, LPBYTE lpbTemplate, int& iLength);
+	virtual ErrorCodeEnum Match(LPBYTE lpbTemplate[], int iTemplateLen[], int templateNum, LPBYTE lbpFeature, int& iFeatureLen, int level /* = 3 */);
+	virtual ErrorCodeEnum Cancel();
+
+private:
+	int m_mode;
+};
+
+
+#endif // LIBFRAMEWORK_FINGERPRINT_IMPL_H

+ 41 - 0
DevAdapter/simulator/cardissuer.1.1/CMakeLists.txt

@@ -0,0 +1,41 @@
+rvc_dev_define_module("CardIssuer")
+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 RVCComm ${CONAN_PKG_LIBS_JSONCPP} ${VENDOR_LOG_LIB_NAME})
+target_link_libraries(
+	${MODULE_FULL_NAME} ${${MODULE_PREFIX}_LIBS} 
+)
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 1532 - 0
DevAdapter/simulator/cardissuer.1.1/cardissuer_impl.cpp

@@ -0,0 +1,1532 @@
+// 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;
+    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 trackRangeRet = rootRet["data"]["TrackRange"].asInt();
+					magTracks.eRange = (TrackRange)trackRangeRet;
+					LOG4VTM(INFO, "MagReadHttp magTracks.eRange=" << magTracks.eRange);
+					for (int i = 0; i < 3; i++) {
+						int  TrackSrcEnumRet = rootRet["data"]["TrackInfo"][i]["TrackSrcEnum"].asInt();
+						magTracks.track[i].eSource = (TrackSrcEnum)TrackSrcEnumRet;
+
+						int  TrackDataStateEnumRet = rootRet["data"]["TrackInfo"][i]["TrackDataStateEnum"].asInt();
+						magTracks.track[i].eStatus = (TrackDataStateEnum)TrackDataStateEnumRet;
+
+						int  dwSizeRet = rootRet["data"]["TrackInfo"][i]["dwSize"].asInt();
+						magTracks.track[i].dwSize = dwSizeRet;
+
+						string  dataRet = rootRet["data"]["TrackInfo"][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;
+						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["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, "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"]["CmdInfo"]["dwSize"].asInt();
+					string  dwDataRet = rootRet["data"]["CmdInfo"]["dwData"].asString();
+
+					LOG4VTM(INFO, "ICCommandHttp recvBuf.dwSize=" << dwSizeRet << ", recvBuf.dwData=" << dwDataRet);
+					//反解析
+					PBYTE pData = new BYTE[MAX_SHOW];
+					ZeroMemory(pData, MAX_SHOW);
+					int dataLen = StrBuf2HexBuf(dwDataRet.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=" << dwDataRet);
+					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"] = (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, "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"]["CmdInfo"]["dwSize"].asInt();
+					string  dwDataRet = rootRet["data"]["CmdInfo"]["dwData"].asString();
+
+					LOG4VTM(INFO, "SAMCommandHttp recvBuf.dwSize=" << dwSizeRet << ", recvBuf.dwData=" << dwDataRet);
+					//反解析
+					PBYTE pData = new BYTE[MAX_SHOW];
+					ZeroMemory(pData, MAX_SHOW);
+					int dataLen = StrBuf2HexBuf(dwDataRet.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=" << dwDataRet);
+					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"]["CmdInfo"]["dwSize"].asInt();
+					string  dwDataRet = rootRet["data"]["CmdInfo"]["dwData"].asString();
+
+					LOG4VTM(INFO, "ActiveICCardATRHttp recvBuf.dwSize=" << dwSizeRet << ", recvBuf.dwData=" << dwDataRet);
+					//反解析
+					PBYTE pData = new BYTE[MAX_SHOW];
+					ZeroMemory(pData, MAX_SHOW);
+					int dataLen = StrBuf2HexBuf(dwDataRet.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=" << dwDataRet);
+					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"]["CmdInfo"]["dwSize"].asInt();
+					string  dwDataRet = rootRet["data"]["CmdInfo"]["dwData"].asString();
+
+					LOG4VTM(INFO, "RFTypeABCommandHttp recvBuf.dwSize=" << dwSizeRet << ", recvBuf.dwData=" << dwDataRet);
+					//反解析
+					PBYTE pData = new BYTE[MAX_SHOW];
+					ZeroMemory(pData, MAX_SHOW);
+					int dataLen = StrBuf2HexBuf(dwDataRet.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=" << dwDataRet);
+					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;
+						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"]["CardNo"]["dwSize"].asInt();
+					cardNo.dwSize = dwSizeRet;
+					int dwTrack2SizeRet = rootRet["data"]["CardNo"]["dwTrack2Size"].asInt();
+					cardNo.dwTrack2Size = dwTrack2SizeRet;
+					int dwTrack3SizeRet = rootRet["data"]["CardNo"]["dwTrack3Size"].asInt();
+					cardNo.dwTrack3Size = dwTrack3SizeRet;
+
+					string  accountRet = rootRet["data"]["CardNo"]["account"].asString();
+					string  track2Ret = rootRet["data"]["CardNo"]["track2"].asString();
+					string  track3Ret = rootRet["data"]["CardNo"]["track3"].asString();
+
+					PBYTE pData = new BYTE[MAX_TRACK_SIZE];
+					ZeroMemory(pData, MAX_TRACK_SIZE);
+					int dataLen = StrBuf2HexBuf(accountRet.c_str(), &pData);
+					memcpy(cardNo.account, pData, dataLen);//赋值
+
+					ZeroMemory(pData, MAX_TRACK_SIZE);
+					dataLen = StrBuf2HexBuf(track2Ret.c_str(), &pData);
+					memcpy(cardNo.track2, pData, dataLen);//赋值
+
+					ZeroMemory(pData, MAX_TRACK_SIZE);
+					dataLen = StrBuf2HexBuf(track3Ret.c_str(), &pData);
+					memcpy(cardNo.track3, pData, dataLen);//赋值
+
+					delete[] pData;
+					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=" << 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"]["SlotStatus"]["dwSize"].asInt();
+					slots.dwSize = sumRet;
+					for (int i = 0; i < sumRet; i++) {
+						slots.status[i] = rootRet["data"]["SlotStatus"]["dwSize"][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/cardissuer.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/cardswiper.1.1/CMakeLists.txt

@@ -0,0 +1,44 @@
+# 声明模块名称的前缀和名称
+rvc_dev_define_module("CardSwiper")
+
+# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+# 包含要编译的实现文件,rvc_dev_config_library 内使用
+set(${MODULE_PREFIX}_SRCS SHARED
+        cardswiper_impl.cpp
+        )
+
+# 适配器工程需要通过此宏替代 add_library
+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 RVCComm ${CONAN_PKG_LIBS_JSONCPP} ${VENDOR_LOG_LIB_NAME})
+target_link_libraries(
+	${MODULE_FULL_NAME} ${${MODULE_PREFIX}_LIBS} 
+)
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 199 - 0
DevAdapter/simulator/cardswiper.1.1/cardswiper_impl.cpp

@@ -0,0 +1,199 @@
+//
+// Created by LocalUser on 2019/1/7.
+//
+
+#include "cardswiper_impl.h"
+#include <cstring>
+
+CardSwiperImpl::CardSwiperImpl()
+    :m_mode(0)
+{
+
+}
+
+CardSwiperImpl::~CardSwiperImpl()
+{
+
+}
+
+ErrorCodeEnum CardSwiperImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+
+    ErrorCodeEnum err = Error_Succeed;
+    std::strcpy(devCategory.szModel, "szModel");
+    std::strcpy(devCategory.szType, "szCategory");
+    std::strcpy(devCategory.szVendor, "szVendor");
+    return err;
+}
+
+ErrorCodeEnum CardSwiperImpl::Reset()
+{
+    ErrorCodeEnum err = Error_Unexpect;
+    m_mode = 0;
+    return err;
+}
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+ErrorCodeEnum CardSwiperImpl::DevOpen(int argNum, char* argArray)
+#else
+ErrorCodeEnum CardSwiperImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
+#endif
+{
+    static int nums = 1;
+    ErrorCodeEnum err = Error_Succeed;
+    if (nums == 0)
+    {
+        err = Error_Unexpect;
+        nums = 1;
+    }
+    return err;
+}
+
+ErrorCodeEnum CardSwiperImpl::DevClose()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+
+ErrorCodeEnum CardSwiperImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+    return Error_Succeed;
+}
+
+ErrorCodeEnum CardSwiperImpl::GetDevStatus(CardSwiperStatus& devStatus)
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::AbortRead()
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::QueryCardStatus(const DWORD dwPos, int& iStatus, MagTracks& magTracks)
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::MagRead(MagTracks& magTracks)
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::ActiveICCard()
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::ActiveContactlessICCard(char fstType, char scdType, char thdType, char& outType)
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::ContactIC()
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::ReleaseIC()
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::DeactivateICCard()
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::DeactContactlessICCard()
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::WarmReset()
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::ICCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::MifareCommand(MifareFuctionEnum eFunType, CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::RFTypeABCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::GetKeyPair(char*& priKey, int& priSize, char*& pubKey, int& pubSize)
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::LoadPrivateKey(const char* pKey, const int size)
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::SendRandomNum(const char* pRandomNum, const char* pRamChk, char*& pData)
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::SendWorkingKey(const char* pWorkingKey)
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::GetDeviceSN(char*& pDevSN)
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::TransferEnInit(int& iStatus, BYTE*& Cr1, int& lenR1, BYTE*& Cr3, int& lenR3, BYTE*& dKey, int& lenKey)
+{
+    return Error_NotImpl;
+}
+
+ErrorCodeEnum CardSwiperImpl::SetR2(int& iStatus, BYTE* pCr2, int lenR2)
+{
+    return Error_NotImpl;
+}
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DWORD dwDevClassID, DeviceBaseClass*& pOutDevAptObj)
+#else
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DeviceBaseClass*& pOutDevAptObj)
+#endif
+{
+    pOutDevAptObj = new CardSwiperImpl();
+    if(pOutDevAptObj == NULL)
+    {
+        return Error_Resource;
+    }
+    return Error_Succeed;
+}
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DWORD dwDevClassID, DeviceBaseClass*& pInDevAptObj)
+#else
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass*& pInDevAptObj)
+#endif
+{
+    if(pInDevAptObj == NULL)
+    {
+        return Error_Param;
+    }
+    if(CardSwiperImpl* pTmp = dynamic_cast<CardSwiperImpl*>(pInDevAptObj))
+    {
+        delete pTmp;
+        pTmp = NULL;
+        return Error_Succeed;
+    }
+    return Error_Param;
+}

+ 58 - 0
DevAdapter/simulator/cardswiper.1.1/cardswiper_impl.h

@@ -0,0 +1,58 @@
+//
+// Created by LocalUser on 2019/1/7.
+//
+
+#ifndef LIBFRAMEWORK_CARDSWIPER_IMPL_H
+#define LIBFRAMEWORK_CARDSWIPER_IMPL_H
+
+#include "CardSwiperClass.h"
+
+class CardSwiperImpl : public CardSwiperClass
+{
+public:
+    CardSwiperImpl();
+    ~CardSwiperImpl();
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+	ErrorCodeEnum DevOpen(int argNum, char* argArray);
+#else
+	ErrorCodeEnum DevOpen(DWORD dwPort, DWORD dwBaudRate);
+#endif
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    //CardSwiperClass
+    virtual ErrorCodeEnum GetDevStatus(CardSwiperStatus& devStatus);
+    virtual ErrorCodeEnum AbortRead();
+    virtual ErrorCodeEnum QueryCardStatus(const DWORD dwPos, int& iStatus, MagTracks& magTracks);
+	virtual ErrorCodeEnum MagRead(MagTracks& magTracks);
+	virtual ErrorCodeEnum ActiveICCard();
+	virtual ErrorCodeEnum ActiveContactlessICCard(char fstType, char scdType, char thdType, char& outType);
+	virtual ErrorCodeEnum ContactIC();
+	virtual ErrorCodeEnum ReleaseIC();
+	virtual ErrorCodeEnum DeactivateICCard();
+	virtual ErrorCodeEnum DeactContactlessICCard();
+	virtual ErrorCodeEnum WarmReset();
+	virtual ErrorCodeEnum ICCommand(CmdInfo sendBuf, CmdInfo& recvBuf);
+	virtual ErrorCodeEnum MifareCommand(MifareFuctionEnum eFunType, CmdInfo sendBuf, CmdInfo& recvBuf);
+	virtual ErrorCodeEnum RFTypeABCommand(CmdInfo sendBuf, CmdInfo& recvBuf);
+	virtual ErrorCodeEnum GetKeyPair(char*& priKey, int& priSize, char*& pubKey, int& pubSize);
+	virtual ErrorCodeEnum LoadPrivateKey(const char* pKey, const int size);
+	virtual ErrorCodeEnum SendRandomNum(const char* pRandomNum, const char* pRamChk, char*& pData);
+	virtual ErrorCodeEnum SendWorkingKey(const char* pWorkingKey);
+	virtual ErrorCodeEnum GetDeviceSN(char*& pDevSN);
+	virtual ErrorCodeEnum TransferEnInit(int& iStatus, BYTE*& Cr1, int& lenR1, BYTE*& Cr3, int& lenR3, BYTE*& dKey, int& lenKey);
+	virtual ErrorCodeEnum SetR2(int& iStatus, BYTE* pCr2, int lenR2);
+	virtual ErrorCodeEnum IfDevOnline(int& bOn) { bOn = 1; return Error_Succeed; }
+	virtual ErrorCodeEnum EjectCard(CardPosEnum ePos) { return Error_Succeed; }
+
+protected:
+	int m_mode;
+};
+
+
+#endif //LIBFRAMEWORK_CARDSWIPER_IMPL_H

+ 39 - 0
DevAdapter/simulator/contactlesscard.1.1/CMakeLists.txt

@@ -0,0 +1,39 @@
+rvc_dev_define_module("ContactlessCard")
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+set(${MODULE_PREFIX}_SRCS SHARED
+        contactless_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 RVCComm ${CONAN_PKG_LIBS_JSONCPP} ${VENDOR_LOG_LIB_NAME})
+target_link_libraries(
+	${MODULE_FULL_NAME} ${${MODULE_PREFIX}_LIBS} 
+)
+
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 71 - 0
DevAdapter/simulator/contactlesscard.1.1/contactless_impl.cpp

@@ -0,0 +1,71 @@
+#include "contactless_impl.h"
+#include<cstring>
+#include <cstdio>
+ContactlessCardImpl::ContactlessCardImpl()
+        :m_mode(0)
+{
+
+}
+
+ContactlessCardImpl::~ContactlessCardImpl()
+{
+
+}
+
+ErrorCodeEnum ContactlessCardImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+
+    ErrorCodeEnum err = Error_Succeed;
+    std::strcpy(devCategory.szModel, "szModel");
+    std::strcpy(devCategory.szType, "szCategory");
+    std::strcpy(devCategory.szVendor, "szVendor");
+    return err;
+}
+
+ErrorCodeEnum ContactlessCardImpl::Reset()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 0;
+    return err;
+}
+
+ErrorCodeEnum ContactlessCardImpl::DevClose()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+ErrorCodeEnum ContactlessCardImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+    static int times = 0;
+	char szMessage[128];
+	char szSubMessage[64];
+	sprintf(szSubMessage, "%d", ++times);
+	sprintf(szMessage, "{\"ErrCode\":9555, \"Description\":\"Func:%s,Line:%d,Msg:%s\"}", __FUNCTION__, __LINE__, szSubMessage);
+    strcpy(devErrInfo.szErrMsg, szMessage);
+    devErrInfo.dwErrMsgLen = strlen(szMessage);
+    return Error_Succeed;
+}
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
+{
+    baseObj = new ContactlessCardImpl();
+    if(baseObj == NULL) {
+    return Error_Resource;
+    } else {
+    return Error_Succeed;
+    }
+}
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
+{
+    if(pBaseObj == NULL) {
+    return Error_Param;
+    }
+    if(ContactlessCardImpl* pTmp = dynamic_cast<ContactlessCardImpl*>(pBaseObj))
+    {
+    delete pTmp;
+    pTmp = NULL;
+    return Error_Succeed;
+    }
+    return Error_Param;
+}

+ 109 - 0
DevAdapter/simulator/contactlesscard.1.1/contactless_impl.h

@@ -0,0 +1,109 @@
+#ifndef LIBFRAMEWORK_CONTACTLESSCARD_IMPL_H
+#define LIBFRAMEWORK_CONTACTLESSCARD_IMPL_H
+
+#include "RFICClass.h"
+
+class ContactlessCardImpl : public RFICClass
+{
+public:
+    ContactlessCardImpl();
+    ~ContactlessCardImpl();
+
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    //device initialization
+    virtual ErrorCodeEnum DevOpen(DWORD dwPort, DWORD dwBaudRate)
+    {
+        ErrorCodeEnum err = Error_Succeed;
+        return err;
+    }
+
+    //
+//	Get card reader status
+//
+    virtual ErrorCodeEnum GetDevStatus(RFICReaderStatus& devStatus)
+    {
+        return Error_NotImpl;
+    }
+    //
+    //	Abort current operation.
+    //
+    virtual ErrorCodeEnum AbortRead()
+    {
+        return Error_NotImpl;
+    }
+    //
+    //	Active contactless card(Type A,B,Mifare)
+    //	The first,second,third activation order decided by fstType,scdType,thdType respectively
+    //	fstType,scdType,thdType can be one of 'A','B','M','0'(30H,no type)
+    //	outType indicates the type of  activation result
+    //
+    virtual ErrorCodeEnum ActiveContactlessICCard(char fstType, char scdType, char thdType, char& outType)
+    {
+        return Error_NotImpl;
+    }
+    //
+    //	Deactivate contactless IC card
+    //
+    virtual ErrorCodeEnum DeactContactlessICCard()
+    {
+        return Error_NotImpl;
+    }
+    //
+    //	Warm reset card(IC)
+    //
+    virtual ErrorCodeEnum WarmReset()
+    {
+        return Error_NotImpl;
+    }
+    //
+    //	Mifare operation
+    //	Arguments:
+    //	- eFunType:function type as load key,authentication and so on
+    //	- return/data(hex) byte order like BIG EDIAN. ex:0x12345678 --> data[i] = 0x12,data[i+1] = 0x34,data[i+2] = 0x56,data[i+3] = 0x78
+    //	- sendBuf:[parameter(hex)][data(hex)]
+    //	- recvBuf:[status(1byte)][return data(hex)]
+    //		-- [eFunType],[parameter,data],[status(1byte),return data]
+    //		-- [CI_MIFARE_LOAD_KEY],[key select(1byte),sector num(1byte),uncoded keys(6bytes)],[status(1byte)]
+    //		-- [CI_MIFARE_AUTH],[key select(1byte),sector num(1byte)],[status(1byte)]
+    //		-- [CI_MIFARE_READ],[block num(1byte)],[status(1byte),data(16bytes)]
+    //		-- [CI_MIFARE_WRITE],[block num(1byte),data(16bytes)],[status(1byte)] 
+    //		-- [CI_MIFARE_INC],[source block num(1byte),destination block num(1byte),inc value(4bytes)],[status(1byte)]
+    //		-- [CI_MIFARE_DEC],[source block num(1byte),destination block num(1byte),dec value(4bytes)],[status(1byte)]
+    //		-- key select(1byte):AKey(00h),BKey(01h)
+    //		-- status(1byte):OK(00h),other error code(!00h)
+
+    virtual 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
+    //
+    virtual ErrorCodeEnum RFTypeABCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
+    {
+        return Error_NotImpl;
+    }
+
+    //halt card
+    //card have been halted must move from induction zone then can be found again
+    virtual ErrorCodeEnum HaltCard()
+    {
+        return Error_NotImpl;
+    }
+
+private:
+    int m_mode;
+};
+
+
+#endif //LIBFRAMEWORK_CONTACTLESSCARD_IMPL_H

+ 39 - 0
DevAdapter/simulator/devctrl.1.1/CMakeLists.txt

@@ -0,0 +1,39 @@
+rvc_dev_define_module("DeviceControl")
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+set(${MODULE_PREFIX}_SRCS SHARED
+        devctrl_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 RVCComm ${CONAN_PKG_LIBS_JSONCPP} ${VENDOR_LOG_LIB_NAME})
+target_link_libraries(
+	${MODULE_FULL_NAME} ${${MODULE_PREFIX}_LIBS} 
+)
+
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 72 - 0
DevAdapter/simulator/devctrl.1.1/devctrl_impl.cpp

@@ -0,0 +1,72 @@
+#include "devctrl_impl.h"
+#include<cstring>
+#include <cstdio>
+
+DevCtrlClassImpl::DevCtrlClassImpl()
+        :m_mode(0)
+{
+
+}
+
+DevCtrlClassImpl::~DevCtrlClassImpl()
+{
+
+}
+
+ErrorCodeEnum DevCtrlClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+
+    ErrorCodeEnum err = Error_Succeed;
+    std::strcpy(devCategory.szModel, "szModel");
+    std::strcpy(devCategory.szType, "szCategory");
+    std::strcpy(devCategory.szVendor, "szVendor");
+    return err;
+}
+
+ErrorCodeEnum DevCtrlClassImpl::Reset()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 0;
+    return err;
+}
+
+ErrorCodeEnum DevCtrlClassImpl::DevClose()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+ErrorCodeEnum DevCtrlClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+    static int times = 0;
+	char szMessage[128];
+	char szSubMessage[64];
+	sprintf(szSubMessage, "%d", ++times);
+	sprintf(szMessage, "{\"ErrCode\":9555, \"Description\":\"Func:%s,Line:%d,Msg:%s\"}", __FUNCTION__, __LINE__, szSubMessage);
+    strcpy(devErrInfo.szErrMsg, szMessage);
+    devErrInfo.dwErrMsgLen = strlen(szMessage);
+    return Error_Succeed;
+}
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
+{
+    baseObj = new DevCtrlClassImpl();
+    if(baseObj == NULL) {
+    return Error_Resource;
+    } else {
+    return Error_Succeed;
+    }
+}
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
+{
+    if(pBaseObj == NULL) {
+    return Error_Param;
+    }
+    if(DevCtrlClassImpl* pTmp = dynamic_cast<DevCtrlClassImpl*>(pBaseObj))
+    {
+    delete pTmp;
+    pTmp = NULL;
+    return Error_Succeed;
+    }
+    return Error_Param;
+}

+ 44 - 0
DevAdapter/simulator/devctrl.1.1/devctrl_impl.h

@@ -0,0 +1,44 @@
+#ifndef LIBFRAMEWORK_DEVCONTROL_IMPL_H
+#define LIBFRAMEWORK_DEVCONTROL_IMPL_H
+
+#include "DeviceControlClass.h"
+
+class DevCtrlClassImpl : public DeviceControlClass
+{
+public:
+    DevCtrlClassImpl();
+    ~DevCtrlClassImpl();
+
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    //
+    //	Connect to device and do initialization.
+    //	Make preparations for controlling the device.
+    //	Arguments:
+    //	- dwPort[in]		com port number
+    //	- dwBaudRate[in]	Baud rate
+    //
+    virtual ErrorCodeEnum DevOpen(DWORD dwPort, DWORD dwBaudRate)
+    {
+        ErrorCodeEnum err = Error_Succeed;
+        return err;
+    }
+    //
+    //	Open/Close port.
+    //
+    virtual ErrorCodeEnum PortControl(ControlType eType)
+    {
+        return Error_Succeed;
+    }
+
+private:
+    int m_mode;
+};
+
+
+#endif //LIBFRAMEWORK_DEVCONTROL_IMPL_H

+ 39 - 0
DevAdapter/simulator/gpio.1.1/CMakeLists.txt

@@ -0,0 +1,39 @@
+rvc_dev_define_module("Gpio")
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+set(${MODULE_PREFIX}_SRCS SHARED
+        gpio_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 RVCComm ${CONAN_PKG_LIBS_JSONCPP} ${VENDOR_LOG_LIB_NAME})
+target_link_libraries(
+	${MODULE_FULL_NAME} ${${MODULE_PREFIX}_LIBS} 
+)
+
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 71 - 0
DevAdapter/simulator/gpio.1.1/gpio_impl.cpp

@@ -0,0 +1,71 @@
+#include "gpio_impl.h"
+#include<cstring>
+#include <cstdio>
+GPIOClassImpl::GPIOClassImpl()
+        :m_mode(0)
+{
+
+}
+
+GPIOClassImpl::~GPIOClassImpl()
+{
+
+}
+
+ErrorCodeEnum GPIOClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+
+    ErrorCodeEnum err = Error_Succeed;
+    std::strcpy(devCategory.szModel, "szModel");
+    std::strcpy(devCategory.szType, "szCategory");
+    std::strcpy(devCategory.szVendor, "szVendor");
+    return err;
+}
+
+ErrorCodeEnum GPIOClassImpl::Reset()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 0;
+    return err;
+}
+
+
+ErrorCodeEnum GPIOClassImpl::DevClose()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+ErrorCodeEnum GPIOClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+    static int times = 0;
+	char szMessage[128];
+	char szSubMessage[64];
+	sprintf(szSubMessage, "%d", ++times);
+	sprintf(szMessage, "{\"ErrCode\":9555, \"Description\":\"Func:%s,Line:%d,Msg:%s\"}", __FUNCTION__, __LINE__, szSubMessage);
+    devErrInfo.dwErrMsgLen = strlen(szMessage);
+    return Error_Succeed;
+}
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
+{
+    baseObj = new GPIOClassImpl();
+    if(baseObj == NULL) {
+    return Error_Resource;
+    } else {
+    return Error_Succeed;
+    }
+}
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
+{
+    if(pBaseObj == NULL) {
+    return Error_Param;
+    }
+    if(GPIOClassImpl* pTmp = dynamic_cast<GPIOClassImpl*>(pBaseObj))
+    {
+    delete pTmp;
+    pTmp = NULL;
+    return Error_Succeed;
+    }
+    return Error_Param;
+}

+ 58 - 0
DevAdapter/simulator/gpio.1.1/gpio_impl.h

@@ -0,0 +1,58 @@
+#ifndef LIBFRAMEWORK_GPIO_IMPL_H
+#define LIBFRAMEWORK_GPIO_IMPL_H
+
+#include "GpioClass.h"
+
+class GPIOClassImpl : public GpioClass
+{
+public:
+    GPIOClassImpl();
+    ~GPIOClassImpl();
+
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    //
+    //	Device initialization.
+    //	Configure port input/output direction.
+    //
+    virtual ErrorCodeEnum DevOpen(GpioInitParam initParam)
+    {
+        ErrorCodeEnum err = Error_Succeed;
+        return err;
+    }
+
+    //
+    //	Set ports output.
+    //	Arguments:
+    //	- dwPort:port serial number,0~MAX_PORT_NUM-1
+    //	- btData:output value
+    //	  bit value 1/0 means voltage high or low
+    //	  ex.dwPort=0 btData=10001010 means set port 0's the 2nd,4th,8th pin output high
+    //
+    virtual ErrorCodeEnum WritePort(DWORD dwPort, BYTE btData)
+    {
+        return Error_Succeed;
+    }
+    //
+    //	Get port input.
+    //	Arguments:
+    //	- dwPort:port serial number,0~MAX_PORT_NUM-1
+    //	- btStatus:input value
+    //	  ex.dwPort=0 btStatus=10001010 means port 0's the 2nd,4th,8th pin with high level
+    //
+    virtual ErrorCodeEnum ReadPort(DWORD dwPort, BYTE& btStatus)
+    {
+        return Error_NotImpl;
+    }
+
+private:
+    int m_mode;
+};
+
+
+#endif //LIBFRAMEWORK_GPIO_IMPL_H

+ 39 - 0
DevAdapter/simulator/gpio.1.2/CMakeLists.txt

@@ -0,0 +1,39 @@
+rvc_dev_define_module("Gpio")
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "2")
+
+set(${MODULE_PREFIX}_SRCS SHARED
+        gpio_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 RVCComm ${CONAN_PKG_LIBS_JSONCPP} ${VENDOR_LOG_LIB_NAME})
+target_link_libraries(
+	${MODULE_FULL_NAME} ${${MODULE_PREFIX}_LIBS} 
+)
+
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 156 - 0
DevAdapter/simulator/gpio.1.2/gpio_impl.cpp

@@ -0,0 +1,156 @@
+#include "gpio_impl.h"
+#include<cstring>
+#include <cstdio>
+GPIOClassImpl::GPIOClassImpl()
+        :m_mode(0)
+{
+
+}
+
+GPIOClassImpl::~GPIOClassImpl()
+{
+
+}
+
+ErrorCodeEnum GPIOClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+
+    ErrorCodeEnum err = Error_Succeed;
+    std::strcpy(devCategory.szModel, "szModel");
+    //新接口版本标记
+    std::strcpy(devCategory.szType, "szType#FUNCVER=2.0");
+    std::strcpy(devCategory.szVendor, "szVendor");
+    return err;
+}
+
+ErrorCodeEnum GPIOClassImpl::Reset()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 0;
+    return err;
+}
+
+
+ErrorCodeEnum GPIOClassImpl::DevClose()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+
+
+ErrorCodeEnum GPIOClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+    static int times = 0;
+    char szMessage[128];
+    sprintf(szMessage, "这是第 %d 条错误信息", ++times);
+    strcpy(devErrInfo.szErrMsg, szMessage);
+    devErrInfo.dwErrMsgLen = strlen(szMessage);
+    return Error_Succeed;
+}
+
+ErrorCodeEnum GPIOClassImpl::SetStatus(DWORD dwReq, DWORD dwMode)
+{
+    ErrorCodeEnum ec = Error_Succeed;
+
+    if ((dwMode & GPIO_DEV_LIGHT_MODE_LIGHT_SUSTAIN) && (dwMode & GPIO_DEV_LIGHT_MODE_LIGHT_FLICKER)) {
+        return Error_Param;
+    }
+    if ((dwMode & GPIO_DEV_LIGHT_MODE_COLOR_NORMAL) && (dwMode & GPIO_DEV_LIGHT_MODE_COLOR_FAULT)) {
+        return Error_Param;
+    }
+
+    switch (dwReq) {
+    case GPIO_DEV_SN_LIGHT_CARDISSUER:
+        if (dwMode & GPIO_DEV_LIGHT_MODE_COLOR_NORMAL) { //常规颜色
+            if (dwMode & GPIO_DEV_LIGHT_MODE_LIGHT_FLICKER) { //闪烁
+
+            }
+        }
+        if (dwMode & GPIO_DEV_LIGHT_MODE_COLOR_FAULT) { //故障状态的颜色,一般为红色
+            if (dwMode & GPIO_DEV_LIGHT_MODE_LIGHT_SUSTAIN) { //常亮
+
+            }
+        }
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_IDCERTIFICATE:
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_PINPAD:
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_FACE:
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_CARDISSUER_MAINTAIN:
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_CONTACTLESSCARD:
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_FINGERPRINT:
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_SENSOR_ALL: 
+    {
+        if (dwMode == GPIO_DEV_LIGHT_MODE_RESET) {
+            //熄灭当前的所有灯
+        }
+    }
+        break;
+    default:
+        ec = Error_NotSupport;
+        break;
+    }
+    return ec;
+}
+
+ErrorCodeEnum GPIOClassImpl::DetectStatus(DWORD dwReq, DWORD& dwMode)
+{
+    ErrorCodeEnum ec = Error_Succeed;
+    dwMode = 0;
+
+    if (dwReq & GPIO_DEV_SN_SENSOR_SHAKE) {
+        //检测是否震动,如果震动,则对应的位置为1
+        dwMode |= GPIO_DEV_SN_SENSOR_SHAKE;
+    }
+    if (dwReq & GPIO_DEV_SN_SENSOR_DOOR) {
+        // 检测是否开机柜门,没开则置为0
+    }
+    if (dwReq & GPIO_DEV_SN_SENSOR_PHONE) {
+        //检测是否提机,如果提机,则对应的位置为1
+        dwMode |= GPIO_DEV_SN_SENSOR_PHONE;
+    }
+    if (dwReq & GPIO_DEV_SN_SENSOR_HUMAN_DETECT) {
+        //检测是否有人,如果有人,则对应的位置为1
+        dwMode |= GPIO_DEV_SN_SENSOR_HUMAN_DETECT;
+    }
+    if (dwReq & GPIO_DEV_SN_SENSOR_CARD_MOUTH) {
+        //......
+    }
+    return ec;
+}
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
+{
+    baseObj = new GPIOClassImpl();
+    if(baseObj == NULL) {
+    return Error_Resource;
+    } else {
+    return Error_Succeed;
+    }
+}
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
+{
+    if(pBaseObj == NULL) {
+    return Error_Param;
+    }
+    if(GPIOClassImpl* pTmp = dynamic_cast<GPIOClassImpl*>(pBaseObj))
+    {
+    delete pTmp;
+    pTmp = NULL;
+    return Error_Succeed;
+    }
+    return Error_Param;
+}

+ 62 - 0
DevAdapter/simulator/gpio.1.2/gpio_impl.h

@@ -0,0 +1,62 @@
+#ifndef LIBFRAMEWORK_GPIO_IMPL_H
+#define LIBFRAMEWORK_GPIO_IMPL_H
+
+#include "GpioClass.h"
+
+class GPIOClassImpl : public GpioClass
+{
+public:
+    GPIOClassImpl();
+    ~GPIOClassImpl();
+
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    //
+    //	Device initialization.
+    //	Configure port input/output direction.
+    //
+    virtual ErrorCodeEnum DevOpen(GpioInitParam initParam)
+    {
+        ErrorCodeEnum err = Error_Succeed;
+        return err;
+    }
+
+    //
+    //	Set ports output.
+    //	Arguments:
+    //	- dwPort:port serial number,0~MAX_PORT_NUM-1
+    //	- btData:output value
+    //	  bit value 1/0 means voltage high or low
+    //	  ex.dwPort=0 btData=10001010 means set port 0's the 2nd,4th,8th pin output high
+    //
+    virtual ErrorCodeEnum WritePort(DWORD dwPort, BYTE btData)
+    {
+        return Error_Succeed;
+    }
+    //
+    //	Get port input.
+    //	Arguments:
+    //	- dwPort:port serial number,0~MAX_PORT_NUM-1
+    //	- btStatus:input value
+    //	  ex.dwPort=0 btStatus=10001010 means port 0's the 2nd,4th,8th pin with high level
+    //
+    virtual ErrorCodeEnum ReadPort(DWORD dwPort, BYTE& btStatus)
+    {
+        return Error_NotImpl;
+    }
+
+    ErrorCodeEnum SetStatus(DWORD dwReq, DWORD dwMode);
+
+    ErrorCodeEnum DetectStatus(DWORD dwReq, DWORD& dwMode);
+
+private:
+    int m_mode;
+};
+
+
+#endif //LIBFRAMEWORK_GPIO_IMPL_H

+ 38 - 0
DevAdapter/simulator/hspscanner.1.1/CMakeLists.txt

@@ -0,0 +1,38 @@
+rvc_dev_define_module("HSPScanner")
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+set(${MODULE_PREFIX}_SRCS SHARED
+        hspscanner_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 RVCComm ${CONAN_PKG_LIBS_JSONCPP} ${VENDOR_LOG_LIB_NAME})
+target_link_libraries(
+	${MODULE_FULL_NAME} ${${MODULE_PREFIX}_LIBS} 
+)
+
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 71 - 0
DevAdapter/simulator/hspscanner.1.1/hspscanner_impl.cpp

@@ -0,0 +1,71 @@
+#include "hspscanner_impl.h"
+#include<cstring>
+#include <cstdio>
+HSPSClassImpl::HSPSClassImpl()
+        :m_mode(0)
+{
+
+}
+
+HSPSClassImpl::~HSPSClassImpl()
+{
+
+}
+
+ErrorCodeEnum HSPSClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+
+    ErrorCodeEnum err = Error_Succeed;
+    std::strcpy(devCategory.szModel, "szModel");
+    std::strcpy(devCategory.szType, "szCategory");
+    std::strcpy(devCategory.szVendor, "szVendor");
+    return err;
+}
+
+ErrorCodeEnum HSPSClassImpl::Reset()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 0;
+    return err;
+}
+
+ErrorCodeEnum HSPSClassImpl::DevClose()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+ErrorCodeEnum HSPSClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+    static int times = 0;
+	char szMessage[128];
+	char szSubMessage[64];
+	sprintf(szSubMessage, "%d", ++times);
+	sprintf(szMessage, "{\"ErrCode\":9555, \"Description\":\"Func:%s,Line:%d,Msg:%s\"}", __FUNCTION__, __LINE__, szSubMessage);
+    strcpy(devErrInfo.szErrMsg, szMessage);
+    devErrInfo.dwErrMsgLen = strlen(szMessage);
+    return Error_Succeed;
+}
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
+{
+    baseObj = new HSPSClassImpl();
+    if(baseObj == NULL) {
+    return Error_Resource;
+    } else {
+    return Error_Succeed;
+    }
+}
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
+{
+    if(pBaseObj == NULL) {
+    return Error_Param;
+    }
+    if(HSPSClassImpl* pTmp = dynamic_cast<HSPSClassImpl*>(pBaseObj))
+    {
+    delete pTmp;
+    pTmp = NULL;
+    return Error_Succeed;
+    }
+    return Error_Param;
+}

+ 113 - 0
DevAdapter/simulator/hspscanner.1.1/hspscanner_impl.h

@@ -0,0 +1,113 @@
+#ifndef LIBFRAMEWORK_HSPS_IMPL_H
+#define LIBFRAMEWORK_HSPS_IMPL_H
+
+#include "HSPScannerClass.h"
+
+class HSPSClassImpl : public CHSPSClass
+{
+public:
+    HSPSClassImpl();
+    ~HSPSClassImpl();
+
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    virtual ErrorCodeEnum DevOpen()
+    {
+        ErrorCodeEnum err = Error_Succeed;
+        return err;
+    }
+
+    //
+    //	Set param, more detail please to see ParamType and its according ParamTypeValue.
+    //
+    virtual ErrorCodeEnum SetParam(ParamType type, ParamTypeValue value)
+    {
+        return Error_Succeed;
+    }
+
+    //
+    //	Command the device to start to preview or stop previewing.
+    //	-nValue[in] set 1 means StartPreview while 0 means StopPreview.
+    //	If the device' state had been setted before what the nValue commanded, ignore it and
+    //		return Error_Succeed.
+    //	The function returns only the specified behavior is done completely, StartPreview in special.
+    //  更新20161117: nValue值为 1 时打开预览,确保当前打开预览过程执行结束且窗口处于显示状态才返回Error_Succeed,
+    //	nValue值为 0 时关闭预览并隐藏窗口
+    //		
+    //
+    virtual ErrorCodeEnum SetPreview(short nValue)
+    {
+        return Error_Succeed;
+    }
+
+    //
+    //	Scan Image from device and store the image.
+    //	-pszFileName[in] Store the path and name using suffix ".jpg"
+    //		specifies that where the image will be located and what it would be named.
+    //	拍摄照片,传入的文件名已带绝对路径,无需再进行拼接处理
+    //
+    virtual ErrorCodeEnum ScanImage(const char* pszFileName)
+    {
+        return Error_Succeed;
+    }
+
+    //
+    //	Scan Image from device and return the image data in byte format.
+    //	-pBtImg[out] The buffer used to store the scanned image data.
+    //		存储图片字节流的缓冲区,大小为 nBtLen 字节
+    //	-nBtLen[in,out] Indicate the max byte-type size of pBtImg could be stored 
+    //		and Store the real byte-type size of pBtImg had used when returned.
+    //		when detect value of nBtLen is 0 or smaller that necessary size, please
+    //		set nBtlen with real byte-type size and return Error_TooSmallBuffer.
+    //		如果nBtLen指定的字节数过小,那么对nBtLen赋值实际所需的大小并返回 Error_TooSmallBuffer,此操作仅允许一次
+    //	-pszFileName[in] Store the path and name where the image file should be located
+    //		while "" indicates that the image file shouldn't be stored at locate.
+    //		文件名长度为零表示不在本地生成图片文件
+    //  
+    //
+    virtual ErrorCodeEnum ScanImageEx(BYTE* pBtImg, int& nBtLen, const char* pszFileName = "")
+    {
+        return Error_Succeed;
+    }
+
+    //
+    //	Set position and width of preview dialog with the rate of length to width: 16:9.
+    //	-nX[in] The X coordinate of leftTop point.
+    //  -nY[in] The Y coordinate of leftTop point.
+    //	-nWidth[in] The Width of Preview Dialog .
+    //	传入预览窗口显示的坐标,左上角的横坐标nX,左上角的纵坐标nY,以及预览窗口的宽,宽与高的比例为 16:9
+    //
+    virtual ErrorCodeEnum SetViewPos(int nX, int nY, int nWidth)
+    {
+        return Error_Succeed;
+    }
+
+    //
+    //	Show property dialog of HSPS of LiangTian.
+    //	If there is no property dialog function, ignore it and return Error_NotImpl(更新20161117).
+    //  更新20161117:用于打开良田高拍仪设备的设置属性页,可能用不到
+    //
+    virtual ErrorCodeEnum SetProperty()
+    {
+        return Error_Succeed;
+    }
+
+    //
+    //	Get current status of device.
+    //
+    virtual ErrorCodeEnum GetDevStatus(HspsDevStatus& status)
+    {
+        return Error_Succeed;
+    }
+
+private:
+    int m_mode;
+};
+
+
+#endif //LIBFRAMEWORK_HSPS_IMPL_H

+ 39 - 0
DevAdapter/simulator/idcer.1.1/CMakeLists.txt

@@ -0,0 +1,39 @@
+rvc_dev_define_module("IDCertificate")
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+set(${MODULE_PREFIX}_SRCS SHARED
+		idcer.cmbsz.h
+        idcer.cmbsz.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 RVCComm ${CONAN_PKG_LIBS_JSONCPP} ${VENDOR_LOG_LIB_NAME})
+target_link_libraries(
+	${MODULE_FULL_NAME} ${${MODULE_PREFIX}_LIBS} 
+)
+
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 619 - 0
DevAdapter/simulator/idcer.1.1/idcer.cmbsz.cpp

@@ -0,0 +1,619 @@
+// dllmain.cpp : 定义 DLL 应用程序的入口点。
+#include "stdafx.h"
+#include "idcer.cmbsz.h"
+#include <cstring>
+#include <cstdio>
+#include "log4vendor.h"
+#include <path.h>
+
+#ifdef RVC_OS_WIN
+#include <direct.h>
+#define GetCurrentDir _getcwd
+#else
+#define GetCurrentDir getcwd
+#endif // RVC_OS_WIN
+
+
+#define w 102 //头像宽度
+#define h 126 //头像高度
+
+#define DEFAULT_URL "http://localhost:8080/avs/imitate/simulateData"
+
+string get_current_directory() {
+    char buff[256];
+    GetCurrentDir(buff, 256);
+    string  current_working_directory(buff);
+    return current_working_directory;
+}
+
+//string GetLocalIP()
+//{
+//    hostent* ent = gethostbyname(NULL);
+//    if (ent && ent->h_addr_list[0] != NULL)
+//    {
+//        int i = 0;
+//        for (; ent->h_addr_list[i] != NULL; ++i)
+//        {
+//            struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
+//            if (in->S_un.S_un_b.s_b1 == 99 || in->S_un.S_un_b.s_b1 == 10)
+//                break;
+//        }
+//
+//        if (ent->h_addr_list[i] == NULL)
+//            i = 0;
+//
+//        auto in = (struct in_addr*)ent->h_addr_list[i];
+//        char xIP[64] = {};
+//        sprintf(xIP, "%d.%d.%d.%d", in->S_un.S_un_b.s_b1, in->S_un.S_un_b.s_b2, in->S_un.S_un_b.s_b3, in->S_un.S_un_b.s_b4);
+//        LOG4VTM(INFO, "ip:" << xIP);
+//
+//        return string(xIP);
+//    }
+//}
+
+typedef unsigned short UINT16;
+typedef unsigned char UINT8;
+
+#ifdef RVC_OS_WIN
+char* ConvertGBKToUtf8(const char* gbk, int* n)
+{
+    int len = MultiByteToWideChar(CP_ACP, 0, gbk, -1, NULL, 0);
+    WCHAR* wszGBK = new WCHAR[len + 1];
+    memset(wszGBK, 0, len * 2 + 2);
+    MultiByteToWideChar(CP_ACP, 0, gbk, -1, wszGBK, len);
+
+    len = WideCharToMultiByte(CP_UTF8, 0, wszGBK, -1, NULL, 0, NULL, NULL);
+    char* szUtf8 = new char[len + 1];
+    memset(szUtf8, 0, len + 1);
+    WideCharToMultiByte(CP_UTF8, 0, wszGBK, -1, szUtf8, len, NULL, NULL);
+
+    delete[] wszGBK;
+    *n = len - 1;
+    return szUtf8;
+}
+
+void ConvertGBKToUtf8(std::string& str)
+{
+    int len = 0;
+    char* dst = ConvertGBKToUtf8(str.c_str(), &len);
+
+    str = dst;
+    delete[] dst;
+}
+#endif // RVC_OS_WIN
+
+bool UTF8_to_UCS2(const UINT8* UINT8_code, UINT16* ucs2_code)
+{
+    UINT16 temp1, temp2;
+    bool is_unrecognized = false;
+    UINT8* in = (UINT8*)UINT8_code;
+
+    if (!UINT8_code || !ucs2_code)
+    {
+        return is_unrecognized;
+    }
+
+    while (*in != 0)
+    {
+        //1字节 0xxxxxxx
+        //0x80=1000,0000,判断最高位是否为0,如果为0,那么是ASCII字符
+        //不需要处理,直接拷贝即可
+        if (0x00 == (*in & 0x80))
+        {
+            /* 1 byte UTF-8 Charater.*/
+            *ucs2_code = *in;
+            is_unrecognized = true;
+            in += 1;
+        }
+        //2字节 110xxxxx 10xxxxxx 
+        //0xe0=1110,0000
+        //0xc0=1100,0000
+        else if (0xc0 == (*in & 0xe0) && 0x80 == (*(in + 1) & 0xc0))
+        {
+            /* 2 bytes UTF-8 Charater.*/
+            //0x1f=0001,1111,获得第一个字节的后5位
+            temp1 = (UINT16)(*in & 0x1f);
+
+            //左移6位
+            temp1 <<= 6;
+
+            //0x3f=0011,1111,获得第二个字节的后6位
+            //加上上面的5位一共有11位
+            temp1 |= (UINT16)(*(in + 1) & 0x3f);
+
+            *ucs2_code = temp1;
+
+            is_unrecognized = true;
+
+            in += 2;
+        }
+        //3字节 1110xxxx 10xxxxxx 10xxxxxx
+        //中文要进入这一个分支
+        else if (0xe0 == (*in & 0xf0) &&
+            0x80 == (*(in + 1) & 0xc0) &&
+            0x80 == (*(in + 2) & 0xc0)
+            )
+        {
+            /* 3bytes UTF-8 Charater.*/
+            //0x0f=0000,1111
+            //取出第一个字节的低4位
+            temp1 = (UINT16)(*in & 0x0f);
+            temp1 <<= 12;
+
+            //0x3f=0011,1111
+            //取得第二个字节的低6位
+            temp2 = (UINT16)(*(in + 1) & 0x3F);
+            temp2 <<= 6;
+
+            //取得第三个字节的低6位,最后组成16位
+            temp1 = temp1 | temp2 | (UINT16)(*(in + 2) & 0x3F);
+            *ucs2_code = temp1;
+
+            //移动到下一个字符
+            in += 3;
+            is_unrecognized = true;
+        }
+        else
+        {
+            /* unrecognize byte. */
+            *ucs2_code = 0x22e0;
+            is_unrecognized = false;
+
+            //直接退出循环
+            break;
+        }
+
+        ucs2_code += 1;
+    }
+
+    return is_unrecognized;
+}
+
+
+std::string current_working_directory()
+{
+    char buff[250];
+    GetCurrentDir(buff, 250);
+    std::string current_working_directory(buff);
+    return current_working_directory;
+}
+
+void WriteBMP(char* img, const char* filename)
+{
+    int l = (w * 3 + 3) / 4 * 4;
+    int bmi[] = {
+            l * h + 54,0,54,40,w,h,1 | 3 * 8 << 16,0,l * h,0,0,100,0 };
+    FILE* fp = fopen(filename, "wb");
+    fprintf(fp, "BM");
+    fwrite(&bmi, 52, 1, fp);
+    fwrite(img, 1, l * h, fp);
+    fclose(fp);
+}
+
+IDCerClassImpl::IDCerClassImpl()
+    :m_mode(0)
+{
+
+}
+
+IDCerClassImpl::~IDCerClassImpl()
+{
+
+}
+
+ErrorCodeEnum IDCerClassImpl::GetDevCategory(DevCategoryInfo& devCategory)
+{
+
+    ErrorCodeEnum err = Error_Succeed;
+    strcpy(devCategory.szModel, "STYLE=IG#FUNCTION=ITF#CODE=UCS2");
+    strcpy(devCategory.szType, "szCategory");
+    strcpy(devCategory.szVendor, "szVendor=cmbszSimulator");
+    return err;
+}
+
+ErrorCodeEnum IDCerClassImpl::Reset()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 0;
+    return err;
+}
+
+ErrorCodeEnum IDCerClassImpl::IDCerAuthenticate()
+{
+    bool flag = authHttpFunction();
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 0;
+
+    if (!flag)
+    {
+        err = Error_Dev_IDCardNotFound;
+    }
+
+    return err;
+}
+
+ErrorCodeEnum IDCerClassImpl::ForceIDEject()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 0;
+    return err;
+}
+
+ErrorCodeEnum IDCerClassImpl::ScanIDAndSaveImage()
+{
+    ErrorCodeEnum err = Error_NotImpl;
+    m_mode = 0;
+    return err;
+}
+
+ErrorCodeEnum IDCerClassImpl::QueryCardPos(int& pos)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 0;
+    return err;
+}
+
+ErrorCodeEnum IDCerClassImpl::IDCerRFControl(bool bControl)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 0;
+    return err;
+}
+
+ErrorCodeEnum IDCerClassImpl::DevOpen(DWORD dwPort)
+{
+    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);
+    }
+
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+ErrorCodeEnum IDCerClassImpl::DevClose()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+ErrorCodeEnum IDCerClassImpl::IDCerGetData(IDCerInfo& idCerInfo)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    memset(&idCerInfo, 0, sizeof(IDCerInfo));
+
+
+    strcpy(idCerInfo.startDate.data, "2009.03.25");
+    idCerInfo.startDate.dwSize = strlen("2009.03.25");
+
+    strcpy(idCerInfo.endDate.data, "2029.03.24");
+    idCerInfo.endDate.dwSize = strlen("2029.03.24");
+
+    return err;
+}
+
+ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx(IDCerInfoEx& idCerInfoEx)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    memset(&idCerInfoEx, 0, sizeof(IDCerInfoEx));
+
+    std::string path;
+    path = current_working_directory();
+    path = path + "/dep/zp.bmp";
+
+    char img[w * h * 3];
+    for (int i = 0; i < w * h * 3; i++)img[i] = rand() % 256;
+    WriteBMP(img, path.c_str());
+    bool testRe = exHttpFunction(idCerInfoEx);
+
+    return err;
+}
+
+ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx2(IDCerInfoEx2& idCerInfoEx2)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    memset(&idCerInfoEx2, 0, sizeof(IDCerInfoEx2));
+
+    std::string path;
+    path = current_working_directory();
+    path = path + "/dep/zp.bmp";
+
+    char img[w * h * 3];
+    for (int i = 0; i < w * h * 3; i++)img[i] = rand() % 256;
+    WriteBMP(img, path.c_str());
+
+    bool testRe = ex2HttpFunction(idCerInfoEx2);
+
+    return err;
+}
+
+
+ErrorCodeEnum IDCerClassImpl::GetLastErr(DevErrorInfo& devErrInfo)
+{
+    static int times = 0;
+    char szMessage[128];
+    sprintf(szMessage, "这是第 %d 条错误信息", ++times);
+    strcpy(devErrInfo.szErrMsg, szMessage);
+    devErrInfo.dwErrMsgLen = strlen(szMessage);
+    return Error_Succeed;
+}
+
+bool IDCerClassImpl::authHttpFunction()
+{
+    IHttpFunc* client;
+    client = create_http(HttpsLogCallBack);
+
+    IDCerDevReq idCerReq;
+    IDCerDevRet idCerRet;
+
+    idCerReq.ip = GetLocalIP();
+    idCerReq.entityName = "IDCertificate";
+    idCerReq.method = "readAndScan";
+    idCerReq.adapterInterName = "IDCerAuthenticate";
+
+    string url = iniRead.ReadString("IDCertificate", "url", "");
+    if (url.length() == 0)
+    {
+        url = DEFAULT_URL;
+    }
+    idCerReq.m_url = url;
+
+    LOG4VTM(INFO, "请求地址:" << idCerReq.m_url.c_str());
+
+    bool ret = client->Post(idCerReq, idCerRet);
+
+    if (ret) {
+        if (idCerRet.success == false)
+        {
+            LOG4VTM(INFO, "请求失败");
+            return false;
+        }
+
+        if (idCerRet.result == true)
+        {
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+    else
+    {
+        LOG4VTM(INFO, "ret = 0, 请求失败");
+        return false;
+    }
+}
+
+bool IDCerClassImpl::exHttpFunction(IDCerInfoEx& idCerInfoEx)
+{
+    IHttpFunc* client;
+    client = create_http(HttpsLogCallBack);
+
+    IDCerDevReq idCerReq;
+    IDCerDevRet idCerRet;
+
+    idCerReq.ip = GetLocalIP();
+    idCerReq.entityName = "IDCertificate";
+    idCerReq.method = "readAndScan";
+    idCerReq.adapterInterName = "IDCerGetDataEx";
+
+    string url = iniRead.ReadString("IDCertificate", "url", "");
+    if (url.length() == 0)
+    {
+        url = DEFAULT_URL;
+    }
+    idCerReq.m_url = url;
+
+    LOG4VTM(INFO, "请求地址:" << idCerReq.m_url.c_str());
+
+    bool ret = client->Post(idCerReq, idCerRet);
+
+    if (ret) {
+        if (!idCerRet.success)
+        {
+            LOG4VTM(INFO, "请求失败");
+            return false;
+        }
+
+        std::strcpy(idCerInfoEx.name.data, idCerRet.name.c_str());
+        idCerInfoEx.name.dwSize = strlen(idCerRet.name.c_str());
+
+        std::strcpy(idCerInfoEx.sex.data, idCerRet.sex.c_str());
+        idCerInfoEx.sex.dwSize = strlen(idCerRet.sex.c_str());
+
+        std::strcpy(idCerInfoEx.nation.data, idCerRet.nation.c_str());
+        idCerInfoEx.nation.dwSize = strlen(idCerRet.nation.c_str());
+
+        std::strcpy(idCerInfoEx.birthday.data, idCerRet.birthday.c_str());
+        idCerInfoEx.birthday.dwSize = strlen(idCerRet.birthday.c_str());
+
+        std::strcpy(idCerInfoEx.address.data, idCerRet.address.c_str());
+        idCerInfoEx.address.dwSize = strlen(idCerRet.address.c_str());
+
+        if (strlen(idCerRet.idcode.c_str()) == 0)
+        {
+            idCerRet.idcode = "testnum00000";
+        }
+        std::strcpy(idCerInfoEx.idno.data, idCerRet.idcode.c_str());
+        idCerInfoEx.idno.dwSize = strlen(idCerRet.idcode.c_str());
+
+        std::strcpy(idCerInfoEx.department.data, idCerRet.department.c_str());
+        idCerInfoEx.department.dwSize = strlen(idCerRet.department.c_str());
+
+        std::strcpy(idCerInfoEx.startDate.data, idCerRet.startdate.c_str());
+        idCerInfoEx.startDate.dwSize = strlen(idCerRet.startdate.c_str());
+
+        std::strcpy(idCerInfoEx.endDate.data, idCerRet.enddate.c_str());
+        idCerInfoEx.endDate.dwSize = strlen(idCerRet.enddate.c_str());
+
+        std::strcpy(idCerInfoEx.englishName.data, idCerRet.englishname.c_str());
+        idCerInfoEx.englishName.dwSize = strlen(idCerRet.englishname.c_str());
+
+        std::strcpy(idCerInfoEx.nationality.data, idCerRet.nationality.c_str());
+        idCerInfoEx.nationality.dwSize = strlen(idCerRet.nationality.c_str());
+
+        std::strcpy(idCerInfoEx.idVersion.data, idCerRet.idversion.c_str());
+        idCerInfoEx.idVersion.dwSize = strlen(idCerRet.idversion.c_str());
+
+        std::strcpy(idCerInfoEx.idType.data, idCerRet.idtype.c_str());
+        idCerInfoEx.idType.dwSize = strlen(idCerRet.idtype.c_str());
+
+        std::strcpy(idCerInfoEx.reserved.data, idCerRet.reserved.c_str());
+        idCerInfoEx.reserved.dwSize = strlen(idCerRet.reserved.c_str());
+
+        return true;
+    }
+    else
+    {
+        LOG4VTM(INFO, "ret = 0, 请求失败");
+        return false;
+    }
+}
+
+
+bool IDCerClassImpl::ex2HttpFunction(IDCerInfoEx2& idCerInfoEx2)
+{
+    IHttpFunc* client;
+    client = create_http(HttpsLogCallBack);
+
+    IDCerDevReq idCerReq;
+    IDCerDevRet idCerRet;
+
+    idCerReq.ip = GetLocalIP();
+    idCerReq.entityName = "IDCertificate";
+    idCerReq.method = "readAndScanUTF8";
+    idCerReq.adapterInterName = "IDCerGetDataEx2";
+
+    string url = iniRead.ReadString("IDCertificate", "url", "");
+    if (url.length() == 0)
+    {
+        url = DEFAULT_URL;
+    }
+    idCerReq.m_url = url;
+
+    LOG4VTM(INFO, "请求地址:" << idCerReq.m_url.c_str());
+
+    bool ret = client->Post(idCerReq, idCerRet);
+    if (ret) {
+        if (!idCerRet.success)
+        {
+            LOG4VTM(INFO, "请求失败");
+            return false;
+        }
+
+#ifdef RVC_OS_WIN
+        ConvertGBKToUtf8(idCerRet.name);
+        ConvertGBKToUtf8(idCerRet.englishname);
+        ConvertGBKToUtf8(idCerRet.sex);
+        ConvertGBKToUtf8(idCerRet.birthday);
+        ConvertGBKToUtf8(idCerRet.address);
+        ConvertGBKToUtf8(idCerRet.department);
+        ConvertGBKToUtf8(idCerRet.idcode);
+        ConvertGBKToUtf8(idCerRet.startdate);
+        ConvertGBKToUtf8(idCerRet.enddate);
+        ConvertGBKToUtf8(idCerRet.nation);
+        ConvertGBKToUtf8(idCerRet.nationality);        
+#endif // RVC_OS_WIN
+
+        char name[1024]; memset(name, 0, 1024);
+        std::strcpy(name, idCerRet.name.c_str());
+        UTF8_to_UCS2((UINT8*)name, (UINT16*)idCerInfoEx2.name.data);
+        idCerInfoEx2.name.dwSize = strlen(idCerInfoEx2.name.data);
+
+        char englishname[1024]; memset(englishname, 0, 1024);
+        std::strcpy(englishname, idCerRet.englishname.c_str());
+        UTF8_to_UCS2((UINT8*)englishname, (UINT16*)idCerInfoEx2.englishName.data);
+        idCerInfoEx2.englishName.dwSize = strlen(idCerInfoEx2.englishName.data);
+
+        char sex[1024]; memset(sex, 0, 1024);
+        std::strcpy(sex, idCerRet.sex.c_str());
+        UTF8_to_UCS2((UINT8*)sex, (UINT16*)idCerInfoEx2.sex.data);
+        idCerInfoEx2.sex.dwSize = strlen(idCerInfoEx2.sex.data);
+
+        char birthday[1024]; memset(birthday, 0, 1024);
+        std::strcpy(birthday, idCerRet.birthday.c_str());
+        UTF8_to_UCS2((UINT8*)birthday, (UINT16*)idCerInfoEx2.birthday.data);
+        idCerInfoEx2.birthday.dwSize = strlen(idCerInfoEx2.birthday.data);
+
+        char address[1024]; memset(address, 0, 1024);
+        std::strcpy(address, idCerRet.address.c_str());
+        UTF8_to_UCS2((UINT8*)address, (UINT16*)idCerInfoEx2.address.data);
+        idCerInfoEx2.address.dwSize = strlen(idCerInfoEx2.address.data);
+
+        char department[1024]; memset(department, 0, 1024);
+        std::strcpy(department, idCerRet.department.c_str());
+        UTF8_to_UCS2((UINT8*)department, (UINT16*)idCerInfoEx2.department.data);
+        idCerInfoEx2.department.dwSize = strlen(idCerInfoEx2.department.data);
+
+        char idno[1024]; memset(idno, 0, 1024);
+        std::strcpy(idno, idCerRet.idcode.c_str());
+        UTF8_to_UCS2((UINT8*)idno, (UINT16*)idCerInfoEx2.idno.data);
+        idCerInfoEx2.idno.dwSize = strlen(idCerInfoEx2.idno.data);
+
+        char startDate[1024]; memset(startDate, 0, 1024);
+        std::strcpy(startDate, idCerRet.startdate.c_str());
+        UTF8_to_UCS2((UINT8*)startDate, (UINT16*)idCerInfoEx2.startDate.data);
+        idCerInfoEx2.startDate.dwSize = strlen(idCerInfoEx2.startDate.data);
+
+        char endDate[1024]; memset(endDate, 0, 1024);
+        std::strcpy(endDate, idCerRet.enddate.c_str());
+        UTF8_to_UCS2((UINT8*)endDate, (UINT16*)idCerInfoEx2.endDate.data);
+        idCerInfoEx2.endDate.dwSize = strlen(idCerInfoEx2.endDate.data);
+
+        char nation[1024]; memset(nation, 0, 1024);
+        std::strcpy(nation, idCerRet.nation.c_str());
+        UTF8_to_UCS2((UINT8*)nation, (UINT16*)idCerInfoEx2.nation.data);
+        idCerInfoEx2.nation.dwSize = strlen(idCerInfoEx2.nation.data);
+
+        char nationality[1024]; memset(nationality, 0, 1024);
+        std::strcpy(nationality, idCerRet.nationality.c_str());
+        UTF8_to_UCS2((UINT8*)nationality, (UINT16*)idCerInfoEx2.nationality.data);
+        idCerInfoEx2.nationality.dwSize = strlen(idCerInfoEx2.nationality.data);
+
+        return true;
+    }
+    else
+    {
+        LOG4VTM(INFO, "ret = 0, 请求失败");
+        return false;
+    }
+}
+
+#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 // RVC_OS_WIN
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass*& pBaseObj)
+{
+    pBaseObj = new IDCerClassImpl();
+    if (pBaseObj == NULL)
+        return Error_Resource;
+    return Error_Succeed;
+}
+DEVICEBASE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass*& pBaseObj)
+{
+    if (pBaseObj == NULL)
+        return Error_Param;
+    IDCerClassImpl* pTmp = (IDCerClassImpl*)(pBaseObj);
+    delete pTmp;
+    pTmp = NULL;
+    pBaseObj = NULL;
+    return Error_Succeed;
+}

+ 134 - 0
DevAdapter/simulator/idcer.1.1/idcer.cmbsz.h

@@ -0,0 +1,134 @@
+#ifndef LIBFRAMEWORK_IDCER_IMPL_H
+#define LIBFRAMEWORK_IDCER_IMPL_H
+
+#include <SpBase.h>
+#include "IDCerClass.h"
+#include "IHttpFunc.h"
+#include "json/json.h"
+#include <string>
+#include "CommEntityRestful.hpp"
+#include "../../DeviceSimulator.h"
+
+#define REFLECTION(var) #var
+
+typedef struct IDCerDevReq : CHTTPReq {
+    std::string ip;
+    std::string entityName;
+    std::string method;
+    std::string adapterInterName;
+
+    string ToJson() {
+        Json::Value value;
+        value[REFLECTION(ip)] = ip;
+        value[REFLECTION(entityName)] = entityName;
+        value[REFLECTION(method)] = method;
+        value[REFLECTION(adapterInterName)] = adapterInterName;
+        Json::FastWriter writer;
+        string strData = writer.write(value);
+
+        return strData;
+    }
+} IDCerDevReq;
+
+typedef struct IDCerDevRet : CHTTPRet {
+    std::string name;
+    std::string sex;
+    std::string nation;
+    std::string birthday;
+    std::string address;
+    std::string idcode;
+    std::string department;
+    std::string startdate;
+    std::string enddate;
+    std::string hasscan;
+    std::string photodata;
+    std::string frontphoto;
+    std::string backphoto;
+    std::string headphoto;
+    std::string finger1;
+    std::string finger2;
+    std::string imgreserved1;
+    std::string imgreserved2;
+    std::string englishname;
+    std::string nationality;
+    std::string idversion;
+    std::string idtype;
+    std::string othercode;
+    std::string reserved;
+
+    bool	success;
+    bool result;
+    bool Parse(string strData) {
+        Json::Value root;
+        Json::Reader reader;
+        reader.parse(strData, root, false);
+
+        success = root[REFLECTION(success)].asBool();
+
+        result = root["data"][REFLECTION(result)].asBool();
+
+        name = root["data"][REFLECTION(name)].asString();
+        sex = root["data"][REFLECTION(sex)].asString();
+        nation = root["data"][REFLECTION(nation)].asString();
+        birthday = root["data"][REFLECTION(birthday)].asString();
+        address = root["data"][REFLECTION(address)].asString();
+        idcode = root["data"][REFLECTION(idcode)].asString();
+        department = root["data"][REFLECTION(department)].asString();
+        startdate = root["data"][REFLECTION(startdate)].asString();
+        enddate = root["data"][REFLECTION(enddate)].asString();
+        hasscan = root["data"][REFLECTION(hasscan)].asString();
+        photodata = root["data"][REFLECTION(photodata)].asString();
+        frontphoto = root["data"][REFLECTION(frontphoto)].asString();
+        backphoto = root["data"][REFLECTION(backphoto)].asString();
+        headphoto = root["data"][REFLECTION(headphoto)].asString();
+        finger1 = root["data"][REFLECTION(finger1)].asString();
+        finger2 = root["data"][REFLECTION(finger2)].asString();
+        imgreserved1 = root["data"][REFLECTION(imgreserved1)].asString();
+        imgreserved2 = root["data"][REFLECTION(imgreserved2)].asString();
+        englishname = root["data"][REFLECTION(englishname)].asString();
+        nationality = root["data"][REFLECTION(nationality)].asString();
+        idversion = root["data"][REFLECTION(idversion)].asString();
+        idtype = root["data"][REFLECTION(idtype)].asString();
+        frontphoto = root["data"][REFLECTION(frontphoto)].asString();
+        othercode = root["data"][REFLECTION(othercode)].asString();
+        return true;
+    }
+} IDCerDevRet;
+
+class IDCerClassImpl : public IDCerClass
+{
+public:
+    IDCerClassImpl();
+    ~IDCerClassImpl();
+
+    static void HttpsLogCallBack(const char* logtxt) {}
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    ErrorCodeEnum DevOpen(DWORD dwPort);
+    ErrorCodeEnum IDCerRFControl(bool bControl);
+    ErrorCodeEnum IDCerAuthenticate();
+
+    ErrorCodeEnum IDCerGetData(IDCerInfo &idCerInfo);
+    ErrorCodeEnum IDCerGetDataEx(IDCerInfoEx &idCerInfoEx);
+    ErrorCodeEnum IDCerGetDataEx2(IDCerInfoEx2& idCerInfoEx2);
+
+    ErrorCodeEnum ForceIDEject();
+    ErrorCodeEnum ScanIDAndSaveImage();
+    ErrorCodeEnum QueryCardPos(int &pos);
+
+    int m_mode;
+    bool exHttpFunction(IDCerInfoEx& idCerInfoEx);
+    bool ex2HttpFunction(IDCerInfoEx2& idCerInfoEx2);
+    bool authHttpFunction();
+
+    string depCfgPath;
+    iniReader iniRead;
+};
+
+
+#endif //LIBFRAMEWORK_IDCER_IMPL_H

+ 23 - 0
DevAdapter/simulator/include/demo.h

@@ -0,0 +1,23 @@
+#ifndef CMB_DEV_DEMO_LIBRARY_H__
+#define CMB_DEV_DEMO_LIBRARY_H__
+
+#ifdef _WIN32
+    #ifdef DEMO_LIBRARY_EXPORTS
+        #define DEMO_LIBRARY_API _declspec(dllexport)
+    #else 
+        #define DEMO_LIBRARY_API _declspec(dllimport)
+    #endif 
+#elif defined(DEMO_LIBRARY_EXPORTS) && defined(__GNUC__)
+    #if __GNUC__ >= 4
+        #define DEMO_LIBRARY_API __attribute__((visibility("default")))
+    #else
+        #define DEMO_LIBRARY_API
+    #endif // __GUNC__ >= 4
+#else //_WIN32
+    #define DEMO_LIBRARY_API
+#endif //_WIN32
+
+
+extern "C" DEMO_LIBRARY_API const char* HelloDemo();
+
+#endif //CMB_DEV_DEMO_LIBRARY_H__

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

@@ -0,0 +1,44 @@
+# 声明模块名称的前缀和名称
+rvc_dev_define_module("PinPad")
+
+# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+# 包含要编译的实现文件,rvc_dev_config_library 内使用
+set(${MODULE_PREFIX}_SRCS SHARED
+        pinpad_impl.cpp   
+        )
+
+# 适配器工程需要通过此宏替代 add_library
+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 RVCComm ${CONAN_PKG_LIBS_JSONCPP} ${VENDOR_LOG_LIB_NAME})
+target_link_libraries(
+	${MODULE_FULL_NAME} ${${MODULE_PREFIX}_LIBS} 
+)
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 205 - 0
DevAdapter/simulator/pinpad.1.1/pinpad_impl.cpp

@@ -0,0 +1,205 @@
+//
+// Created by LocalUser on 2019/1/7.
+//
+
+#include "pinpad_impl.h"
+#include <cstring>
+#include "log4vendor.h"
+
+PinPadClassImpl::PinPadClassImpl()
+    :m_mode(0)
+{
+
+}
+
+PinPadClassImpl::~PinPadClassImpl()
+{
+
+}
+
+ErrorCodeEnum PinPadClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+    LOG4VTM_FUNCTION();
+    ErrorCodeEnum err = Error_Succeed;
+    std::strcpy(devCategory.szModel, "szModel");
+    std::strcpy(devCategory.szType, "szCategory");
+    std::strcpy(devCategory.szVendor, "szVendor");
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::Reset()
+{
+    ErrorCodeEnum err = Error_Unexpect;
+    m_mode = 0;
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
+{
+   // LOG4VTM_FUNCTION();
+    static int nums = 1;
+    ErrorCodeEnum err = Error_Succeed;
+    if (nums == 0) {
+        err = Error_Unexpect;
+        nums = 1;
+    } else {
+        LOG4VTM(TRACE, ("This is first TRACE type message."));
+        LOG4VTM(INFO, ("This is first INFO type message."));
+        LOG4VTM(WARN, ("This is first WARN type message."));
+        LOG4VTM(ERROR, ("This is first ERROR type message."));
+        LOG4VTM(FATAL, ("This is first FATAL type message."));
+    }
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::DevClose()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::KeyRead(BYTE &ch)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    static int cursor = 0;
+    if(m_mode == 0) {
+        ch = 0x0d;
+        cursor = 0;
+    }
+    else {
+        ch = 0x3f;
+    }
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::StartPinInput(BYTE byLen)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 1;
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::StartPinInputConfirm(BYTE byLen)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 1;
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::StartPlainInput()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 0;
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::StopInput()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 0;
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::LoadMasterKey(MasterKeyParam masterKey)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::LoadWorkingKey(WorkKeyParam wkKey)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::ActiveWorkingKey(DWORD dwMkSN, DWORD dwWkSN)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::SetParam(SetParamTypeEnum eType, SetParamValueEnum eValue)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::EncryptData(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    memset(destInfo.data, 0, sizeof(destInfo.data));
+    if(std::strcmp((const char*)srcInfo.data, "0000000000000000") == 0) {
+        std::strcpy((char*)destInfo.data, "EC6162E6E08C7279");
+        destInfo.dwSize = 16;
+    } else if(std::strcmp((const char*)srcInfo.data, "1234567890123456ff00ff001122334400000000000000001234567890123456ff00ff001122334400000000000000001234567890123456ff00ff001122334400000000000000001234567890123456ff00ff001122334400000000000000001234567890123456ff00ff001122334400000000000000001234567890123456") == 0) {
+        std::strcpy((char*)destInfo.data, "9DFE47D355F40F33FC634AF5BA511337DC36261313DDF70F6B7E5696EC55BDE4C39F7CE724AA864AC3074B2F4A51FC87C2A160A9102507E8126312B204392EB4BDA42A724E2F75FC9B87EE02B4CB47813A0F9A734EF5680D20D897CB2DB4EB2EF0D24B8AE2FA277F569F222AABE660AA2D276B9432D8941AAA64D1E62209ABFC");
+        destInfo.dwSize = 256;
+    } else {
+        err = Error_NotImpl;
+    }
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::MacEncrypt(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo)
+{
+    ErrorCodeEnum err = Error_NotImpl;
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::GetPinBlock(PinBlock &block)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    std::strcpy((char*)block.data, "147DE54A44497DDB");
+    block.dwSize = 16;
+    return err;
+}
+
+ErrorCodeEnum PinPadClassImpl::SetAccNo(AccountInfo accInfo)
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+
+ErrorCodeEnum PinPadClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+    return Error_Succeed;
+}
+
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DeviceBaseClass*& pOutDevAptObj)
+{
+    pOutDevAptObj = new PinPadClassImpl();
+    if(pOutDevAptObj == NULL)
+    {
+        return Error_Resource;
+    }
+
+    cmb::log_init_config config;
+    config.dev_name = "PinPad";
+#if defined(_MSC_VER)
+    config.log_dir = ("C:\\rvc\\dbg\\");
+#else
+    config.log_dir = ("/opt/rvc/dbg/");
+#endif //_MSC_VER
+    std::string str;
+    cmb::log4vendor::init(config, str);
+    printf("init after: %s\n", str.c_str());
+
+    return Error_Succeed;
+}
+
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass*& pInDevAptObj)
+{
+    if(pInDevAptObj == NULL)
+    {
+        return Error_Param;
+    }
+    if(PinPadClassImpl* pTmp = dynamic_cast<PinPadClassImpl*>(pInDevAptObj))
+    {
+        delete pTmp;
+        pTmp = NULL;
+        return Error_Succeed;
+    }
+    return Error_Param;
+
+}

+ 47 - 0
DevAdapter/simulator/pinpad.1.1/pinpad_impl.h

@@ -0,0 +1,47 @@
+//
+// Created by LocalUser on 2019/1/7.
+//
+
+#ifndef LIBFRAMEWORK_PINPAD_IMPL_H
+#define LIBFRAMEWORK_PINPAD_IMPL_H
+
+#include "PinPadClass.h"
+
+class PinPadClassImpl : public PinPadClass
+{
+public:
+    PinPadClassImpl();
+    ~PinPadClassImpl();
+
+    ErrorCodeEnum DevOpen(DWORD dwPort, DWORD dwBaudRate);
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    //PinPadClass
+    ErrorCodeEnum KeyRead(BYTE &ch);
+    ErrorCodeEnum PinRead(BYTE &ch);
+
+    ErrorCodeEnum StartPinInput(BYTE byLen);
+    ErrorCodeEnum StartPinInputConfirm(BYTE byLen);
+
+    ErrorCodeEnum StartPlainInput();
+    ErrorCodeEnum StopInput();
+    ErrorCodeEnum LoadMasterKey(MasterKeyParam masterKey);
+    ErrorCodeEnum LoadWorkingKey(WorkKeyParam wkKey);
+    ErrorCodeEnum ActiveWorkingKey(DWORD dwMkSN, DWORD dwWkSN);
+    ErrorCodeEnum SetParam(SetParamTypeEnum eType, SetParamValueEnum eValue);
+    ErrorCodeEnum EncryptData(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo);
+    ErrorCodeEnum MacEncrypt(EnDecryptInfo srcInfo, EnDecryptInfo &destInfo);
+    ErrorCodeEnum GetPinBlock(PinBlock &block);
+    ErrorCodeEnum SetAccNo(AccountInfo accInfo);
+    int GetEncryptFunc(){ return 1;}
+private:
+    int m_mode;
+};
+
+
+#endif //LIBFRAMEWORK_PINPAD_IMPL_H