Ver Fonte

!10647 更新基线
Merge pull request !10647 from 80274480/ST2

陈礼鹏80274480 há 7 meses atrás
pai
commit
2cc81d01dd
66 ficheiros alterados com 1933 adições e 1972 exclusões
  1. 1 0
      Framework/Common/SpBase.h
  2. 85 0
      Framework/RvcLogSdk/baseFun.cpp
  3. 42 0
      Framework/RvcLogSdk/baseFun.h
  4. 22 0
      Framework/RvcLogSdk/baseTime.cpp
  5. 1 0
      Framework/RvcLogSdk/baseTime.h
  6. 1 13
      Framework/RvcLogSdk/log_api.cpp
  7. 1 1
      Framework/RvcLogSdk/log_api.h
  8. 130 23
      Framework/RvcLogSdk/log_builder.cpp
  9. 24 8
      Framework/RvcLogSdk/log_builder.h
  10. 99 131
      Framework/RvcLogSdk/log_db.cpp
  11. 0 1
      Framework/RvcLogSdk/log_db.h
  12. 3 3
      Framework/RvcLogSdk/log_multi_thread.h
  13. 19 16
      Framework/RvcLogSdk/log_persistent_manager.cpp
  14. 7 0
      Framework/RvcLogSdk/log_producer_client.cpp
  15. 2 0
      Framework/RvcLogSdk/log_producer_client.h
  16. 1 1
      Framework/RvcLogSdk/log_producer_config.c
  17. 20 26
      Framework/RvcLogSdk/log_producer_manager.cpp
  18. 1 1
      Framework/RvcLogSdk/log_producer_manager.h
  19. 39 4
      Framework/RvcLogSdk/log_producer_sender.cpp
  20. 0 0
      Framework/RvcLogSdk/log_queue.cpp
  21. 3 0
      Framework/spbase/SpEntityPrivilege.cpp
  22. 201 0
      Framework/spbase/StartUpBase.cpp
  23. 17 0
      Framework/spbase/StartUpBase.h
  24. 2 1
      Framework/spbase/sp_bcm.c
  25. 8 12
      Framework/spbase/sp_logwithlink.cpp
  26. 36 31
      Framework/spbase/sp_mod.c
  27. 17 0
      Framework/spshell/SpShellBase.h
  28. 10 4
      Framework/spshell/svc.cpp
  29. 0 2
      Module/include/DevEntityCommBase.hpp
  30. 67 149
      Module/include/DevFSMCommBase.hpp
  31. 21 36
      Module/mod_CardIssuerStand/CardIssuerFSM.cpp
  32. 5 17
      Module/mod_CardIssuerStand/CardIssuerFSM.h
  33. 1 10
      Module/mod_CardIssuerStand/mod_cardissuer.cpp
  34. 2 3
      Module/mod_CardReadAdapter/CardReadAdapterFSM.cpp
  35. 1 10
      Module/mod_CardReadAdapter/CardReadAdapterFSM.h
  36. 5 5
      Module/mod_ContactlessCard/ContactlessFSM.cpp
  37. 0 4
      Module/mod_ContactlessCard/ContactlessFSM.h
  38. 8 8
      Module/mod_FingerPrint/FingerPrintFSM.cpp
  39. 3 14
      Module/mod_FingerPrint/FingerPrintFSM.h
  40. 1 11
      Module/mod_FingerPrint/mod_FingerPrint.cpp
  41. 1 1
      Module/mod_FingerPrint/mod_FingerPrint.h
  42. 9 13
      Module/mod_HSPScanner/HSPScannerFSM.cpp
  43. 2 3
      Module/mod_HSPScanner/HSPScannerFSM.h
  44. 1 6
      Module/mod_HSPScanner/mod_HSPScanner.cpp
  45. 5 5
      Module/mod_IDCertificate/IDCertFSM.cpp
  46. 0 10
      Module/mod_IDCertificate/IDCertFSM.h
  47. 406 234
      Module/mod_accessauth/AccessAuthFSM.cpp
  48. 75 358
      Module/mod_accessauth/AccessAuthFSM.h
  49. 88 510
      Module/mod_accessauth/mod_AccessAuth.cpp
  50. 7 7
      Module/mod_accessauth/mod_AccessAuth.h
  51. 20 38
      Module/mod_cardissuerstore/CardIssuerFSM.cpp
  52. 7 16
      Module/mod_cardissuerstore/CardIssuerFSM.h
  53. 1 12
      Module/mod_cardissuerstore/mod_cardissuer.cpp
  54. 60 61
      Module/mod_chromium/CWSCodec.cpp
  55. 3 2
      Module/mod_chromium/CWSCodec.h
  56. 72 8
      Module/mod_chromium/CWebsocketServer.cpp
  57. 122 52
      Module/mod_chromium/baseEx.cpp
  58. 53 2
      Module/mod_chromium/baseEx.h
  59. 15 0
      Module/mod_chromium/mod_chromium.cpp
  60. 1 1
      Module/mod_mediacontroller/Event.h
  61. 10 27
      Module/mod_pinpad/PinPadFSM.cpp
  62. 6 13
      Module/mod_pinpad/PinPadFSM.h
  63. 1 6
      Module/mod_pinpad/mod_PinPad.h
  64. 1 6
      Module/mod_pinpad/mod_pinpad.cpp
  65. 0 5
      Module/mod_upload/UploadFSM.cpp
  66. 61 31
      addin/res/VTMModifyHeaders/background.js

+ 1 - 0
Framework/Common/SpBase.h

@@ -1620,6 +1620,7 @@ SPBASE_API bool refreshLogLevel();
 SPBASE_API int getCurLogLevel();
 SPBASE_API int getReduceSpbaseLog();
 SPBASE_API void setReduceSpbaseLog(int isNor);
+SPBASE_API void setTestLogMode();
 SPBASE_API ErrorCodeEnum GetAllEntityIdx(CAutoArray<CSimpleStringA>& strEntityNames, CAutoArray<WORD>& wEntityDevelopIDs);
 
 

+ 85 - 0
Framework/RvcLogSdk/baseFun.cpp

@@ -0,0 +1,85 @@
+#include <time.h>
+#include <RestfulFunc.h>
+#include "json/json.h"
+#include "baseFun.h"
+#include <mutex>
+#include <condition_variable>
+std::mutex m_mutex;
+std::condition_variable condition_variable;
+
+
+long LOG_GET_TIME() 
+{ 
+    return time(NULL); 
+}
+
+RvcLogSdkManager& RvcLogSdkManager::getInstance() {
+    static RvcLogSdkManager instance;
+    return instance;
+}
+
+std::list<log_group_builder*> &RvcLogSdkManager::getResendFrameList() {
+    return m_resend_frame_list;
+}
+
+RvcLogSdkManager::RvcLogSdkManager() {
+    m_resend_frame_list.clear();
+    m_testLogMode = false;
+}
+
+bool RvcLogSdkManager::wait_for_counter_greater_than_one_with_timeout() {
+    std::unique_lock<std::mutex> lock(m_mutex);
+    // 等待条件满足(即 counter > 1),最多等待 100 毫秒
+    bool timed_out = !condition_variable.wait_for(lock, std::chrono::milliseconds(100), [&] { return m_logFlush_num > 0; });
+
+    m_logFlush_num = 0;//已经刷新了,后续重新计数
+    return true;
+}
+
+int RvcLogSdkManager::LOG_OS_TestLogPost(const char* url, const char* body)
+{
+    HttpClientResponseResult result;
+    HttpClientRequestConfig config(HttpRequestMethod::POST, url);
+
+    std::string str((const char*)body);
+    config.SetJsonBody(str.c_str());
+    RestfulClient client = RestfulClient::getInstance();
+    config.PreDo();
+    client.Do(&config, &result);
+    return 0;
+}
+int RvcLogSdkManager::SendTestLog(const char* body)
+{
+    if (m_testLogMode == false)
+        return -1;
+    HttpClientRequestConfig sendErr(HttpRequestMethod::POST, "http://99.12.43.134:9000/upload_msg");
+    HttpClientResponseResult curResult;
+    Json::Value rootReq;
+    Json::FastWriter writer;
+    rootReq["req"] = body;
+    rootReq["ans"] = "Json_not_vaild";
+    std::string jsonReq = writer.write(rootReq);
+    sendErr.SetJsonBody(jsonReq.c_str());
+    RestfulClient client = RestfulClient::getInstance();
+    sendErr.PreDo();
+    client.Do(&sendErr, &curResult);
+    return 0;
+}
+
+
+
+#ifndef _WIN32
+
+
+#ifndef CLOCK_MONOTONIC_RAW
+#define CLOCK_MONOTONIC_RAW 4
+#endif
+uint32_t GetTickCount(void)
+{
+    uint32_t ticks = 0;
+    struct timespec ts;
+    if (!clock_gettime(CLOCK_MONOTONIC_RAW, &ts))
+        ticks = (ts.tv_sec * 1000) + (ts.tv_nsec / 1000000);
+    return ticks;
+}
+#endif

+ 42 - 0
Framework/RvcLogSdk/baseFun.h

@@ -0,0 +1,42 @@
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#include <list>
+#include "log_builder.h"
+#include <atomic>
+
+
+#ifdef _WIN32
+DWORD WINAPI log_producer_send_thread(LPVOID param);
+#else
+void * log_producer_send_thread(void * param);
+#endif
+
+long LOG_GET_TIME();
+
+#define STR_LOG_SEND_ONE  "LOG_SEND_ONE"
+#define STR_LOG_SEND_DIRTY  "LOG_SEND_DIRTY"
+
+
+class RvcLogSdkManager {
+public:
+    static RvcLogSdkManager& getInstance();
+    std::list<log_group_builder*> &getResendFrameList();
+
+    std::atomic<int>  m_logFlush_num;
+    bool m_testLogMode;
+    
+    bool wait_for_counter_greater_than_one_with_timeout();
+
+    int LOG_OS_TestLogPost(const char* url, const char* body);
+    int SendTestLog(const char* body);
+private:
+    std::list<log_group_builder*> m_resend_frame_list;
+private:
+    RvcLogSdkManager();
+    RvcLogSdkManager(const RvcLogSdkManager&) = delete;
+    RvcLogSdkManager& operator=(const RvcLogSdkManager&) = delete;
+};
+#ifndef _WIN32
+uint32_t GetTickCount(void);
+#endif

+ 22 - 0
Framework/RvcLogSdk/baseTime.cpp

@@ -0,0 +1,22 @@
+#include "baseTime.h"
+#include <winpr/sysinfo.h>
+void GetCurrentTimeStr(char* unitedNowTime)
+{
+    SYSTEMTIME st;
+    FILETIME utc_ft, local_ft, ft;
+
+#ifdef _WIN32
+    
+    GetSystemTime(&st);
+    SystemTimeToFileTime(&st, &ft);
+    utc_ft.dwLowDateTime = (DWORD)ft.dwLowDateTime;
+    utc_ft.dwHighDateTime = (DWORD)ft.dwHighDateTime;
+    FileTimeToLocalFileTime(&utc_ft, &local_ft);
+    FileTimeToSystemTime(&local_ft, &st);
+#else
+    GetLocalTime(&st);
+#endif // _WIN32
+
+    sprintf(unitedNowTime, "%04d-%02d-%02d %02d:%02d:%02d.%03d",
+        st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
+}

+ 1 - 0
Framework/RvcLogSdk/baseTime.h

@@ -0,0 +1 @@
+void GetCurrentTimeStr(char* unitedNowTime);

+ 1 - 13
Framework/RvcLogSdk/log_api.cpp

@@ -8,6 +8,7 @@
 #include <string.h>
 #include "sds.h"
 #include "inner_log.h"
+#include "baseFun.h"
 
 
 //#define GBK_COMPACT
@@ -200,18 +201,7 @@ if (result->statusCode / 100 == 2)
 
 */
 
-int LOG_OS_TestLogPost(const char* url, const char* body)
-{
-	HttpClientResponseResult result;
-	HttpClientRequestConfig config(HttpRequestMethod::POST, url);
 
-	std::string str((const char*)body);
-	config.SetJsonBody(str.c_str());
-	RestfulClient client = RestfulClient::getInstance();
-	config.PreDo();
-	client.Do(&config, &result);
-	return 0;
-}
 
 int LOG_OS_HttpPost(const char* url,
 	char** header_array,
@@ -293,8 +283,6 @@ int LOG_OS_HttpPost(const char* url,
 }
 
 
-extern long LOG_GET_TIME();
-
 log_status_t sls_log_init(int32_t log_global_flag)
 {
     return 0;

+ 1 - 1
Framework/RvcLogSdk/log_api.h

@@ -29,7 +29,7 @@ post_log_result * post_logs(const char *endpoint, const char * accesskeyId, cons
 
 void post_log_result_destroy(post_log_result * result);
 
-int LOG_OS_TestLogPost(const char* url, const char* body);
+
 
 LOG_CPP_END
 #endif

+ 130 - 23
Framework/RvcLogSdk/log_builder.cpp

@@ -8,6 +8,11 @@
 #include "inner_log.h"
 #include <lz4.h>
 #include "json/json.h"
+#include "baseFun.h"
+#include <chrono>
+#include <ctime>
+#include <baseTime.h>
+
 
 /**
  * adjust buffer, this function will ensure tag's buffer size >= tag->now_buffer_len + new_len
@@ -214,6 +219,34 @@ int add_log(log_group_builder* bder, long start_time, uint32_t pack_index, log_i
     long now;
     char nowTime[64] = { 0 }, unitedNowTime[64] = { 0 };
 
+
+    GetCurrentTimeStr(unitedNowTime);
+    if (strlen(unitedNowTime) == 0)
+    {
+        using namespace std::chrono;
+        auto cur_now = system_clock::now();
+        auto ms = duration_cast<milliseconds>(cur_now.time_since_epoch()) % 1000;
+        auto timer = system_clock::to_time_t(cur_now);
+
+        std::string ms_str = std::to_string(ms.count());
+
+        // 謇句勘陦・鮨先ッォ遘貞芦3菴�
+        while (ms_str.length() < 3) {
+            ms_str = "0" + ms_str; // 謌冶€� ms_str.insert(0, "0");
+        }
+
+        char buffer[20]; // 逕ィ莠主ュ伜お譬シ蠑丞喧蜷守噪譌・譛溷柱譌カ髣エ
+        std::tm* local_time = std::localtime(&timer);
+        std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time); // 菴ソ逕ィ std::strftime
+
+        std::ostringstream oss;
+        oss << buffer << '.' << ms_str;
+
+        memcpy(unitedNowTime, buffer, sizeof(buffer));
+    }
+
+
+
     if (bder->grp->n_logs >= MAX_LOG_COUNT) {
         return -1;
     }
@@ -222,8 +255,6 @@ int add_log(log_group_builder* bder, long start_time, uint32_t pack_index, log_i
     get_format_uuid(bder->grp->logs[bder->grp->n_logs].uuid, MAX_UUID_LEN);
 
     now = record_time;
-    GetTimeStr(now, nowTime);
-    GetUnitedTimeStr(now, unitedNowTime);
 
     skyeye_content = cJSON_CreateObject();
     meta_log_content = cJSON_CreateObject();
@@ -295,7 +326,7 @@ int add_log(log_group_builder* bder, long start_time, uint32_t pack_index, log_i
                 cJSON_AddItemToObject(log_content, "type", cJSON_CreateString("SYSTEM_PERFORMANCE"));
             }
 
-            cJSON_AddItemToObject(skyeye_content, "EvenTime", cJSON_CreateString(nowTime));
+            cJSON_AddItemToObject(skyeye_content, "EvenTime", cJSON_CreateString(unitedNowTime));
             if (log->BeginTime || log->EndTime)
             {
                 cJSON_AddItemToObject(skyeye_content, "BeginTime", cJSON_CreateNumber(log->BeginTime));
@@ -305,10 +336,10 @@ int add_log(log_group_builder* bder, long start_time, uint32_t pack_index, log_i
         cJSON_AddItemToObject(skyeye_content, "CostTime", cJSON_CreateNumber(log->CostTime));
         cJSON_AddItemToObject(skyeye_content, "VtmUuid", cJSON_CreateString(bder->grp->logs[bder->grp->n_logs].uuid));
         cJSON_AddItemToObject(skyeye_content, "Version", cJSON_CreateString(bder->config->skyeyeVersion));
-        cJSON_AddItemToObject(skyeye_content, "DateTime", cJSON_CreateString(nowTime));
+        cJSON_AddItemToObject(skyeye_content, "DateTime", cJSON_CreateString(unitedNowTime));
         cJSON_AddItemToObject(skyeye_content, "ResultCode", cJSON_CreateString(log->ResultCode));
 
-        //霑∫ァサ蛻ー蜈ャ蜈ア菴咲スョ�碁�髴€隕∬ソ吩クェ謨ー?
+        //霑∫ァサ蛻ー蜈ャ蜈ア菴咲スョ�碁�髴€隕∬ソ吩クェ謨ー�ス?
         if (log->LogCode != NULL) {
             cJSON_AddItemToObject(skyeye_content, "LogCode", cJSON_CreateString(log->LogCode));
         }
@@ -362,7 +393,7 @@ int add_log(log_group_builder* bder, long start_time, uint32_t pack_index, log_i
     aos_debug_log((LB, "add_log 6"));
     {
         cJSON* t_baseLogType = NULL;
-        // モヲモテミナマ「
+        // モヲ�ス�ス�ス�スマ「
         //cJSON_AddItemToObject(united_content, "appName", cJSON_CreateString(bder->config->unitedAppName));
         cJSON_AddItemToObject(united_content, "_CMB_LOG_SPEC_VERSION", cJSON_CreateString(bder->config->unitedVersion));
 
@@ -392,7 +423,7 @@ int add_log(log_group_builder* bder, long start_time, uint32_t pack_index, log_i
     {
         _adjust_buffer(grp_log, totalBufferSize);
     }
-    memcpy(grp_log->buffer, str_united_content, totalBufferSize);
+    memcpy(grp_log->buffer, str_united_content, totalBufferSize);//transfer success�� it would not cause dirty log
     bder->loggroup_size += totalBufferSize;
     grp_log->buffer_len = totalBufferSize;
     if (log->Type == LOG_TYPE_USER) {
@@ -493,6 +524,29 @@ int add_log_raw(log_group_builder* bder, build_item* log)
     return 0;
 }
 
+int add_log_raw2(log_group_builder* bder, build_item2* log)
+{
+    build_item* build_data;
+    if (bder->grp->n_logs >= MAX_LOG_COUNT) {
+        return -1;
+    }
+
+    build_data = &(bder->grp->logs[bder->grp->n_logs]);
+    if (build_data->buffer == NULL || build_data->buffer_len < log->buffer_len)
+    {
+        _adjust_buffer(build_data, log->buffer_len);
+    }
+    memcpy(build_data->buffer, log->buffer, log->buffer_len);
+    build_data->buffer_len = log->buffer_len;
+    memcpy(build_data->uuid, log->uuid, MAX_UUID_LEN);
+    build_data->type = log->type;
+    build_data->level = log->level;
+    bder->loggroup_size += log->buffer_len;
+
+    ++bder->grp->n_logs;
+    return 0;
+}
+
 int add_log_serialize_buf(log_group_builder* bder, serialize_buf* buffer)
 {
     build_item* build_data;
@@ -593,6 +647,53 @@ static uint32_t _log_pack(log_group_builder* bder, log_buf* buf)
     return totalBufferSize;
 }
 
+static const std::string base64_chars =
+"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+"abcdefghijklmnopqrstuvwxyz"
+"0123456789+/";
+
+std::string base64_encode(const std::string& input) {
+	std::string ret;
+	int i = 0;
+	int j = 0;
+	unsigned char char_array_3[3];
+	unsigned char char_array_4[4];
+	int in_len = input.size();
+	const unsigned char* bytes_to_encode = reinterpret_cast<const unsigned char*>(input.c_str());
+
+	while (in_len--) {
+		char_array_3[i++] = *(bytes_to_encode++);
+		if (i == 3) {
+			char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+			char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+			char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+			char_array_4[3] = char_array_3[2] & 0x3f;
+
+			for (i = 0; i < 4; i++)
+				ret += base64_chars[char_array_4[i]];
+			i = 0;
+		}
+	}
+
+	if (i) {
+		for (j = i; j < 3; j++)
+			char_array_3[j] = '\0';
+
+		char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+		char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+		char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+		char_array_4[3] = char_array_3[2] & 0x3f;
+
+		for (j = 0; j < i + 1; j++)
+			ret += base64_chars[char_array_4[j]];
+
+		while (i++ < 3)
+			ret += '=';
+	}
+
+	return ret;
+}
+
 void add_log_terminal_sn_other(log_group_builder* bder, char* sn, char* clientIP) {
 
     int32_t totalBufferSize;
@@ -624,6 +725,15 @@ void add_log_terminal_sn_other(log_group_builder* bder, char* sn, char* clientIP
                         cJSON_AddItemToObject(content, "ClientIP", cJSON_CreateString(clientIP));
                         changed = 1;
                     }
+                    if(bder->grp->logs[i].uuid == std::string(STR_LOG_SEND_DIRTY) && cJSON_HasObjectItem(content, "ResultMsg"))//dirty log, need encrypt ResultMsg
+                    {
+                        cJSON* resultMsg = cJSON_GetObjectItem(content, "ResultMsg");
+                        std::string base64_str = base64_encode(resultMsg->valuestring);
+                        std::string dirty_str = std::string("[DirtyLog_BD67]");
+                        dirty_str.append(base64_str);
+                        cJSON_ReplaceItemInObject(content, "ResultMsg", cJSON_CreateString(dirty_str.c_str()));
+                        changed = 1;
+                    }
                 }
             }
 
@@ -664,19 +774,6 @@ void clear_errJson_msg(log_group_builder* bder)
             if (message_content == NULL)
             {
                 bder->grp->logs[i].check = 0;
-                /*
-                HttpClientRequestConfig sendErr(HttpRequestMethod::POST, "http://99.12.43.134:9000/upload_msg");
-                HttpClientResponseResult curResult;
-                Json::Value rootReq;
-                Json::FastWriter writer;
-                rootReq["req"] = bder->grp->logs[i].buffer;
-                rootReq["ans"] = "Json_not_vaild";
-                std::string jsonReq = writer.write(rootReq);
-                sendErr.SetJsonBody(jsonReq.c_str());
-                RestfulClient client = RestfulClient::getInstance();
-                sendErr.PreDo();
-                client.Do(&sendErr, &curResult);
-                */
             }                
             else
                 bder->grp->logs[i].check = 1;
@@ -781,7 +878,7 @@ void add_log_terminal_no(log_group_builder* bder, char* no) {
                 size_t start_pos = 0;
                 while ((start_pos = dstStr.find(src, start_pos)) != std::string::npos) {
                     dstStr.replace(start_pos, src.length(), strto);
-                    start_pos += strto.length(); // キタヨケボマ゙ムュサキ
+                    start_pos += strto.length(); // �ス�スヨケ�ス�ス�ス�スムュ�ス�ス
                     break;
                 }
                 auto result = dstStr;
@@ -801,7 +898,7 @@ void add_log_terminal_no(log_group_builder* bder, char* no) {
                 cJSON* tags = cJSON_GetObjectItem(message_content, "tags");
                 if (tags != NULL && !cJSON_HasObjectItem(tags, "TerminalNo"))
                 {
-                    // 蝨ィtags闃らせ荳ュ豺サ蜉�譁ー?
+                    // 蝨ィtags闃らせ荳ュ豺サ蜉�譁ー�ス?
                     cJSON_AddItemToObject(tags, "TerminalNo", cJSON_CreateString(no));
                     changed = 1;
                 }
@@ -817,6 +914,15 @@ void add_log_terminal_no(log_group_builder* bder, char* no) {
     }
 }
 
+void convert_to_build_item2(const build_item& item, build_item2 &new_item) {
+    new_item.type = item.type;
+    new_item.level = item.level;
+    memcpy(new_item.uuid, item.uuid, MAX_UUID_LEN);
+    new_item.buffer_len = item.buffer_len;
+    memcpy(new_item.buffer, item.buffer, item.buffer_len);
+    new_item.check = item.check;
+}
+
 log_buf serialize_to_proto_buf_with_malloc(log_group_builder* bder)
 {
     int i = 0;
@@ -850,6 +956,7 @@ lz4_log_buf* serialize_to_proto_buf_with_malloc_no_lz4(log_group_builder* bder)
     pLogbuf->type = buf.type;
     for (i = 0; i < pLogbuf->n_logs; i++) {
         memcpy(pLogbuf->uuid[i], buf.uuid[i], MAX_UUID_LEN);
+        convert_to_build_item2(bder->grp->logs[i], pLogbuf->src_logs[i]);
     }
     strcpy(pLogbuf->modular, bder->modular);
     free(buf.buffer);
@@ -858,7 +965,6 @@ lz4_log_buf* serialize_to_proto_buf_with_malloc_no_lz4(log_group_builder* bder)
 
 lz4_log_buf* serialize_to_proto_buf_with_malloc_lz4(log_group_builder* bder)
 {
-
     int i = 0;
     lz4_log_buf* pLogbuf;
     log_buf buf = serialize_to_proto_buf_with_malloc(bder);
@@ -879,6 +985,7 @@ lz4_log_buf* serialize_to_proto_buf_with_malloc_lz4(log_group_builder* bder)
     pLogbuf->type = buf.type;
     for (i = 0; i < pLogbuf->n_logs; i++) {
         memcpy(pLogbuf->uuid[i], buf.uuid[i], MAX_UUID_LEN);
+        convert_to_build_item2(bder->grp->logs[i], pLogbuf->src_logs[i]);
     }
     strcpy(pLogbuf->modular, bder->modular);
     free(compress_data);

+ 24 - 8
Framework/RvcLogSdk/log_builder.h

@@ -22,6 +22,28 @@ typedef enum {
     LOG_TYPE_USER_SKYEYE, LOG_TYPE_SYS_SKYEYE, LOG_TYPE_BEIDOU, LOG_TYPE_USER_BUSINESS, LOG_TYPE_SYS_BUSINESS, LOG_TYPE_WEBSDK
 }build_type_e;
 
+typedef struct _build_item {
+    build_type_e type;
+    LOG_LEVEL_E level;
+    char uuid[MAX_UUID_LEN];
+    uint32_t buffer_len;
+    char* buffer;
+    int check;
+}build_item;
+
+//10kb
+#define MAX_LOG_LEN 10000
+
+typedef struct _build_item2 {
+    build_type_e type;
+    LOG_LEVEL_E level;
+    char uuid[MAX_UUID_LEN];
+    uint32_t buffer_len;
+    char buffer[MAX_LOG_LEN];
+    int check;
+}build_item2;
+
+
 typedef struct _lz4_log_buf {
     build_type_e type;
     char modular[MAX_PATH];
@@ -29,18 +51,11 @@ typedef struct _lz4_log_buf {
     char uuid[MAX_LOG_COUNT][MAX_UUID_LEN];
     int length;
     int raw_length;
+    build_item2 src_logs[MAX_LOG_COUNT];//use for resend
     unsigned char data[0];
 }lz4_log_buf;
 
 
-typedef struct _build_item {
-    build_type_e type;
-    LOG_LEVEL_E level;
-    char uuid[MAX_UUID_LEN];
-    uint32_t buffer_len;
-    char* buffer;
-    int check;
-}build_item;
 
 
 typedef struct _log_group {
@@ -82,6 +97,7 @@ extern void log_group_destroy(log_group_builder* bder);
 extern int add_log(log_group_builder* bder, long start_time, uint32_t pack_index, log_item* log, long record_time);
 extern int add_beidou_log(log_group_builder* bder, beidou_log_item* log);
 extern int add_log_raw(log_group_builder* bder, build_item* log);
+extern int add_log_raw2(log_group_builder* bder, build_item2* log);
 extern int add_log_serialize_buf(log_group_builder* bder, serialize_buf* buffer);
 extern void add_log_terminal_no(log_group_builder* bder, char* no);
 extern void clear_errJson_msg(log_group_builder* bder);

+ 99 - 131
Framework/RvcLogSdk/log_db.cpp

@@ -21,21 +21,10 @@
 #include "zlib.h"
 #include "base64_openssl.h"
 #include <chrono>
+#include "baseFun.h"
 
 #ifndef _WIN32
 
-#ifndef CLOCK_MONOTONIC_RAW
-#define CLOCK_MONOTONIC_RAW 4
-#endif
-
-uint32_t GetTickCount(void)
-{
-	uint32_t ticks = 0;
-    struct timespec ts;
-    if (!clock_gettime(CLOCK_MONOTONIC_RAW, &ts))
-        ticks = (ts.tv_sec * 1000) + (ts.tv_nsec / 1000000);
-	return ticks;
-}
 
 char* itoa(int value, char* buffer, int radix)
 {
@@ -91,7 +80,6 @@ const std::string COLUMN_Status = "status";
 const std::string COLUMN_Encrypt = "encrypt";
 const std::string COLUMN_Content = "content";
 
-long LOG_GET_TIME() { return time(NULL); }
 int db_move_to_main(log_db_manager* manager);
 
 struct _log_db_manager {
@@ -371,12 +359,78 @@ int db_insert_one(log_db_manager* manager, serialize_buf* buf) {
 		CMBSM4EncryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword, compress_str_data, compressLen, output_data, &output_length);
 		char* output_str_data = openssl_base64_encode((char*)output_data, output_length);
 
+		//try to decrypt
+		/*
+		char* input_str_data = output_str_data;
+
+		char* decoded_bytes = NULL;
+		size_t decoded_length = 0;
+		openssl_base64_decode(input_str_data, &decoded_bytes, &decoded_length);
+
+		int SM4_length = decoded_length;
+		char* SM4_data = (char*)malloc(decoded_length);
+		memset(SM4_data, 0, decoded_length);
+		CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
+			(unsigned char*)decoded_bytes, decoded_length, (unsigned char*)SM4_data, &SM4_length);
+
+		uLongf uncompress_length = SM4_length * 3;
+		char *output_data2 = (char*)malloc(uncompress_length);
+		memset(output_data2, 0, uncompress_length);
+
+		uncompress((unsigned char*)output_data2, &uncompress_length, (unsigned char*)SM4_data, SM4_length);
+		if(SM4_data)
+			free(SM4_data);
+		if(decoded_bytes)
+			free(decoded_bytes);
+			*/
+
+		strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
+			"," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
+			") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
+			append(strLevel).append(",").append(strType).append(",'").
+			append((char*)output_str_data).append("',").append(strEncrypt).append(",0)");
+
+		if(compress_str_data)
+			free(compress_str_data);
+		if(output_data)
+			free(output_data);
+		if(output_str_data)
+			free(output_str_data);
+		end_time = GetTickCount();
+	}
+	else if (manager->config->usePersistentEncrypt == 3)
+	{
+		if (strlen(buf->buffer) == 0)
+			return ret;
+		int input_length = strlen(buf->buffer) + 1;
+		unsigned char* input_data = (unsigned char*)buf->buffer;
+
+		int output_length = input_length + 16;
+		unsigned char* output_data = (unsigned char*)malloc(output_length);
+		CMBSM4EncryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword, input_data, input_length, output_data, &output_length);
+		char* output_str_data = openssl_base64_encode((char*)output_data, output_length);
+
+		//try to decrypt
 		/*
-		unsigned long len = output_length * 2 + 1;
-		unsigned char* output_str_data = (unsigned char*)malloc(len);
-		memset(output_str_data, 0, len);
-		compress(output_str_data, &len, (unsigned char*)output_data, output_length);
+		char* input_str_data = output_str_data;
+
+		char* decoded_bytes = NULL;
+		size_t decoded_length = 0;
+		openssl_base64_decode(input_str_data, &decoded_bytes, &decoded_length);
+
+		int SM4_length = decoded_length;
+		char* SM4_data = (char*)malloc(decoded_length);
+		memset(SM4_data, 0, decoded_length);
+		CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
+			(unsigned char*)decoded_bytes, decoded_length, (unsigned char*)SM4_data, &SM4_length);
+		//RvcLogSdkManager::getInstance().SendTestLog(output_str_data);
+
+		if(SM4_data)
+			free(SM4_data);
+		if(decoded_bytes)
+			free(decoded_bytes);
 		*/
+			
 
 		strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
 			"," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
@@ -384,9 +438,10 @@ int db_insert_one(log_db_manager* manager, serialize_buf* buf) {
 			append(strLevel).append(",").append(strType).append(",'").
 			append((char*)output_str_data).append("',").append(strEncrypt).append(",0)");
 
-		free(compress_str_data);
-		free(output_data);
-		free(output_str_data);
+		if (output_data)
+			free(output_data);
+		if (output_str_data)
+			free(output_str_data);
 		end_time = GetTickCount();
 	}
 	else {
@@ -424,111 +479,7 @@ int db_insert_one(log_db_manager* manager, serialize_buf* buf) {
 	return ret;
 }
 
-log_group_builder* db_read_table_last_log(log_db_manager* manager, char *table_name) {
-	if (manager == NULL || manager->db == NULL) {
-		aos_error_log((LB, "read last log db %s failed for null.", manager->file_name.c_str()));
-		return NULL;
-	}
 
-	build_item log;
-	log_group_builder* builder = NULL;
-	char strStatus[32];
-	sprintf(strStatus, "%d", LOG_DB_STATUS_SENDING);
-	std::string querySql = "select * from ";
-	querySql.append(table_name);
-	querySql.append(" where " + COLUMN_Status + " != ").append(strStatus);
-	querySql.append(" order by " + COLUMN_DateTime + " DESC LIMIT 1;");
-
-	try {
-		CppSQLite3Query q = manager->db->execQuery(querySql.c_str());
-		if (!q.eof()) {
-			int encrypt = q.getIntField(COLUMN_Encrypt.c_str(), 0);
-			log.type = (build_type_e)q.getIntField(COLUMN_Type.c_str(), LOG_TYPE_BEIDOU);
-			strcpy(log.uuid, q.getStringField(COLUMN_Uuid.c_str()));
-			log.level = (LOG_LEVEL_E)q.getIntField(COLUMN_Level.c_str(), LOG_LEVEL_DEBUG);
-			//content
-			char* output_data = NULL;
-			if (encrypt == 1) {
-				char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
-				int input_length = strlen(input_str_data) / 2;
-				unsigned char* input_data = (unsigned char*)malloc(input_length);
-				convertStrToUnChar(input_str_data, input_data);
-				int output_length = input_length;
-				output_data = (char*)malloc(input_length);
-				memset(output_data, 0, input_length);
-				CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword, 
-					input_data, input_length, (unsigned char*)output_data, &output_length);
-
-				log.buffer = output_data;
-				log.buffer_len = strlen(log.buffer) + 1;
-
-				free(input_data);
-			}
-			else if (encrypt == 2) {
-				char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
-
-				/*
-				uLongf input_length = strlen(input_str_data);
-				unsigned char* input_data = (unsigned char*)malloc(input_length);
-				uncompress(input_data, &input_length, (unsigned char*)input_str_data, strlen(input_str_data));
-				*/
-				char* decoded_bytes = NULL;
-				size_t decoded_length = 0;
-				openssl_base64_decode(input_str_data, &decoded_bytes, &decoded_length);
-
-				int SM4_length = decoded_length;
-				char* SM4_data = (char*)malloc(decoded_length);
-				memset(SM4_data, 0, decoded_length);
-				CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
-					(unsigned char*)decoded_bytes, decoded_length, (unsigned char*)SM4_data, &SM4_length);
-
-				uLongf uncompress_length = SM4_length;
-				output_data = (char*)malloc(uncompress_length);
-				memset(output_data, 0, uncompress_length);
-				uncompress((unsigned char*)output_data, &uncompress_length, (unsigned char*)SM4_data, SM4_length);
-
-
-				log.buffer = (char*)output_data;
-				log.buffer_len = strlen(log.buffer) + 1;
-
-				free(SM4_data);
-				free(decoded_bytes);
-			}
-			else {
-				std::string src = (char*)q.getStringField(COLUMN_Content.c_str());
-#ifdef COMPRESS_CONTEXT
-                unsigned char dst[10000] = "";
-                uLongf dstLen = 10000;
-                uncompress(dst, &dstLen, (unsigned char*)src.c_str(), src.length());
-                log.buffer = (char*)dst;
-                log.buffer_len = dstLen + 1;
-#else
-                log.buffer = (char*)q.getStringField(COLUMN_Content.c_str());
-				log.buffer_len = strlen(log.buffer) + 1;
-#endif
-			}
-			builder = log_group_create(manager->config);
-			strcpy(builder->modular, manager->file_name.c_str());
-			add_log_raw(builder, &log);
-			if (output_data != NULL) {
-				free(output_data);
-			}
-			//aos_debug_log((LB, "read last log db %s, uuid %s.", manager->file_name.c_str(), log.uuid));
-		}
-		q.finalize();
-	}
-	catch (CppSQLite3Exception& e)
-	{
-		aos_error_log((LB, "db %s read one log error %s", manager->file_name.c_str(), e.errorMessage()));
-		return NULL;
-	}
-	return builder;
-}
-
-
-log_group_builder* db_read_last_log(log_db_manager* manager) {
-	 return db_read_table_last_log(manager, (char *)(manager->table_name.c_str()));
-}
 
 
 int getReadType()
@@ -612,17 +563,12 @@ log_group_builder* db_read_table_last_logs(log_db_manager* manager, int count) {
 
 				log.buffer = output_data;
 				log.buffer_len = strlen(log.buffer) + 1;
-
+				add_log_raw(builder, &log);
 				free(input_data);
 			}
 			else if (encrypt == 2) {
 				char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
 
-				/*
-				uLongf input_length = strlen(input_str_data);
-				unsigned char* input_data = (unsigned char*)malloc(input_length);
-				uncompress(input_data, &input_length, (unsigned char*)input_str_data, strlen(input_str_data));
-				*/
 				char* decoded_bytes = NULL;
 				size_t decoded_length = 0;
 				openssl_base64_decode(input_str_data, &decoded_bytes, &decoded_length);
@@ -641,7 +587,28 @@ log_group_builder* db_read_table_last_logs(log_db_manager* manager, int count) {
 
 				log.buffer = (char*)output_data;
 				log.buffer_len = strlen(log.buffer) + 1;
+				add_log_raw(builder, &log);
+				free(SM4_data);
+				free(decoded_bytes);
+			}
+			else if (encrypt == 3) {
+				char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
+
+				char* decoded_bytes = NULL;
+				size_t decoded_length = 0;
+				openssl_base64_decode(input_str_data, &decoded_bytes, &decoded_length);
+
+				int SM4_length = decoded_length;
+				char* SM4_data = (char*)malloc(decoded_length);
+				memset(SM4_data, 0, decoded_length);
+				CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
+					(unsigned char*)decoded_bytes, decoded_length, (unsigned char*)SM4_data, &SM4_length);
+
+				
 
+				log.buffer = (char*)SM4_data;
+				log.buffer_len = strlen(log.buffer) + 1;
+				add_log_raw(builder, &log);
 				free(SM4_data);
 				free(decoded_bytes);
 			}
@@ -657,9 +624,10 @@ log_group_builder* db_read_table_last_logs(log_db_manager* manager, int count) {
                 log.buffer = (char*)q.getStringField(COLUMN_Content.c_str());
 				log.buffer_len = strlen(log.buffer) + 1;
 #endif // COMPRESS_CONTEXT
+				add_log_raw(builder, &log);
 			}
 			strcpy(builder->modular, manager->file_name.c_str());
-			add_log_raw(builder, &log);
+			
 			if (output_data != NULL) {
 				free(output_data);
 			}

+ 0 - 1
Framework/RvcLogSdk/log_db.h

@@ -21,7 +21,6 @@ int db_transaction_begin(log_db_manager* manager);
 int db_transaction_commit(log_db_manager* manager);
 int db_insert_group(log_db_manager* manager, log_group_builder* builder);
 int db_insert_one(log_db_manager* manager, serialize_buf* buf);
-log_group_builder* db_read_last_log(log_db_manager* manager);
 log_group_builder* db_read_table_last_logs(log_db_manager* manager, int count);
 int db_get_count(log_db_manager* manager);
 int db_delete_one(log_db_manager* manager, char* uuid);

+ 3 - 3
Framework/RvcLogSdk/log_multi_thread.h

@@ -153,7 +153,7 @@ static inline void Win32CreateThread(HANDLE* hpThread, _In_ LPTHREAD_START_ROUTI
 }
 
 
-#define THREAD_INIT(thread, func, param)  Win32CreateThread(&thread, func, param)
+#define THREAD_INIT(thread, func, param)  Win32CreateThread((HANDLE *)&thread, func, param)
 
 #define THREAD_JOIN(thread) WaitForSingleObject(thread, INFINITE)
 
@@ -330,8 +330,8 @@ static inline int sema_wait_time_(sem_t* sema, unsigned int delayMs)
 #define SEMA_WAIT_OK 0
 
 typedef pthread_t THREAD;
-#define THREAD_INIT(thread, func, param) pthread_create(&(thread), NULL, func, param)
-#define THREAD_JOIN(thread) pthread_join(thread, NULL)
+#define THREAD_INIT(thread, func, param) pthread_create((thread), NULL, func, param)
+#define THREAD_JOIN(thread) pthread_join(*(thread), NULL)
 
 #define ATOMICINT volatile long
 

+ 19 - 16
Framework/RvcLogSdk/log_persistent_manager.c → Framework/RvcLogSdk/log_persistent_manager.cpp

@@ -3,6 +3,7 @@
 #include "inner_log.h"
 #include "log_builder.h"
 #include "sds.h"
+#include "baseFun.h"
 
 #ifndef _WIN32
 #include <sys/types.h>
@@ -52,21 +53,6 @@
 
 #endif
 
-#ifndef _WIN32
-
-#ifndef CLOCK_MONOTONIC_RAW
-#define CLOCK_MONOTONIC_RAW 4
-#endif
-
-uint32_t GetTickCount(void)
-{
-    uint32_t ticks = 0;
-    struct timespec ts;
-    if (!clock_gettime(CLOCK_MONOTONIC_RAW, &ts))
-        ticks = (ts.tv_sec * 1000) + (ts.tv_nsec / 1000000);
-    return ticks;
-}
-#endif // _WIN32
 
 
 static void _copy_config_string(const char* value, sds* src_value)
@@ -300,6 +286,7 @@ int log_persistent_manager_save_log(log_persistent_manager* manager, serialize_b
 {
     //unsigned long end_time;
     //unsigned long start_time = GetTickCount();
+    // it would not generate dirty logs
     int rst = db_insert_one(manager->db_manager, buf);
     //end_time = GetTickCount();
     //aos_debug_log((LB, "write db log cust %d", end_time - start_time));
@@ -469,6 +456,18 @@ static log_group_builder* log_persistent_manager_get_guard_log(log_persistent_ma
 }
 
 log_group_builder* log_persistent_manager_get_log(log_persistent_manager* manager) {
+    /*two way get log
+    (1) get log from db
+    (2) get log from dirty resend frame list
+    */
+
+    if (RvcLogSdkManager::getInstance().getResendFrameList().size() > 0)//already send all db logs, deal with dirty logs
+    {
+        log_group_builder* cur = RvcLogSdkManager::getInstance().getResendFrameList().front();
+        RvcLogSdkManager::getInstance().getResendFrameList().pop_front();
+        return cur;
+    }
+    
     unsigned long end_time;
     unsigned long start_time = GetTickCount();
     log_group_builder* builder = db_read_table_last_logs(manager->db_manager, manager->config->logCountPerPackage);
@@ -476,12 +475,16 @@ log_group_builder* log_persistent_manager_get_log(log_persistent_manager* manage
     //aos_debug_log((LB, "read db log cust %d", end_time - start_time));
     if (builder == NULL) {
         aos_error_log((LB, "get db log failed"));
+        
         //add for Guarder upload
         if (manager->config->enableGuarder) {
             return log_persistent_manager_get_guard_log(manager);
         }
     }
     return builder;
+
+
+    
 }
 
 
@@ -699,6 +702,7 @@ int log_persistent_manager_clean(log_persistent_manager* manager, char* modular)
         int count = db_get_count(manager->db_manager);
         if (count > manager->config->maxPersistentLogCount) {//超过最大值,然后清理 2*10000
             rst = db_delete_old_logs(manager->db_manager, count - manager->config->maxPersistentLogCount);
+            g_discardMsgNum_since_full += count - manager->config->maxPersistentLogCount;
         }
         db_vacuum(manager->db_manager);
         end_time = GetTickCount();
@@ -762,7 +766,6 @@ int log_persistent_manager_transaction_commit(log_persistent_manager* manager) {
     int rst = 1;
     unsigned long end_time;
     unsigned long start_time = GetTickCount();
-
     rst = db_transaction_commit(manager->db_manager);
     end_time = GetTickCount();
     aos_debug_log((LB, "commit db log cust %d", end_time - start_time));

+ 7 - 0
Framework/RvcLogSdk/log_producer_client.c → Framework/RvcLogSdk/log_producer_client.cpp

@@ -6,6 +6,7 @@
 #include <string.h>
 #include "log_persistent_manager.h"
 #include "log_multi_thread.h"
+#include "baseFun.h"
 
 static uint32_t s_init_flag = 0;
 static log_producer_result s_last_result = 0;
@@ -148,6 +149,7 @@ log_producer_result log_producer_client_add_log(log_producer_client* client,
     rst = log_producer_manager_add_log(manager, log, flush, record_time);
     //aos_debug_log((LB, "log producer client add log rst %d", rst));
     
+    RvcLogSdkManager::getInstance().m_logFlush_num++;
     return rst;
 }
 
@@ -175,4 +177,9 @@ log_producer_result log_producer_client_add_beidou_log(log_producer_client* clie
     //aos_debug_log((LB, "log producer client add beidou log rst %d", rst));
 
     return rst;
+}
+
+void log_producer_set_testLogMode()
+{
+    RvcLogSdkManager::getInstance().m_testLogMode = true;
 }

+ 2 - 0
Framework/RvcLogSdk/log_producer_client.h

@@ -67,6 +67,8 @@ LOG_EXPORT log_producer_result log_producer_client_add_log(log_producer_client*
  * */
 LOG_EXPORT log_producer_result log_producer_client_add_beidou_log(log_producer_client* client, beidou_log_item* log, int flush);
 
+LOG_EXPORT void log_producer_set_testLogMode();
+
 LOG_CPP_END
 
 #endif

+ 1 - 1
Framework/RvcLogSdk/log_producer_config.c

@@ -49,7 +49,7 @@ static void _set_default_producer_config(log_producer_config* pConfig)
     pConfig->usePersistent = 1;
     pConfig->openDB = 0;
     pConfig->maxPersistentLogCount = 5*10000;
-    pConfig->usePersistentEncrypt = 2;
+    pConfig->usePersistentEncrypt = 3;
 
     pConfig->useMemoryType = 0;
     pConfig->debugMode = 0;

+ 20 - 26
Framework/RvcLogSdk/log_producer_manager.c → Framework/RvcLogSdk/log_producer_manager.cpp

@@ -1,7 +1,8 @@
 #include "log_producer_manager.h"
-#include "inner_log.h"
 //#include "md5.h"
 #include "sds.h"
+#include "baseFun.h"
+#include "inner_log.h"
 
 // change from 100ms to 1000s, reduce wake up when app switch to back
 #define LOG_PRODUCER_FLUSH_INTERVAL_MS 100
@@ -17,17 +18,11 @@
 log_producer_manager* g_producer_manager[10];
 int producer_manager_num = 0;
 
-#ifdef WIN32
-DWORD WINAPI log_producer_send_thread(LPVOID param);
-#else
-void* log_producer_send_thread(void* param);
-#endif
 
 void _try_flush_loggroup(log_producer_manager* producer_manager)
 {
     int loggroup_size;
     int rst;
-    int32_t now_time = time(NULL);
 
     CS_ENTER(producer_manager->lock);
     if (producer_manager->builder != NULL)
@@ -281,14 +276,15 @@ void* log_producer_write_persistent_thread(void* param)
     int lens;
     int first_process = 1;
     int32_t now;
-    int32_t last_write_time = time(NULL);
+    int32_t last_write_time = (int32_t)time(NULL);
     shareq_frame share_frame = {0};
-    serialize_buf buf = { 0 };
+    serialize_buf buf;
+    memset(&buf, 0, sizeof(serialize_buf));
     int t_count = 0;
     int discardMsg = 0;
     log_producer_manager* producer_manager = (log_producer_manager*)param;
     log_persistent_manager* persistent_manager;
-    share_frame.data = &buf;
+    share_frame.data = reinterpret_cast<unsigned char *>(&buf);
     aos_info_log((LB, "start run write persistent thread"));
     while (producer_manager->shutdown == 0)
     {
@@ -357,13 +353,13 @@ void* log_producer_write_persistent_thread(void* param)
                     if (result != LOG_PRODUCER_OK) {
                         aos_warn_log((LB, "get from share queue, uuid %s begin failed.", buf.uuid));
                     }
-                    result = log_persistent_manager_save_log(persistent_manager, share_frame.data);
+                    result = log_persistent_manager_save_log(persistent_manager, (serialize_buf*)share_frame.data);
                     if (result != LOG_PRODUCER_OK) {
                         aos_warn_log((LB, "get from share queue, uuid %s save failed.", buf.uuid));
                     }
                 }
                 else {
-                    result = log_persistent_manager_save_log(persistent_manager, share_frame.data);
+                    result = log_persistent_manager_save_log(persistent_manager, (serialize_buf*)share_frame.data);
                     if (result != LOG_PRODUCER_OK) {
                         aos_warn_log((LB, "get from share queue, uuid %s save failed.", buf.uuid));
                     }
@@ -397,24 +393,24 @@ DWORD WINAPI log_producer_flush_thread(LPVOID param)    //flush the log to spshe
 void* log_producer_flush_thread(void* param)
 #endif
 {
-    while(1)
+    while(RvcLogSdkManager::getInstance().wait_for_counter_greater_than_one_with_timeout())
     {
         int i = 0;
 	    for(i =0; i < producer_manager_num; i++)
 	    {
             void* data = NULL;
             shareq_frame frame = { 0 };
-            serialize_buf buf = { 0 };
+            serialize_buf buf;
+            memset(&buf, 0, sizeof(serialize_buf));
             log_producer_manager* producer_manager = (log_producer_manager*)g_producer_manager[i];
             log_persistent_manager* persistent_manager;
-            frame.data = &buf;
+            frame.data = (unsigned char*)&buf;
             aos_info_log((LB, "start run flusher thread"));
 
             persistent_manager = producer_manager->persistent_manager;
             if (persistent_manager == NULL || producer_manager->shutdown == 1) {
                 continue;
             }
-
             do
             {
                 //get send data from buffer
@@ -424,7 +420,7 @@ void* log_producer_flush_thread(void* param)
                     int insert_result = 0;
                     log_group_builder* builder = (log_group_builder*)data;
                     memset(frame.data, 0, sizeof(serialize_buf));
-                    serialize_to_buf(&builder->grp->logs[0], frame.data);
+                    serialize_to_buf(&builder->grp->logs[0], (serialize_buf*)frame.data);// it would not cause dirty logs
                     frame.size = sizeof(serialize_buf);
                     CS_ENTER(persistent_manager->lock);
                     insert_result = ClibsharequeueInsert(producer_manager->share_queue, &frame, 0);
@@ -442,10 +438,7 @@ void* log_producer_flush_thread(void* param)
             // if no job, check now loggroup
             _try_flush_loggroup(producer_manager);
 	    }
-        Sleep(100);
     }
-
-    
     aos_info_log((LB, "exit flusher thread"));
     return 0;
 }
@@ -479,15 +472,17 @@ log_producer_manager* create_log_producer_manager(log_producer_config* producer_
         producer_manager->share_queue = ClibsharequeueCreate3("RVC_LOG_SDK_QUEUE", 1);
     }
     producer_manager->send_param_queue_size = base_queue_size * 2;
-    producer_manager->send_param_queue = malloc(sizeof(log_producer_send_param*) * producer_manager->send_param_queue_size);
+    producer_manager->send_param_queue = (log_producer_send_param**)malloc(sizeof(log_producer_send_param*) * producer_manager->send_param_queue_size);
 
     producer_manager->triger_cond = CreateCond();
     producer_manager->lock = CreateCriticalSection();
     producer_manager_num++;
 
+    
     if (!isFlushThreadExist)
     {
     	isFlushThreadExist = 1;
+        producer_manager->flush_thread = (THREAD*)malloc(sizeof(THREAD));
         THREAD_INIT(producer_manager->flush_thread, log_producer_flush_thread, NULL);//以当前情况,无法减少这个flush线程,因为是跟producer_config绑定的
     }
     
@@ -502,10 +497,9 @@ log_producer_manager* create_log_producer_manager(log_producer_config* producer_
             producer_manager->sender_data_queue = log_queue_create(base_queue_size * 2);
             threadId = 0;
             for (; threadId < producer_manager->producer_config->sendThreadCount; ++threadId)
-            {              
-               
-
-                THREAD_INIT(producer_manager->send_threads[threadId], log_producer_send_thread, producer_manager);
+            {
+                THREAD* cur_send = &producer_manager->send_threads[threadId];
+                THREAD_INIT(cur_send, log_producer_send_thread, producer_manager);
             }
             producer_manager->read_thread = (THREAD*)malloc(sizeof(THREAD));
             aos_debug_log((LB, "to create read thread"));
@@ -616,7 +610,7 @@ void destroy_log_producer_manager(log_producer_manager* manager)
         threadId = 0;
         for (; threadId < manager->producer_config->sendThreadCount; ++threadId)
         {
-            THREAD_JOIN(manager->send_threads[threadId]);
+            THREAD_JOIN(&(manager->send_threads[threadId]));
         }
         free(manager->send_threads);
         manager->send_threads = NULL;

+ 1 - 1
Framework/RvcLogSdk/log_producer_manager.h

@@ -24,7 +24,7 @@ typedef struct _log_producer_manager
     Clibsharequeue* share_queue;
     THREAD* send_threads;
     THREAD* read_thread;
-    THREAD flush_thread;
+    THREAD* flush_thread;
     THREAD* write_thread;
     CRITICALSECTION lock;
     COND triger_cond;

+ 39 - 4
Framework/RvcLogSdk/log_producer_sender.c → Framework/RvcLogSdk/log_producer_sender.cpp

@@ -6,6 +6,7 @@
 #include "sds.h"
 #include <stdlib.h>
 #include <string.h>
+#include "baseFun.h"
 #ifdef WIN32
 #include <windows.h>
 #else
@@ -13,7 +14,6 @@
 #include <sys/syscall.h>
 #endif
 
-long LOG_GET_TIME() { return time(NULL); }
 
 const char* LOGE_SERVER_BUSY = "ServerBusy";
 const char* LOGE_INTERNAL_SERVER_ERROR = "InternalServerError";
@@ -135,7 +135,7 @@ void * log_producer_send_thread(void * param)
 }
 void send_log_data(const char* url, const char* body)
 {
-    LOG_OS_TestLogPost(url, body);
+    RvcLogSdkManager::getInstance().LOG_OS_TestLogPost(url, body);
 }
 
 void * log_producer_send_fun(void * param)
@@ -146,7 +146,7 @@ void * log_producer_send_fun(void * param)
     log_producer_send_param * send_param = (log_producer_send_param *)param;
     if (send_param->magic_num != LOG_PRODUCER_SEND_MAGIC_NUM)   // magic num not right
     {
-        aos_fatal_log((LB, "invalid send param, magic num not found, num 0x%x", send_param->magic_num));
+        //aos_fatal_log((LB, "invalid send param, magic num not found, num 0x%x", send_param->magic_num));
         producer_manager = (log_producer_manager *)send_param->producer_manager;
         if (producer_manager && producer_manager->send_done_function != NULL)
         {
@@ -272,7 +272,42 @@ void * log_producer_send_fun(void * param)
                 break;
             }
             if(rst->statusCode == 300)
-                g_discardMsgNum_since_serverRet_RTI1002 += send_buf->n_logs;
+            {
+                /*
+                    (1) if multi logs,split and send one by one again, all give uuid LOG_SEND_ONE.
+                        - if uuid equal to LOG_SEND_ONE, don't not delete uuid from db
+                        - if uuid not equal to LOG_SEND_ONE, delete uuid from db
+                    (2) if single log, means dirty data, encrypt it and give uuid LOG_SEND_DIRTY.
+                        - record the nums of dirty logs
+
+                */
+                if(send_buf->n_logs == 1)//单条log, 已经尝试过重发,不再重发
+                {
+                    if(STR_LOG_SEND_DIRTY != send_buf->src_logs[0].uuid)
+                    {
+                        memcpy(send_buf->src_logs[0].uuid, STR_LOG_SEND_DIRTY, strlen(STR_LOG_SEND_DIRTY)+1);
+                        log_group_builder* builder = log_group_create(config);
+                        strcpy(builder->modular, send_buf->modular);
+                        add_log_raw2(builder, &(send_buf->src_logs[0]));
+                        RvcLogSdkManager::getInstance().getResendFrameList().push_back(builder);
+                        g_discardMsgNum_since_serverRet_RTI1002 += send_buf->n_logs;
+                    }
+                }
+                else
+                {
+                    //try resend, push to deque
+                    for(int i = 0; i < send_buf->n_logs; i++)
+                    {
+                        memcpy(send_buf->src_logs[i].uuid, STR_LOG_SEND_ONE, strlen(STR_LOG_SEND_ONE) + 1);
+                        log_group_builder* builder = log_group_create(config);
+                        strcpy(builder->modular, send_buf->modular);
+                        add_log_raw2(builder, &(send_buf->src_logs[i]));
+                        RvcLogSdkManager::getInstance().getResendFrameList().push_back(builder);
+                    }
+                    
+                }
+            }
+                
         }
 
         sleepMs = log_producer_on_send_done(send_param, rst, &error_info) / 2;//执行senddone,删除数据库中内容

+ 0 - 0
Framework/RvcLogSdk/log_queue.c → Framework/RvcLogSdk/log_queue.cpp


+ 3 - 0
Framework/spbase/SpEntityPrivilege.cpp

@@ -59,7 +59,10 @@ static ErrorCodeEnum ControlEntity(
 	sp_env_t *env = sp_get_env();
 	sp_entity_t *ent = sp_mod_mgr_find_entity_by_name(env->mod_mgr, pszEntityName);
 	if (!ent)
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("mod %s not exist", pszEntityName);
 		return Error_NotExist;
+	}
 
 	iobuffer_t *req_pkt = iobuffer_create(-1, -1);
 	int v 	= ent->cfg->idx;

+ 201 - 0
Framework/spbase/StartUpBase.cpp

@@ -0,0 +1,201 @@
+#include "precompile.h"
+#include "StartUpBase.h"
+#include <json/json.h>
+#include <winpr/sysinfo.h>
+#include <string>
+#include <vector>
+#include <map>
+#include "log_define.h"
+#include <SpBase.h>
+
+class StartupLog {
+public:
+    struct Step {
+        std::string timestamp;
+        std::string event;
+        std::string status;
+        int from;
+        int to;
+        int result;
+
+        Step(const std::string& ts, const std::string& ev, const std::string t_status, int t_from, int t_to, int t_result)
+            : timestamp(ts), event(ev), status(t_status), from(t_from), to(t_to), result(t_result) {}
+    };
+
+    StartupLog();
+    StartupLog(const std::string& module_entity, int req_id = -1);
+    ~StartupLog();
+
+    void initialize(int req_id, const std::string& module_entity);
+    void addStep(const Step& step);
+    std::string toJSON() const;
+
+private:
+    int request_id;
+    std::string module_entity_;
+    std::vector<Step> steps_;
+};
+
+class StartupLogManager {
+public:
+
+    static StartupLogManager& getInstance();
+    //StartupLogManager::getInstance().addLog(entityName, entity_id);
+    void addLog(const std::string& module_entity, int idx); // 新增 addLog 方法
+    bool checkLogExist(int idx);
+    StartupLog& getLog(int idx);
+    /*
+    StartupLogManager::getInstance().addStep(entityName, { GetCurrentTimeStr(), "handle_req" });
+
+    */
+    void addStep(int idx, const StartupLog::Step& step);
+    void removeLog(int idx);
+
+private:
+    StartupLogManager();
+    ~StartupLogManager();
+    std::map<int, StartupLog> logs_;
+};
+
+std::string GetCurrentTimeStr();
+
+SPBASE_API int addStartupLog(const char* module_entity, int idx)
+{
+    StartupLogManager::getInstance().addLog(module_entity, idx);
+    return 0;
+}
+
+SPBASE_API int addStartupStep(int idx, const char* event, const char* status, int from, int to, int result)
+{
+    StartupLogManager::getInstance().addStep(idx, StartupLog::Step(GetCurrentTimeStr(), std::string(event), std::string(status), from, to, result));
+
+    return 0;
+}
+
+
+
+
+std::string GetCurrentTimeStr()
+{
+    char unitedNowTime[30] = "";
+    SYSTEMTIME st;
+    FILETIME utc_ft, local_ft, ft;
+
+#ifdef _WIN32
+
+    GetSystemTime(&st);
+    SystemTimeToFileTime(&st, &ft);
+    utc_ft.dwLowDateTime = (DWORD)ft.dwLowDateTime;
+    utc_ft.dwHighDateTime = (DWORD)ft.dwHighDateTime;
+    FileTimeToLocalFileTime(&utc_ft, &local_ft);
+    FileTimeToSystemTime(&local_ft, &st);
+#else
+    GetLocalTime(&st);
+#endif // _WIN32
+
+    sprintf(unitedNowTime, "%02d:%02d:%02d.%03d",
+        st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
+    return std::string(unitedNowTime);
+}
+
+
+StartupLog::StartupLog() : request_id(0) {}
+
+StartupLog::~StartupLog() {}
+
+void StartupLog::initialize(int req_id, const std::string& module_entity) {
+    request_id = req_id;
+    module_entity_ = module_entity;
+}
+
+StartupLog::StartupLog(const std::string& module_entity, int req_id)
+{
+    module_entity_ = module_entity;
+    request_id = req_id;
+}
+
+void StartupLog::addStep(const Step& step) {
+    steps_.push_back(step);
+}
+
+std::string StartupLog::toJSON() const {
+    Json::Value root;
+    root["event"] = "entity_startup";
+    root["request_id"] = request_id;
+    root["module_entity"] = module_entity_;
+
+    Json::Value steps_array(Json::arrayValue);
+    for (const auto& step : steps_) {
+        Json::Value step_obj;
+        step_obj["timestamp"] = step.timestamp;
+        step_obj["event"] = step.event;
+
+        if (!step.status.empty()) {
+            step_obj["status"] = step.status;
+        }
+        if (step.from != 0 && step.to != 0) {
+            step_obj["from"] = step.from;
+            step_obj["to"] = step.to;
+        }
+        if (step.result != 0) {
+            step_obj["result"] = step.result;
+        }
+
+        steps_array.append(step_obj);
+    }
+    root["steps"] = steps_array;
+
+    Json::FastWriter writer;
+    std::string jsonReq = writer.write(root);
+    return jsonReq;
+}
+
+StartupLogManager::StartupLogManager() {}
+
+StartupLogManager::~StartupLogManager() {}
+
+void StartupLogManager::addLog(const std::string& module_entity, int idx) {
+    if (logs_.find(idx) == logs_.end()) {
+        logs_[idx] = StartupLog(module_entity, idx); // 直接拷贝 log 对象
+    } // 如果已存在,则忽略
+}
+
+StartupLog& StartupLogManager::getLog(int idx) {
+    if (logs_.find(idx) == logs_.end()) {
+        logs_[idx] = StartupLog("", idx); // 仍然保留隐式创建的逻辑,方便使用
+    }
+    return logs_[idx];
+}
+
+bool StartupLogManager::checkLogExist(int idx)
+{
+    if (logs_.find(idx) == logs_.end())
+        return false;
+    else
+        return true;
+}
+
+void StartupLogManager::addStep(int idx, const StartupLog::Step& step) {
+    if (checkLogExist(idx))
+    {
+        StartupLog &current = getLog(idx);
+        current.addStep(step);
+        if (step.result != 0 || step.status == "startup_end")
+        {//print the logs and remove obj
+            std::string resultMsg = current.toJSON();
+            DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(resultMsg.c_str());
+            removeLog(idx);
+        }
+    }
+}
+
+void StartupLogManager::removeLog(int idx)
+{
+    if (logs_.find(idx) == logs_.end())
+        logs_.erase(idx);
+}
+
+StartupLogManager& StartupLogManager::getInstance() {
+    static StartupLogManager instance;
+    return instance;
+}

+ 17 - 0
Framework/spbase/StartUpBase.h

@@ -0,0 +1,17 @@
+#ifndef STARTUP_LOG_H
+#define STARTUP_LOG_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+	SPBASE_API int addStartupLog(const char* module_entity, int idx);
+	SPBASE_API int addStartupStep(int idx, const char* event, const char* status, int from, int to, int result);
+
+#ifdef __cplusplus
+} // extern "C" {
+#endif
+
+
+#endif

+ 2 - 1
Framework/spbase/sp_bcm.c

@@ -17,6 +17,7 @@
 #include "dbgutil.h"
 #include <winpr/synch.h>
 #include <winpr/string.h>
+#include "StartUpBase.h"
 
 #define BCM_CMD_MSG			0x01
 #define BCM_CMD_SUBSCRIBE	0x02
@@ -339,7 +340,7 @@ static int daemon_on_pkt(sp_svc_t *svc,int epid, int svc_id, int pkt_type, int p
 			}
 			daemon_unlock(daemon);
 			if (found == 0 && (target_ent->state == EntityState_Idle || target_ent->state == EntityState_Busy)) {
-				DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "notify_redirect_subscribe! target:%s", target_ent->cfg->name);
+				addStartupStep(target_ent->cfg->idx, "redirect_subscribe", "startup_end", 0, 0, 0);
 				sp_mod_mgr_notify_redirect_subscribe(sp_get_env()->mod_mgr, target_ent, &uid, svc_id, param);
 			}
 			FREE(param);

+ 8 - 12
Framework/spbase/sp_logwithlink.cpp

@@ -125,18 +125,10 @@ public:
         TraceID = ResultMsg = LogCode = API = BussID = TipMsg = SourceType = VtmCode = "";
         logProducer = NULL;
     }
-    /** 这里先采用硬编码,控制日志等级 [Gifur@202268]*/
-#if defined(_MSC_VER)
     bool IsAllowToRecord()
     {
         return true;
     }
-#else
-	bool IsAllowToRecord()
-	{
-		return (this->Level >= LOG_LEVEL_INFO);
-	}
-#endif //_MSC_VER
 };
 
 /*北斗链路实例
@@ -651,13 +643,12 @@ SPBASE_API void* create_log_producer_storage(CSimpleStringA entityName, CSimpleS
     log_producer_config_set_skyeye_version(config, (char*)"1.0");
     log_producer_config_set_persistent(config, 1);
 
-#ifndef _WIN32
+
     sp_env_t* env = sp_get_env();
     if (env && env->cfg && env->cfg->args && env->cfg->args->debug_mode) {
         //log_producer_config_switch_debug_mode(config, 1);
         log_producer_config_set_persistent_encrypt(config, 0);
     }
-#endif
 
     log_producer_config_set_skyeye_entityname(config, (char*)t_entityName.c_str());
     g_entityName = t_entityName.c_str();
@@ -746,13 +737,13 @@ SPBASE_API void* create_log_producer_send(CSimpleStringA endpoint, CSimpleString
     log_producer_config_set_persistent(config, 1);
     log_producer_config_set_openDb(config, 1);
     log_producer_config_set_tokenCallBack(config, Log_GetToken);
-#ifndef _WIN32
+
+
     sp_env_t* env = sp_get_env();
     if (env && env->cfg && env->cfg->args && env->cfg->args->debug_mode) {
         //log_producer_config_switch_debug_mode(config, 1);
         log_producer_config_set_persistent_encrypt(config, 0);
     }
-#endif
 
 
     log_producer_config_set_skyeye_entityname(config, (char*)g_entityName.GetData());
@@ -837,6 +828,11 @@ SPBASE_API void setReduceSpbaseLog(int isNor)
     g_spbaseLogNor = isNor;
 }
 
+SPBASE_API void setTestLogMode()
+{
+    log_producer_set_testLogMode();
+}
+
 int changeDbtoNew()
 {
     char tmp[MAX_PATH];

+ 36 - 31
Framework/spbase/sp_mod.c

@@ -35,6 +35,7 @@
 #define TAG SPBASE_TAG("sp_mod")
 
 #include "toolkit.h"
+#include "StartUpBase.h"
 
 #define BUFSIZE 10240
 #define MOD_CMD_INIT		0
@@ -891,11 +892,11 @@ static int create_module_process(const char *mod_name, int epid, int range, int
 		if (NULL != groupProcess)
 			break;//already exist
 
-		DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "open group process, %s", mod_name);
+		addStartupStep(epid, "open group process", "", 0, 0, 0);
 		dwSessionId = WTSGetActiveConsoleSessionId();
 
 		if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hThisToken)) {
-			DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "open process token failed! Error : %d", GetLastError());
+			addStartupStep(epid, "open process token", "failed", 0, 0, GetLastError());
 			break;
 		}
 
@@ -918,7 +919,7 @@ static int create_module_process(const char *mod_name, int epid, int range, int
 		hMutex = CreateEvent(NULL, FALSE, FALSE, eventName);
 
 		if (!CreateProcessAsUserA(hUserTokenDup, NULL, app, NULL, NULL, FALSE, 0, pEnv, NULL, &si, &pi)) {
-			DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "CreateProcessAsUserA failed! Error : %d", GetLastError());
+			addStartupStep(epid, "CreateProcessAsUserA failed!", "failed", 0, 0, GetLastError());
 			break;
 		}
 
@@ -936,25 +937,27 @@ static int create_module_process(const char *mod_name, int epid, int range, int
 		assigntoJob(hProcess, pi.dwProcessId);
 
 		if (WAIT_TIMEOUT == WaitForSingleObject(hMutex, 10000))//确定实体进程已启动
-			DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "open process timeout, %s", mod_name);
+			addStartupStep(epid, "open process timeout", "failed", 0, 0, Error_TimeOut);
 		CloseHandle(hMutex);
 
 	} while (0);
 	CloseHandle(hUserTokenDup);
 	CloseHandle(hThisToken);
 
-	DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "begin start mod by pipe, %s", mod_name);
+	addStartupStep(entity_id, "start_mod", "", 0, 0, 0);
 	//通过管道通知进程创建实体线程
 	if (NULL != (groupProcess = findGroupProcessInfo(group, mod_name)) && 0 == startModByPipe(groupProcess, writeParam)) {
 		char dstParam[10][MAX_PATH];
 		int paramNum = 0;
 		ZeroMemory(dstParam, sizeof(dstParam));
-		DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "query mod by pipe, %s", mod_name);
+		addStartupStep(entity_id, "query_mod", "", 0, 0, 0);
 		if (-1 != (paramNum = queryModByPipe(groupProcess, mod_name, dstParam)))		//return paramNum
 		{
+			char processId[20];
 			HANDLE processMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, dstParam[2]);
 			new_process->pid = (int)groupProcess->pid;
-			DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "return processId %d", new_process->pid);
+			sprintf(processId, "%d", new_process->pid);
+			addStartupStep(entity_id, "open_process_id", processId, 0, 0, 0);
 			return 0;
 		}
 	}
@@ -1021,7 +1024,7 @@ static void mgr_on_entity_state(sp_mod_mgr_t *mgr, sp_entity_t *entity, int trig
 	mgr_bcast_entity_state_event(mgr, entity, SP_PKT_MOD|MOD_CMD_RECORD_STATE_EVENT, pkt);
 	iobuffer_dec_ref(pkt);
 
-	DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "entity %s change state from %d to %d", entity->cfg->name, last_state, curr_state);
+	addStartupStep(entity->cfg->idx, "state_change", "", last_state, curr_state, 0);
 
 	// gui显示实体状态变化
 	env = sp_get_env();
@@ -1463,7 +1466,7 @@ int sp_mod_mgr_add_module(sp_mod_mgr_t *mgr, sp_cfg_shell_module_t *cfg_mod)
 		list_add_tail(&mod->entry, &mgr->mod_list);
 		ARRAY_IDX(mgr->arr_mod, cfg_mod->idx, sp_mod_t*) = mod;
 	} else {
-		DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "module %s already exist!", cfg_mod->name);
+		//DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "module %s already exist!", cfg_mod->name);
 		//return Error_Duplication;
 	}
 
@@ -1694,7 +1697,7 @@ sp_entity_t *sp_mod_mgr_find_entity_by_name(sp_mod_mgr_t *mgr, const char *entit
 
 sp_entity_t *sp_mod_mgr_find_entity_by_idx(sp_mod_mgr_t *mgr, int entity_id)
 {
-	if (entity_id == -1 || entity_id >= mgr->arr_ent->nelts)
+	if (entity_id == -1 || entity_id > mgr->arr_ent->nelts)
 		return NULL;
 
 	return ARRAY_IDX(mgr->arr_ent, entity_id, sp_entity_t*);
@@ -1775,8 +1778,7 @@ static int load_module(sp_mod_mgr_t *mgr, sp_mod_t *mod, int trigger_entity_id,
 {
 	int rc = 0;
 	sp_env_t *env = sp_get_env();
-
-	DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "begin load module %s", mod->cfg->name);
+	addStartupStep(mod->cfg->idx, "begin_load", "", 0, 0, 0);
 
 #ifdef _WIN32
 	sp_mod_mgr_lockEx(mod->cfg->idx);
@@ -1789,7 +1791,9 @@ static int load_module(sp_mod_mgr_t *mgr, sp_mod_t *mod, int trigger_entity_id,
 			DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "sp_mod_mgr_load_module %s failed! create module process failed", mod->cfg->name);
 			rc = Error_Unexpect;
 		} else {
-			DbgWithLinkForC(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM, "create module process succ, pid: %d", mod->process.pid);
+			char pidBuffer[20] = "";
+			_itoa(mod->process.pid, pidBuffer, sizeof(pidBuffer));
+			addStartupStep(entity_id, "create module process succ", pidBuffer, 0, 0, 0);
 		}
 	} else {
 		rc = Error_Duplication;
@@ -1817,18 +1821,18 @@ static int load_module(sp_mod_mgr_t *mgr, sp_mod_t *mod, int trigger_entity_id,
 					DWORD dwRet;
 					dwRet = WaitForSingleObject(mod->process.handle, (DWORD)interval);	//wait for entity thread end
 					if (dwRet == WAIT_OBJECT_0) {
-						DbgWithLinkForC(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM, "detect %s's process exit exception!", mod->cfg->name);
+						addStartupStep(mod->cfg->idx, "mod_online", "process exit exception!", 0, 0, Error_Exception);
 						rc = Error_Exception;
 						break;
 					}
 				} else {
-					DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "mod is online now!, %s", mod->cfg->name);
+					addStartupStep(mod->cfg->idx, "mod_online", "", 0, 0, 0);
 					break;
 				}
 			} 
 			else 
 			{
-				DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "get epid state failed!");
+				addStartupStep(mod->cfg->idx, "mod_online", "get epid state failed!", 0, 0, Error_Exception);
 				break;
 			}
 		}
@@ -1836,9 +1840,9 @@ static int load_module(sp_mod_mgr_t *mgr, sp_mod_t *mod, int trigger_entity_id,
 		if (rc == 0)
 			rc = sp_svc_send(mgr->shell_svc, mod->cfg->idx, SP_INVALID_SVC_ID, SP_PKT_MOD|MOD_CMD_INIT, 0, NULL);
 		if (rc) {
-			DbgWithLinkForC(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM, "send out mod init cmd to %s(%d) failed: %s", mod->cfg->name, mod->cfg->idx, sp_strerror(rc));
+			addStartupStep(mod->cfg->idx, "send_init", "failed", 0, 0, rc);
 		} else {
-			DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "send out mod init cmd ok!, %s", mod->cfg->name);
+			addStartupStep(mod->cfg->idx, "send_init", "", 0, 0, 0);
 			for (i = 0; i < tries; ++i) {
 #ifdef _WIN32
 				HANDLE hs[] = { mod->evt_wait_handle, mod->process.handle };	//wait for entity thread end
@@ -1853,21 +1857,22 @@ static int load_module(sp_mod_mgr_t *mgr, sp_mod_t *mod, int trigger_entity_id,
 				}
 #endif //_WIN32
 				if (dwRet == WAIT_OBJECT_0) {
-					DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "receive reply from module %s ok!", mod->cfg->name);
+					addStartupStep(mod->cfg->idx, "entity_reply", "", 0, 0, 0);
 					rc = mod->wait_result;
 					if (rc != 0) {
-						DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "receive reply from module %s ok! but wait rc: %s", mod->cfg->name, sp_strerror(rc));
+						addStartupStep(mod->cfg->idx, "entity_reply", "failed", 0, 0, rc);
 					}
 					break;
 				} else if (dwRet == WAIT_OBJECT_0+1) {
-					DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "detect %s's process exit exception!", mod->cfg->name);
+					addStartupStep(mod->cfg->idx, "entity_reply", "process end", 0, 0, Error_Exception);
 					rc = Error_Exception;
 					break;
 				} else if(dwRet == WAIT_TIMEOUT) {
+					addStartupStep(mod->cfg->idx, "entity_reply", "timeout", 0, 0, Error_TimeOut);
 					rc = Error_TimeOut;
 				}
 				else {
-					DbgWithLinkForC(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM, "wait for multi object failed!! err=%d", GetLastError());
+					addStartupStep(mod->cfg->idx, "entity_reply", "multi obj", 0, 0, Error_Unexpect);
 					rc = Error_Unexpect;
 					break;
 				}
@@ -2084,7 +2089,7 @@ static int start_entity(sp_mod_mgr_t *mgr, sp_entity_t *ent, const char *cmdline
 	int rc = 0;
 	sp_mod_t *mod = ent->mod;
 
-	DbgWithLinkForC(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM, "begin start entity %s", ent->cfg->name);
+	addStartupLog(mod->cfg->name, mod->cfg->idx);
 	
 #ifdef _WIN32
 	sp_mod_mgr_lockEx(mod->cfg->idx);
@@ -2101,7 +2106,7 @@ static int start_entity(sp_mod_mgr_t *mgr, sp_entity_t *ent, const char *cmdline
 			rc = sp_svc_send(mgr->shell_svc, mod->cfg->idx, ent->cfg->idx, SP_PKT_MOD|MOD_CMD_START, ent->cfg->idx, &pkt);
 			if (rc == 0) {
 				int last_state = ent->state;
-				DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "start entity %s, send cmd start ok!", ent->cfg->name);
+				addStartupStep(mod->cfg->idx, "send_start", "", 0, 0, 0);
 				ent->state_start_time = y2k_time_now();
 				if (ent->first_start_time == 0)
 					ent->first_start_time = ent->state_start_time;
@@ -2109,16 +2114,16 @@ static int start_entity(sp_mod_mgr_t *mgr, sp_entity_t *ent, const char *cmdline
 				ent->state = EntityState_Starting;
 				mgr_on_entity_state(mgr, ent, trigger_entity_id, last_state, ent->state);
 			} else {
-				DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "start entity %s, send cmd start failed!", ent->cfg->name);
+				addStartupStep(mod->cfg->idx, "send_start", "failed", 0, 0, Error_Unexpect);
 			}
 			if (pkt)
 				iobuffer_dec_ref(pkt);
 		} else {
 			rc = Error_InvalidState;
-			DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "%s: entity %s state is not correct! current state: %d", __FUNCTION__, ent->cfg->name, (int)ent->state);
+			addStartupStep(mod->cfg->idx, "send_start", "state is not correct", 0, 0, Error_InvalidState);
 		}
 	} else {
-		DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "entity's %s 's module is not load!", ent->cfg->name);
+		addStartupStep(mod->cfg->idx, "send_start", "module is not load", 0, 0, Error_InvalidState);
 		rc = Error_InvalidState;
 	}
 #ifdef _WIN32
@@ -2132,16 +2137,16 @@ static int start_entity(sp_mod_mgr_t *mgr, sp_entity_t *ent, const char *cmdline
 		HANDLE hs[] = {mod->evt_app_exit, ent->evt_wait_handle};
 		DWORD dwRet = WaitForMultipleObjects(array_size(hs), &hs[0], FALSE, PROCESS_TIMEOUT);
 		if (dwRet == WAIT_OBJECT_0) {
-			DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "wait for start entity %s result, app exit!", ent->cfg->name);
+			addStartupStep(mod->cfg->idx, "wait_result", "app exit", 0, 0, Error_Unexpect);
 			rc = Error_Unexpect;
 		} else if (dwRet == WAIT_OBJECT_0+1) {
-			DbgWithLinkForC(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM, "wait for start entity %s result ok, result = %d!", ent->cfg->name, ent->wait_result);
+			addStartupStep(mod->cfg->idx, "wait_result", "", 0, 0, 0);
 			rc = ent->wait_result;
 			if (rc != 0) {
-                DbgWithLinkForC(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM, "wait for starting entity %s and turned out result: %s!", ent->cfg->name, sp_strerror(ent->wait_result));
+				addStartupStep(mod->cfg->idx, "wait_result", "turned out result", 0, 0, ent->wait_result);
 			}
 		} else {
-			DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "wait for start entity %s timeout!", ent->cfg->name);
+			addStartupStep(mod->cfg->idx, "wait_result", "timeout", 0, 0, Error_TimeOut);
 			rc = Error_TimeOut;
 		}
 

+ 17 - 0
Framework/spshell/SpShellBase.h

@@ -0,0 +1,17 @@
+#ifndef STARTUP_LOG_H
+#define STARTUP_LOG_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+	int addStartupLog(const char* module_entity, int idx);
+	int addStartupStep(const char* module_entity, const char* event, const char* status, int from, int to, int result);
+
+#ifdef __cplusplus
+} // extern "C" {
+#endif
+
+
+#endif

+ 10 - 4
Framework/spshell/svc.cpp

@@ -26,6 +26,7 @@
 #include <winpr/sysinfo.h>
 #include <winpr/environment.h>
 #include <iniutil.h>
+#include "StartUpBase.h"
 
 static void shutdown_app(void* arg)
 {
@@ -699,8 +700,13 @@ iobuffer_t *on_entity_start(sp_rpc_server_t *server, int epid, int svc_id, int r
 	iobuffer_t *ans_pkt = NULL;
 
 	iobuffer_read(*req_pkt, IOBUF_T_I4, &entity_id, NULL);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("handle start entity req: %d", entity_id);
-
+	sp_entity_t* ent;
+	ent = sp_mod_mgr_find_entity_by_idx(env->mod_mgr, entity_id);
+	std::string entityName;
+	if (ent)
+		entityName = ent->mod->cfg->name;
+	addStartupLog(entityName.c_str(), entity_id);
+	addStartupStep(entity_id, "handle_req", "", 0, 0, 0);
 	iobuffer_format_read(*req_pkt, "s", &cmdline);
 	result = sp_mod_mgr_start_entity(env->mod_mgr, entity_id, cmdline, svc_id);
 	FREE(cmdline);
@@ -988,11 +994,11 @@ iobuffer_t* on_try_upload_logs_info(sp_rpc_server_t* server, int epid, int svc_i
 	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_discard_full, 0);
 	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_discard_RTI1002, 0);
 	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_curLogNum, 0);
-	
+	/*
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("checkUrlActive::GetSendLogInfo, TS_Suc:%d, TU_Suc:%d, BS_Suc:%d, BU_Suc:%d, beidou_Suc:%d, TS_Err:%d, TU_Err:%d, BS_Err:%d, BU_Err:%d, beidou_Err:%d, discard_forFull:%d, discard_forRTI1002:%d, curNum:%d"
 		, t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc,
 		t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err
 		, t_discard_full, t_discard_RTI1002, curLogNum);
-
+	*/
 	return ans_pkt;
 }

+ 0 - 2
Module/include/DevEntityCommBase.hpp

@@ -220,8 +220,6 @@ inline ErrorCodeEnum CDevAdptEntityBase::ExtractVendorLibFullPath(CSimpleStringA
 
 inline void CDevAdptEntityBase::InitializeVendorLogSwitch()
 {
-	LOG_FUNCTION();
-
 	if (!vendorLibInfo.IsValid()) {
 		ExtractVendorLibName();
 	}

+ 67 - 149
Module/include/DevFSMCommBase.hpp

@@ -44,51 +44,6 @@ do {\
 #define HARDWARE_ENTITY_MAKE_ERRORCODE_TO_BUSINESS(ec)	\
 	MAKE_SLV_ERRORCODE_TO_BUSINESS(ec.dwEntityId, ec.dwVendorErroCode, ec.dwReserved)
 
-/*class object must have 'LogErrMsg' function.*/
-#define LOG_ERROR_MSG_MACRO(errCode, MethodSig, DeviceType)\
-	do {\
-		if(errCode != Error_Succeed) {\
-			LogErrMsg(CSimpleStringA::Format("%s::%s at line:%d", __FUNCTION__, #MethodSig, __LINE__), \
-			errCode, MEC_DEVAPI_##DeviceType##_(MethodSig), TRUE);\
-	}\
-	} while (false)
-
-#define LOG_CARDISSUER_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, CARDISSUER)
-
-#define LOG_THERMALPRINT_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, THERMALPRINT)
-
-#define LOG_DEVCONTROL_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, DEVCONTROL)
-
-#define LOG_PRINTSEAL_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, PRINTSEAL)
-
-#define LOG_FINGERPRINT_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, FINGERPRINT)
-
-#define LOG_HSPSCANNER_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, HSPSCANNER)
-
-#define LOG_UPS_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, UPS)
-
-#define LOG_GPIO_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, GPIO)
-
-#define LOG_IDCER_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, IDCER)
-
-#define LOG_RF_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, RF)
-
-#define LOG_PINPAD_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, EPP)
-
-#define LOG_WATCHDOG_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, WATCHDOG)
-
 enum PageType
 {
 	PageType_Init,
@@ -609,17 +564,7 @@ struct AdapterInfo : public AdaptorInfo
 	}
 };
 
-struct ErrorPackage {
-
-	CSimpleStringA msgHead;
-	///*TODO(80374374@3/31/2023): to apply, replace the one defined at entity scope with it */
-	CSimpleStringA devSN;
-	ErrorCodeEnum devErrCode;
-	DWORD apiErrCode;
-
-	ErrorPackage() :msgHead(true), devSN(true), devErrCode(Error_Succeed), apiErrCode(0) {}
-};
-struct ErrorPackageEx {//or another name? or replace ErrorPackage ?
+struct ErrorPackageEx {
 
 	ErrorCodeEnum errCode;
 	DWORD apiUserCode;
@@ -651,21 +596,12 @@ struct DevEntityErrorCode {
 		dwVendorErroCode = devErrorCode;
 		dwReserved = dwReservedCode;
 	}
-	/*no used now!!*/
-	void SetVendorID(DWORD dwVendorID)
-	{
-		dwVendorId = dwVendorID;
-	}
 
 	DWORD GetCompleteErrorCode() const 
 	{
 		return MAKE_SLV_ERRORCODE(dwEntityId, dwVendorId, dwVendorErroCode);
 	}
 
-	DWORD GetCompleteErrorCode2Business() const 
-	{
-		return MAKE_SLV_ERRORCODE_TO_BUSINESS(dwEntityId, dwVendorErroCode, dwReserved);
-	}
 
 };
 
@@ -674,7 +610,7 @@ class CCommDevFSM : public FSMImpl<TFSM>
 {
 
 public:
-	CCommDevFSM() :m_FirstStart(TRUE), m_iInWhatPage(PageType_Init),m_bOpened(false), m_bOpening(true), m_csAlarmMsg("No more information"), m_contiErrTimes(0)
+	CCommDevFSM() :m_FirstStart(TRUE), m_iInWhatPage(PageType_Init),m_bOpened(false), m_bOpening(true), m_eDevState(DEVICE_STATUS_NOT_READY),m_contiErrTimes(0)
 	{
 		m_WarnCodeMap.insert(std::make_pair<std::string, DWORD>("CardIssuerStand", 0x2030021f));
 		m_WarnCodeMap.insert(std::make_pair<std::string, DWORD>("CardIssuerStore", 0x2200021f));
@@ -699,25 +635,6 @@ public:
 	ErrorCodeEnum GetAndSplitDevErrInfo(
 		CSimpleStringA& csErrMsg, WORD& wdDevErrCode, LPCTSTR lpszFuncNameForDisplay = "");
 
-	ErrorCodeEnum LogDevErrInfo(LPCTSTR lpszFuncName = "")
-	{
-		CSimpleStringA csMsg;
-		WORD wdErrorCode = 0;
-		return GetAndSplitDevErrInfo(csMsg, wdErrorCode, lpszFuncName);
-	}
-	bool GetDevErrorCode(WORD& wdErrorCode)
-	{
-		CSimpleStringA csMsg;
-		ErrorCodeEnum eRet = GetAndSplitDevErrInfo(csMsg, wdErrorCode);
-		return (eRet == Error_Succeed);
-	}
-	void SetErrPackage(CSimpleStringA msgHead, CSimpleStringA devSN, ErrorCodeEnum errCode, DWORD apiCode)
-	{
-		m_errPkg.msgHead = msgHead;
-		m_errPkg.devSN = devSN;
-		m_errPkg.devErrCode = errCode;
-		m_errPkg.apiErrCode = apiCode;
-	}
 
 	DWORD SetErrorAndLog(ErrorCodeEnum errCode, DWORD userCode, CSimpleStringA devApi, CSimpleStringA funPath, bool bInBusiness = false, int costTime = 0, CSimpleStringA logCode = "", CSimpleStringA context = "")
 	{
@@ -801,6 +718,7 @@ public:
 		ErrorCodeEnum rc = m_hDevHelper.LoadUp(customDllPath.IsNullOrEmpty() ? m_adapterInfo.adapterFilePath : customDllPath);
 		return rc;
 	}
+
 	/*fulfill adapter elem, open param and adapter file name&absolute path */
 	void FulfillAdapterInfoFrom(const VendorLibInfo& vendorLib)
 	{
@@ -1051,6 +969,7 @@ public:
 		m_contiErrTimes = 0;
 	}
 
+	/** TODO等待废弃,不建议再继续使用  [Gifur@2025114]*/
 	ErrorCodeEnum TransECWithRepeat(const ErrorCodeEnum& ec)
 	{
 		ErrorCodeEnum result(ec);
@@ -1091,7 +1010,46 @@ public:
 		return result;
  	}
 
-	virtual void SetInWhatPage(int iPageType) { m_iInWhatPage = iPageType; }
+	virtual void SetDevInitFlag(bool val = true) {
+		m_bOpened = val; 
+	}
+
+	bool GetDevInitFlag() const { 
+		return m_bOpened; 
+	}
+
+	virtual void SetDevInitingFlag(bool val = true) { 
+		m_bOpening = val; 
+	}
+	bool GetDevInitingFlag() const { 
+		return m_bOpening; 
+	}
+
+	virtual void SetInWhatPage(int iPageType) { 
+		m_iInWhatPage = iPageType; 
+	}
+
+	void OnUIState4SetWhatPage(const char* pcszValue) {
+		if (pcszValue != NULL && strlen(pcszValue) > 0) {
+			//增加页面位置判断
+			if (_strnicmp(pcszValue, "M", strlen("M")) == 0) {
+				SetInWhatPage(PageType_MainPage);
+			}
+			else if (_strnicmp(pcszValue, "U", strlen("U")) == 0) {
+				SetInWhatPage(PageType_UserDesktop);
+			}
+			else {
+				SetInWhatPage(PageType_Other);
+			}
+		}
+	}
+
+	virtual DevStateEnum GetDevState() const { 
+		return m_eDevState; 
+	}
+	void SetDevState(DevStateEnum val) { 
+		m_eDevState = val; 
+	}
 
 public:
 
@@ -1105,11 +1063,10 @@ protected:
 	BOOL m_FirstStart;
 	int m_iInWhatPage/*在哪个页面,区分首页,用户桌面,其他页*/;
 
-	ErrorPackage m_errPkg;
 	ErrorPackageEx m_errPkgEx;
-	CSimpleStringA m_csAlarmMsg;
 	unsigned int m_contiErrTimes;
 	AdapterInfo m_adapterInfo;
+	DevStateEnum m_eDevState;
 
 	void UpdateEntityIDIfZero()
 	{
@@ -1163,25 +1120,9 @@ protected:
 		return dwCode;
 	}
 
-	DWORD AlarmDECToBusiness(DWORD dwVal = 0) 
-	{
-		if (dwVal > 0) {
-			UpdateDEC(dwVal);
-		}
-
-		//oilyang@20200528 according the meeting result,throw a LogError while answering ctx
-		//oilyang@20200525 if have been set ErrorCode of entity defined (not device),use it directly
-		const DWORD dwCode = IsEntityIDSettle(m_entCode.dwVendorErroCode) 
-			? m_entCode.dwVendorErroCode : m_entCode.GetCompleteErrorCode2Business();
-		///**TODO(Gifur@9/10/2021):  */
-        //LogWarn(Severity_Middle, Error_NotImpl, dwCode, CSimpleStringA::Format("%s TODO:", __FUNCTION__));
-		return dwCode;
-	}
-
 	void ClearRelatedDEC()
 	{
 		UpdateDEC();
-		m_csAlarmMsg = "No more information";
 	}
 
 	bool IsEntityIDSettle(const DWORD& dwVal) const
@@ -1189,9 +1130,6 @@ protected:
 		return ((dwVal >> 20) == m_entCode.dwEntityId);
 	}
 
-	void LogErrMsg(const char* pMsgHead, ErrorCodeEnum eErrCode, DWORD defaultDevCode = 0, BOOL bAlarm = FALSE);
-	void LogErrMsgEx(const ErrorPackage& errPkg, const char* pMsgBody, DWORD finalErrCode /*= 0*/, BOOL bToBusiness = FALSE);
-
     static void GetFileSizeAndCalcHashValue(const char* fileName, int& fileSize, BYTE fileHash[32])
     {
         HANDLE hFile;
@@ -1211,15 +1149,19 @@ protected:
 
 	int CountDevError(CEntityBase *pEntityBase);
 
-	bool IsInBusiness() const { return (m_iInWhatPage == PageType_Other); }
 	
+	virtual bool IsInBusiness() const { 
+		return (m_iInWhatPage == PageType_Other); 
+	}
+	
+	virtual void OnHardwareShakeHand(CSmartPointer<ITransactionContext> pTransactionContext);
+
 private:
 
 		std::map<std::string, DWORD> m_WarnCodeMap;
 		std::map<std::string, DWORD> m_RootIniCodeMap;
 };
 
-
 template<class TFSM, class TDevClass>
 inline ErrorCodeEnum CCommDevFSM<TFSM, TDevClass>::GetAndSplitDevErrInfo(
 		CSimpleStringA& csErrMsg, WORD& wdDevErrCode, LPCTSTR lpszFuncNameForDisplay)
@@ -1268,46 +1210,6 @@ inline ErrorCodeEnum CCommDevFSM<TFSM, TDevClass>::GetAndSplitDevErrInfo(
 	return erroCode;
 }
 
-template<class TFSM, class TDevClass>
-inline void CCommDevFSM<TFSM, TDevClass>::LogErrMsg(
-	const char* pMsgHead, ErrorCodeEnum eErrCode, DWORD defaultDevCode, BOOL bAlarm)
-{
-	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("%s failed, EC = %s", pMsgHead, SpStrError(eErrCode));
-	
-	WORD wdErrCode = 0;
-	CSimpleStringA csErrMsg(true);
-	ErrorCodeEnum ec = GetAndSplitDevErrInfo(csErrMsg, wdErrCode);
-	if (IsEntityIDSettle(defaultDevCode)) {
-		UpdateDEC(defaultDevCode);
-	} else if (ec == Error_Succeed && wdErrCode != 0) {
-		UpdateDEC(wdErrCode);
-    } else if (defaultDevCode != 0) {
-        UpdateDEC(defaultDevCode);
-    }
-
-	m_csAlarmMsg = CSimpleStringA::Format("%s failed EC= %s : %s",
-		pMsgHead, SpStrError(eErrCode), (LPCTSTR)csErrMsg);
-	
-	if (bAlarm) {
-		LogWarn(Severity_Middle, eErrCode, AlarmDECToBusiness(), (LPCTSTR)m_csAlarmMsg);
-	}
-
-	return;
-}
-
-template<class TFSM, class TDevClass>
-inline void CCommDevFSM<TFSM, TDevClass>::LogErrMsgEx(const ErrorPackage& errPkg, const char* pMsgBody, DWORD finalErrCode /*= 0*/, BOOL bToBusiness)
-{
-	const CSimpleStringA alarmMsg = CSimpleStringA::Format("{\"DevSN\":\"%s\", \"Prefix\":\"%s\", \"Code\":\"%s\", \"Msg\":\"%s\"}"
-                           , errPkg.devSN.GetData(), errPkg.msgHead.GetData(), SpStrError(errPkg.devErrCode), pMsgBody);
-    if (bToBusiness) {
-        LogError(Severity_High, errPkg.devErrCode, finalErrCode, alarmMsg.GetData());
-    } else {
-        LogWarn(Severity_High, errPkg.devErrCode, finalErrCode, alarmMsg.GetData());
-    }
-	return;
-}
-
 //1:报错累计到上限,需要返回错误码给业务
 //0:报错累计未到上限,或者不需要计数 
 //-1:出现错误
@@ -1342,6 +1244,22 @@ int CCommDevFSM<TFSM, TDevClass>::CountDevError(CEntityBase* pEntityBase)
 	}
 }
 
+template<class TFSM, class TDevClass>
+void CCommDevFSM<TFSM, TDevClass>::OnHardwareShakeHand(CSmartPointer<ITransactionContext> pTransactionContext)
+{
+	if (m_eDevState == DEVICE_STATUS_NORMAL)
+		pTransactionContext->SendAnswer(Error_Succeed);
+	else
+	{
+		if (m_bOpening)
+			pTransactionContext->SendAnswer(Error_Succeed);
+		else if (!m_bOpened)
+			pTransactionContext->SendAnswer(Error_DevNotAvailable);
+		else
+			pTransactionContext->SendAnswer(Error_InvalidState);
+	}
+}
+
 #endif /*_COMM_DEVICE_FSM_BASE_HPP_*/
 
 

+ 21 - 36
Module/mod_CardIssuerStand/CardIssuerFSM.cpp

@@ -68,7 +68,7 @@ void CCardIssuerFSM::s0_on_entry()
 {
 	LOG_FUNCTION();
 	m_currentFSMState = 0;
-	SetDevStateAndSendMsg(DEVICE_STATUS_NOT_READY);
+	SetDevState(DEVICE_STATUS_NOT_READY);
 	FSMEvent* e;
 	e = new FSMEvent(USER_EVT_INIT);
 	PostEventFIFO(e);
@@ -137,7 +137,7 @@ void CCardIssuerFSM::s2_on_entry()
 	LOG_FUNCTION();
 	ToLogWarnInfoAboutTerm();
 	m_currentFSMState = 2;
-	SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL, false);
+	SetDevState(DEVICE_STATUS_NORMAL);
 	
 	m_resetTimes = 0;
 	m_testResult = Error_Succeed;
@@ -969,7 +969,7 @@ void CCardIssuerFSM::s9_on_entry()
 	LOG_FUNCTION();
 	m_currentFSMState = 9;
 	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer in fault state, need to reset.");
-	SetDevStateAndSendMsg(DEVICE_STATUS_FAULT);
+	SetDevState(DEVICE_STATUS_FAULT);
 	FSMEvent *e = new FSMEvent(USER_EVT_RESET);
 	PostEventFIFO(e);
 }
@@ -1140,19 +1140,17 @@ ErrorCodeEnum CCardIssuerFSM::OnInit()
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("create card process failed.");
 		return Error_Resource;
 	}
-	m_csDevSN = "";
 	CSystemStaticInfo sysInfo;
 	//oilyang 20160331
 	//so many function always return Error_Succeed,so is useless to process it.
-	m_csMachineType = m_csSite = m_terminalNo = "";
+	m_csMachineType = m_terminalNo = "";
 	GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
 	m_csMachineType = sysInfo.strMachineType;
-	m_csSite = sysInfo.strSite;
 	m_terminalNo = sysInfo.strTerminalID;
 	m_majorVerion = sysInfo.MachineVersion.GetMajor();
 	m_minorVerion = sysInfo.MachineVersion.GetMinor();
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("CardIssuer, MachineType:%s, Site:%s, TerminalNo:%s, MachineVersion:%d.%d",
-		m_csMachineType.GetData(), m_csSite.GetData(), m_terminalNo.GetData(), m_majorVerion, m_minorVerion));
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("CardIssuer, MachineType:%s, TerminalNo:%s, MachineVersion:%d.%d",
+		m_csMachineType.GetData(), m_terminalNo.GetData(), m_majorVerion, m_minorVerion));
 
 	//因替换实体名,需要兼容把以前旧的运行时文件拷贝成新的实体名运行文件,卡机分离后,拷贝旧版运行时文件,后期稳定后直接去除
 	//////////////////////////////////////////////////////////////////////////
@@ -1532,7 +1530,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 	}
 	long l_beginTime,l_endTime;
 	do {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CreateDevComponent suc. m_port:%d, m_baudRate:%d, pDevSN:%s",
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CreateDevComponent suc. port:%d, baudRate:%d, pDevSN:%s",
 			m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt(), pDevSN);
 
 		l_beginTime = GetTickCountRVC();
@@ -1543,7 +1541,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpenEx").setCostTime(l_endTime - l_beginTime)("OpenDevice::DevOpenEx, openType:%d, connectType:%d", btOpenType, m_connectType);
 			ToLogRootINIInfo();
-			m_bOpened = true;
+			SetDevInitFlag(true);
 			m_devOpenFailedCount = 0;
 			ZeroMemory(m_devCat.szModel, sizeof(m_devCat.szModel));
 			ZeroMemory(m_devCat.szType, sizeof(m_devCat.szType));
@@ -1743,7 +1741,7 @@ int CCardIssuerFSM::Initial()
 	{
 		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("OpenDevice in Initial return failed with errCode:%d(0x%x)", errCode, errCode);
 		CloseAndClearDevObj(false);
-		m_bOpened = false;
+		SetDevInitFlag(false);
 	}
 	m_bOpening = false;
 	return errCode;
@@ -1877,7 +1875,7 @@ int CCardIssuerFSM::IssueCard(SpReqAnsContext<CardIssuerStandService_Issue_Req,
 			&& ((m_bHasHopper[3] && m_mixedEx[1] >= 3) || !m_bHasHopper[3])
 			&& ((m_bHasHopper[4] && m_mixedEx[1] >= 3) || !m_bHasHopper[4])
 			&& ((m_bHasHopper[5] && m_mixedEx[1] >= 3) || !m_bHasHopper[5]))
-			SetDevStateAndSendMsg(DEVICE_STATUS_MAINTAINCE);
+			SetDevState(DEVICE_STATUS_MAINTAINCE);
 
 		errMsg = CSimpleStringA::Format("the current card hopper %d may be wrong.mixedEx:%d",
 			m_currentHopper, m_mixedEx[m_currentHopper-1]);
@@ -2119,7 +2117,7 @@ int CCardIssuerFSM::CaptureCard(SpReqAnsContext<CardIssuerStandService_Capture_R
 	}
 	else {
 		if (ctx != NULL){
-			if (m_iInWhatPage == PageType_Other) {
+			if (IsInBusiness()) {
 				LogError(Severity_Middle, Error_Unexpect, 0x20300034, "CaptureCard failed");
 				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI("DevAdapter::MoveCard").setLogCode("QLR040220304").setResultCode("RTA2307")("吞卡失败,请检查吞卡箱是否已满或联系厂商检查是否有吞卡");
 			}
@@ -2141,7 +2139,7 @@ int CCardIssuerFSM::EjectCard(SpReqAnsContext<CardIssuerStandService_Eject_Req,C
 	Sleep(300);//oilyang@20230106 for keba said "maybe we need stay for machine to prepare..."
 	int ret = 0;
 	ErrorCodeEnum eErr;
-	eErr = MachineMoveCardFrontGate(ctx != NULL && m_iInWhatPage == PageType_Other);
+	eErr = MachineMoveCardFrontGate(ctx != NULL && IsInBusiness());
 	m_pCardProcess->DataInit();
 	if (Error_Succeed == eErr){
 		if (ctx != NULL)
@@ -2298,7 +2296,7 @@ Err:
 			{
 				err = 4;
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<InternalAcceptCard>, Cancel InterAccept, eject card.");
-				eErr = MachineMoveCardFrontGate(m_iInWhatPage == PageType_Other);
+				eErr = MachineMoveCardFrontGate(IsInBusiness());
 
 				if (Error_Succeed == eErr) {
 					l_beginTime = GetTickCountRVC();
@@ -2565,7 +2563,7 @@ int CCardIssuerFSM::ReadCard_Contact(SpReqAnsContext<CardIssuerStandService_Read
 						SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
 					}
 					else {
-						SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL);
+						SetDevState(DEVICE_STATUS_NORMAL);
 					}
 				}
 			}
@@ -2840,7 +2838,7 @@ int CCardIssuerFSM::ReadCard_RF(SpReqAnsContext<CardIssuerStandService_Read_Req,
 						SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
 					}
 					else {
-						SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL);
+						SetDevState(DEVICE_STATUS_NORMAL);
 					}
 				}
 			}
@@ -3272,7 +3270,7 @@ int CCardIssuerFSM::PreOnline_Contact(SpReqAnsContext<CardIssuerStandService_Pre
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnline>, set %d card mixed %d,%d", m_currentHopper, bSetMix, m_mixedEx[m_currentHopper - 1]);
 				}
 				else {
-					SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL);
+					SetDevState(DEVICE_STATUS_NORMAL);
 				}
 			}
 		}
@@ -4045,7 +4043,7 @@ bool CCardIssuerFSM::SetCardMixed(const int num, const int hopper)
 		return false;
 	}
 	if (num == 0)
-		SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL);
+		SetDevState(DEVICE_STATUS_NORMAL);
 	else
 	{
 		CSimpleStringA errMsg = CSimpleStringA::Format("the current card hopper %d may be wrong.mixedEx:%d",
@@ -4142,15 +4140,6 @@ int CCardIssuerFSM::QueryCardInfo()
 	return ret;
 }
 
-int CCardIssuerFSM::SetDevStateAndSendMsg(const DevStateEnum eState, bool bForceSend)
-{
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetDevStateAndSendMsg, m_eDevState:%d, eState:%d, bForceSend:%d", m_eDevState, eState, bForceSend);
-	if(m_eDevState != eState || bForceSend) {
-		m_eDevState = eState;
-	}
-	return 0;
-}
-
 static char DecCh2HexCh(BYTE c)
 {
 	if (c >= 0x0 && c <= 0x9)
@@ -4213,7 +4202,7 @@ int CCardIssuerFSM::SyncDataToDB(bool bMaintain[12], bool bSetCaptured)
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s",(const char*)m_csMachineType);
 	info.strDeviceNo = m_terminalNo;
 
-	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<SyncDataToDB>, to init sync info, CardBox Num:%d, m_csDevSN:%s", info.dwCardBoxNum, info.strDeviceNo.GetData());
+	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<SyncDataToDB>, to init sync info, CardBox Num:%d, DeviceNo:%s", info.dwCardBoxNum, info.strDeviceNo.GetData());
 	info.arrMaintainFlag.Init(m_hopperNum+1);
 	info.arrMaintainer.Init(m_hopperNum+1);
 	info.arrMaintainTime.Init(m_hopperNum+1);
@@ -4487,7 +4476,7 @@ bool CCardIssuerFSM::RegistCardWhileCaptureCard(CSimpleStringA cardno)
 
 	qRegistCardReq.swallowDate = csDate;
 	qRegistCardReq.swallowTime = csTime;
-	qRegistCardReq.deviceSciNo = m_csDevSN;
+	qRegistCardReq.deviceSciNo = "";
 	qRegistCardReq.terminalNo = m_terminalNo;
 	qRegistCardReq.terminalType = m_csMachineType;
 	//qRegistCardReq.m_url = "http://55.13.170.50:8080/defa-gateway/dee1/EacQuery/queryByEac";
@@ -5155,7 +5144,6 @@ int CCardIssuerFSM::SplitDevModelInfo()
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<SplitDevModelInfo>, Wrong szModel:%s", m_devCat.szModel);
 		return -1;
 	}
-	m_csCM = "";
 	m_csRF = "";
 	CSimpleStringA csTmpModel(m_devCat.szModel);
 	CAutoArray<CSimpleStringA> arrParam;
@@ -5163,10 +5151,6 @@ int CCardIssuerFSM::SplitDevModelInfo()
 	arrParam = csTmpModel.Split('#');
 	for (int i = 0; i < arrParam.GetCount(); ++i)
 	{
-		if (_strnicmp(arrParam[i], "CM", 2) == 0)
-		{
-			m_csCM = arrParam[i].SubString(3, arrParam[i].GetLength() - 3);
-		}
 		if (_strnicmp(arrParam[i], "RF", 2) == 0)
 		{
 			if (arrParam[i].GetLength()>3) {
@@ -5188,7 +5172,8 @@ void CCardIssuerFSM::CloseAndClearDevObj(bool bCheckConnecting, bool bCloseOnly)
 	if (m_hDevHelper != nullptr && !bCloseOnly)
 	{
 		m_hDevHelper.TearDown();
-		m_bOpened = false;//硬件适配器关闭,则设置打开失败
+		SetDevInitFlag(false);
+		//硬件适配器关闭,则设置打开失败
 	}
 }
 

+ 5 - 17
Module/mod_CardIssuerStand/CardIssuerFSM.h

@@ -778,7 +778,7 @@ public:
 	, m_captureReason(""), m_machineType(1), m_currentHopper(1), m_hopperNum(1)
 	, m_bSettingMaterial(false)	, m_addCardNo(""), m_addCardSerial(""), m_hasCardWhileDevOpen(false)
 	,  m_bCancelByRFIC(false), m_devOpenFailedCount(0)
-			, m_iInWhatPage(PageType_Init), m_EacQueryHost(""),m_eacQueryFlag(0), m_bUseCardnoMismatch(false), m_ICRetryTimes(1)
+			, m_EacQueryHost(""),m_eacQueryFlag(0), m_bUseCardnoMismatch(false), m_ICRetryTimes(1)
 			, m_bCardFromHopper(true), m_bStopUseRF(false),m_rfVendorList(""), m_bUseRFTillNext(false), m_csSwallowCardUrl(""), m_csSyncMaterialUrl("")
 		{
 			HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x203);
@@ -870,7 +870,7 @@ public:
 	ErrorCodeEnum MachineMoveCardFrontGate(bool bInBussiness=false);
 
 	void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
-	DevStateEnum GetDevState()
+	DevStateEnum GetDevState() const
 	{
 		if ((m_eDevState == DEVICE_STATUS_NORMAL) 
 			&& ((m_bHasHopper[0] && m_mixedEx[0] >= 3) || !m_bHasHopper[0])
@@ -882,7 +882,6 @@ public:
 	}
 	int QueryCardInfo();
 
-	int SetDevStateAndSendMsg(const DevStateEnum eState, bool bForceSend = true);
 	int UpdateLocalRunCfg(CAutoArray<int> hopperArr);
 	int SyncDataToDB(bool bMaintain[12],bool bSetCaptured=true);//同步物料计数
 	void SetHopperNum(int hopperNum);
@@ -908,10 +907,7 @@ public:
 	void SetCancelByRFICFlag(bool bCancel = true) { m_bCancelByRFIC = bCancel; }
 	CSimpleStringA GetPreOnlineICCardNo() { return m_currCardNo; }
 	void CloseAndClearDevObj(bool bCheckConnecting = true, bool bCloseOnly = false);
-	bool GetDevInitFlag() { return m_bOpened; }
-	bool GetDevInitingFlag() { return m_bOpening; }
 
-	void SetInWhatPage(int bValue) { m_iInWhatPage = bValue; }
 	void SetEnterMainPage();
 	static void HttpsLogCallBack(const char* logtxt);
 	//0:unknow(havn't access microservice or access failed),1:both mag & ic ,2:mag only,3:ic only
@@ -935,7 +931,7 @@ private:
 	bool m_bUseRFTillNext;//if ReadCard by RF,the following PreOnline & PostOnline always use RF till the next card(insert/issue)
 	ErrorCodeEnum m_testResult;
 
-	int m_CardCaptured,m_iInWhatPage/*在哪个页面,区分首页,用户桌面,其他页*/;
+	int m_CardCaptured;
 	int m_issueStatusFromFile, m_issueStatus/*the status maybe changed by Business call*/;
 	//1:default, 2:SCI, 3:no cfg
 	int m_machineType;
@@ -948,15 +944,12 @@ private:
 	DWORD m_MaintainTimeEx[HOPPER_NUM];
 	BYTE m_connectType, m_r1[128], m_r2[128], m_r3[128], m_priKey[ONE_K / 2], m_devPubKey[ONE_K / 2];
 	CardIssuerStatus m_devStatus;
-	DevStateEnum m_eDevState;
 	CCardProcess *m_pCardProcess;
 	CAutoArray<CSimpleStringA> m_aidList;
-	ErrorPackage m_errPkg;
 
 	char *m_pDataToARQC;
 	long xxTest;
-	CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_csSite, m_terminalNo, m_addCardNo, m_addCardSerial
-		, m_csCM, m_rfVendorList, m_csDevSN, m_csRF;
+	CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_terminalNo, m_addCardNo, m_addCardSerial, m_rfVendorList, m_csRF;
 	char m_AuthCode[2];
 	vector<CMBBin> m_vBin;
 	int SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData);
@@ -968,13 +961,8 @@ private:
 	DevCategoryInfo m_devCat;
 	bool ToRegistCaptureCardInfo();
 	bool IfUseRf();
-	CSimpleStringA m_csAlarmMsg,m_EacQueryHost, m_csSwallowCardUrl, m_csSyncMaterialUrl;
+	CSimpleStringA m_EacQueryHost, m_csSwallowCardUrl, m_csSyncMaterialUrl;
 	MagTracks m_magTracks;
-	bool IsInBusiness()
-	{
-		return m_iInWhatPage == PageType_Other;
-	}
-
 };
 struct InitTask : public ITaskSp
 {

+ 1 - 10
Module/mod_CardIssuerStand/mod_cardissuer.cpp

@@ -149,16 +149,7 @@ void CCardIssuerEntity::OnSysVarEvent(const char* pszKey, const char* pszValue,
 {
 	if ((_strnicmp(pszKey, "UIState", strlen("UIState")) == 0))
 	{
-		if (_strnicmp(pszValue, "M", strlen("M")) == 0) {
-			m_fsm.SetInWhatPage(PageType_MainPage);
-			m_fsm.SetEnterMainPage();//设置进入首页
-		}
-		else if (_strnicmp(pszValue, "U", strlen("U")) == 0) {
-			m_fsm.SetInWhatPage(PageType_UserDesktop);
-		}
-		else {
-			m_fsm.SetInWhatPage(PageType_Other);
-		}
+		m_fsm.OnUIState4SetWhatPage(pszValue);
 	}
 }
 

+ 2 - 3
Module/mod_CardReadAdapter/CardReadAdapterFSM.cpp

@@ -29,14 +29,13 @@ void CCardReadAdapterFSM::s0_on_entry()
 	LOG_FUNCTION();
 	CSystemStaticInfo sysInfo;
 
-	m_csMachineType = m_csSite = m_terminalNo = "";
+	m_csMachineType = m_terminalNo = "";
 	GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
 	m_csMachineType = sysInfo.strMachineType;
-	m_csSite = sysInfo.strSite;
 	m_terminalNo = sysInfo.strTerminalID;
 	m_majorVerion = sysInfo.MachineVersion.GetMajor();
 	m_minorVerion = sysInfo.MachineVersion.GetMinor();
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("machineType:%s,site:%s,terminalNo:%s,machineVersion:%d.%d", (const char*)m_csMachineType, (const char*)m_csSite, (const char*)m_terminalNo
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("machineType:%s,terminalNo:%s,machineVersion:%d.%d", (const char*)m_csMachineType, (const char*)m_terminalNo
 	, m_majorVerion, m_minorVerion);
 
 	///**TODO(Gifur@8/17/2023): 覆盖其他需要字段 */

+ 1 - 10
Module/mod_CardReadAdapter/CardReadAdapterFSM.h

@@ -850,18 +850,9 @@ private:
 		, m_bCardActiveNotify;
 	ErrorCodeEnum m_testResult;
 	//m_CardInit,m_CardRemains,m_CardIssued,m_CardMixed,m_CardPercent
-	int m_CardCaptured, m_issueStatusFromFile, m_issueStatus, m_port, m_baudRate, m_currentHopper, m_scanSlot;
-	CSimpleStringA m_CardBoxNoEx[3], m_PsbCodeEx[3], m_PsbNameEx[3], m_MaintainerEx[3], m_csMaintainTimeEx[3];
-	int m_CardInitEx[3], m_CardPercentEx[3], m_remainsEx[3], m_issuedEx[3], m_mixedEx[3], m_hopperNum;
-	DWORD m_MaintainTimeEx[3];
-	BYTE m_connectType, m_r1[128], m_r2[128], m_r3[128], m_priKey[ONE_K / 2], m_devPubKey[ONE_K / 2], m_bdk[64], m_ksn[64];
-
-	DevStateEnum m_eDevState;
-	//CCardProcess *m_pCardProcess;
-
 	char *m_pDataToARQC;
 	long xxTest;
-	CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_csSite, m_csDevSN, m_terminalNo;
+	CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_terminalNo;
 
 	char m_AuthCode[2];
 	SpReqAnsContext<CardReadAdapterService_PreOnlineOnStore_Req, CardReadAdapterService_PreOnlineOnStore_Ans>::Pointer m_crossCtx;

+ 5 - 5
Module/mod_ContactlessCard/ContactlessFSM.cpp

@@ -29,7 +29,7 @@ class CContactlessCardEntity;
 void CContactlessCardFSM::s0_on_entry()
 {
 	LOG_FUNCTION();
-	m_eDevState = DEVICE_STATUS_NOT_READY;
+	SetDevState(DEVICE_STATUS_NOT_READY);
 	FSMEvent *e = new FSMEvent(USER_EVT_INIT);
 	PostEventFIFO(e);
 }
@@ -83,7 +83,7 @@ unsigned int CContactlessCardFSM::s1_on_event(FSMEvent* event)
 void CContactlessCardFSM::s2_on_entry()
 {
 	LOG_FUNCTION();
-	m_eDevState = DEVICE_STATUS_NORMAL;
+	SetDevState(DEVICE_STATUS_NORMAL);
 	m_resetTimes = 0;
 	m_testResult = Error_Succeed;
 
@@ -439,7 +439,7 @@ unsigned int CContactlessCardFSM::s8_on_event(FSMEvent* pEvt)
 void CContactlessCardFSM::s9_on_entry()
 {
 	LOG_FUNCTION();
-	m_eDevState = DEVICE_STATUS_FAULT;
+	SetDevState(DEVICE_STATUS_FAULT);
 	FSMEvent *e = new FSMEvent(USER_EVT_RESET);
 	PostEventFIFO(e);
 }
@@ -599,7 +599,7 @@ ErrorCodeEnum CContactlessCardFSM::Load()
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(l_endTime - l_beginTime)("ContactlessCard DevOpen succ , dwPort:%d, dwBaudRate:%d", m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
 			ToLogRootINIInfo();
-			m_bOpened = true;
+			SetDevInitFlag();
 			ZeroMemory(m_devCatInfo.szModel, sizeof(m_devCatInfo.szModel));
 			ZeroMemory(m_devCatInfo.szType, sizeof(m_devCatInfo.szType));
 			ZeroMemory(m_devCatInfo.szVendor, sizeof(m_devCatInfo.szVendor));
@@ -689,7 +689,7 @@ ErrorCodeEnum CContactlessCardFSM::Load()
 	{
 		if (m_bOpened) {
 			m_hDevHelper->DevClose();
-			m_bOpened = false;
+			SetDevInitFlag(false);
 		}
 		errMsg = CSimpleStringA::Format("非接读卡器启动失败,have tried %d times!!!", initTries);
 		LogWarn(Severity_Middle, Error_Unexpect, ContactlessCard_UserErrorCode_DevOpen_Failed, errMsg.GetData());

+ 0 - 4
Module/mod_ContactlessCard/ContactlessFSM.h

@@ -282,8 +282,6 @@ public:
 	bool GetWaitFlag(){return m_bWaitingAccept;}
 	void SetWaitMore(){m_bWaitAccepteMore = true;}
 	void SetExitFlag(bool bFlag=true){m_bExit = bFlag;}
-	bool GetDevInitFlag() { return m_bOpened; }
-	bool GetDevInitingFlag() { return m_bOpening; }
 	void ToLogWarnInfoAboutTermCustom();
 	bool LoadCMBPrint(CSimpleStringA csBinPath);
 	void GetCardProcessLastErr(ErrorCodeEnum& eErrCode, CSimpleStringA& lastApiName, CSimpleStringA& alarmMsg, CSimpleStringA& csErrMsgWithReturnCode);
@@ -292,7 +290,6 @@ public:
 	{
 		pTransactionContext->SendAnswer(m_testResult);
 	}
-	DevStateEnum GetDevState(){ return m_eDevState;}
 
 protected:
 	int m_iInsertTries;
@@ -310,7 +307,6 @@ private:
 
 	int m_CardInit,m_CardRemains,m_CardIssued,m_CardCaptured,m_CardMixed,m_CardPercent;
 	RFICReaderStatus devStatus;
-	DevStateEnum m_eDevState;
 	CCardProcess *m_pCardProcess;
 	char *m_pDataToARQC;
 	long xxTest;

+ 8 - 8
Module/mod_FingerPrint/FingerPrintFSM.cpp

@@ -29,7 +29,7 @@
 void CFingerPrintFSM::s0_on_entry()
 {
 	LOG_FUNCTION();
-	m_devState = DEVICE_STATUS_NORMAL;
+	SetDevState(DEVICE_STATUS_NORMAL);
 	ToLogWarnInfoAboutTerm();
 
 }
@@ -122,7 +122,7 @@ unsigned int CFingerPrintFSM::s0_on_event(FSMEvent* e)
 void CFingerPrintFSM::s4_on_entry()
 {
 	LOG_FUNCTION();
-	m_devState = DEVICE_STATUS_NOT_READY;
+	SetDevState(DEVICE_STATUS_NOT_READY);
 	InitTask* task = new InitTask(this);
 	GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 }
@@ -212,7 +212,7 @@ void CFingerPrintFSM::s2_on_entry()
 {
 	LOG_FUNCTION();
 	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("FingerPrint entity failed.");
-	m_devState = DEVICE_STATUS_FAULT;
+	SetDevState(DEVICE_STATUS_FAULT);
 	m_testResult = Error_InvalidState;
 }
 
@@ -311,7 +311,7 @@ ErrorCodeEnum CFingerPrintFSM::OnInit()
 int CFingerPrintFSM::Initial()
 {
 	auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
-	m_bOpened = false;
+	SetDevInitFlag(false);
 	if (pEntity->vendorLibInfo.IsNotConfig()) {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("没有配置,将其视为指纹仪设备打开成功");
 		return 0;
@@ -358,7 +358,7 @@ int CFingerPrintFSM::Initial()
 		else {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(l_endTime - l_beginTime)("Initial::DevOpen  port: %d, baudrate: %d", m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
 		}
-		m_bOpened = true;
+		SetDevInitFlag();
 		ToLogRootINIInfo();
 	} while (false);
 	ZeroMemory(m_devCatInfo.szModel, MAX_DEV_MODEL_LEN);
@@ -378,7 +378,7 @@ int CFingerPrintFSM::Initial()
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory").setCostTime(l_endTime - l_beginTime)("Initial::GetDevCategory");
 	}
 	m_adapterInfo.FulfillCategoryInfo(m_devCatInfo);
-	m_bOpened = true;
+	SetDevInitFlag();
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("指纹仪设备打开成功");
 	return 0;
 }
@@ -393,7 +393,7 @@ ErrorCodeEnum CFingerPrintFSM::OnExit()
 	if (m_hDevHelper != nullptr)
 	{
 		m_hDevHelper.TearDown();
-		m_bOpened = false;
+		SetDevInitFlag(false);
 	}
 	return Error_Succeed;
 }
@@ -752,7 +752,7 @@ ErrorCodeEnum CFingerPrintFSM::GetDevCatInfo(DevCategoryInfo& devInfo)
 	return Error_Succeed;
 }
 
-ErrorCodeEnum CFingerPrintFSM::GetDevState(int& state)
+ErrorCodeEnum CFingerPrintFSM::GetCurDevState(int& state)
 {
 	ErrorCodeEnum errCode;
 	state = 0;

+ 3 - 14
Module/mod_FingerPrint/FingerPrintFSM.h

@@ -234,8 +234,7 @@ public:
 	END_FSM_RULE()
 
 	CFingerPrintFSM():m_bCancelRegister(false), m_bCancelMatch(false), m_bExit(false),
-					  m_testResult(Error_Succeed), m_csDevSN(""), m_iInWhatPage(PageType_Init),
-					  m_csMachineType(""), m_terminalNo(""), m_machineVersion("")
+					  m_testResult(Error_Succeed),m_csMachineType(""), m_terminalNo(""), m_machineVersion("")
 					{	
 						HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x204); 
 					}
@@ -270,16 +269,9 @@ public:
 	ErrorCodeEnum DeleteFileIfExisted(const char* fileName);
 
 	ErrorCodeEnum GetDevCatInfo(DevCategoryInfo& devInfo);
-	ErrorCodeEnum GetDevState(int &state);
+	ErrorCodeEnum GetCurDevState(int &state);
 
 	int Initial();
-	bool GetDevInitFlag() { return m_bOpened; }
-	bool GetDevInitingFlag() { return m_bOpening; }
-	void SetInWhatPage(int bValue) { m_iInWhatPage = bValue; }
-
-	DevStateEnum GetDevState(){
-		return m_devState;
-	}
 
 	CSimpleStringA getRTACode(DWORD dwUserCode) {
 		return this->GetEntityBase()->GetFunction()->UserCodeToRTACode(dwUserCode);
@@ -290,14 +282,11 @@ public:
 private:
 	ErrorCodeEnum m_testResult;
 	DevCategoryInfo m_devCatInfo;
-	DevStateEnum m_devState;
 	
 	bool m_bCancelRegister;
 	bool m_bCancelMatch;
 	bool m_bExit;
-	int m_iInWhatPage/*在哪个页面,区分首页,用户桌面,其他页*/;
-
-	CSimpleStringA m_csDevSN, m_csMachineType, m_terminalNo, m_machineVersion;
+	CSimpleStringA m_csMachineType, m_terminalNo, m_machineVersion;
 };
 //废弃
 struct ScanTask : public ITaskSp   

+ 1 - 11
Module/mod_FingerPrint/mod_FingerPrint.cpp

@@ -87,20 +87,10 @@ void FingerPrintServerSession::Handle_Exit(SpOnewayCallContext<FingerPrintServic
 void CFingerPrintEntity::OnSysVarEvent(const char *pszKey,
 	const char *pszValue, const char *pszOldValue, const char *pszEntityName)
 {
-#ifdef RVC_OS_WIN
 	if ((_strnicmp(pszKey, "UIState", strlen("UIState")) == 0))
 	{	//增加页面位置判断
-		if (_strnicmp(pszValue, "M", strlen("M")) == 0) {
-			m_fsm.SetInWhatPage(PageType_MainPage);
-		}
-		else if (_strnicmp(pszValue, "U", strlen("U")) == 0) {
-			m_fsm.SetInWhatPage(PageType_UserDesktop);
-		}
-		else {
-			m_fsm.SetInWhatPage(PageType_Other);
-		}
+		m_fsm.OnUIState4SetWhatPage(pszValue);
 	}
-#endif	
 }
 
 SP_BEGIN_ENTITY_MAP()

+ 1 - 1
Module/mod_FingerPrint/mod_FingerPrint.h

@@ -174,7 +174,7 @@ public:
 	void GetDevStatus(SpReqAnsContext<FingerPrintService_GetDevStatus_Req, FingerPrintService_GetDevStatus_Ans>::Pointer ctx)
 	{
 		int status = 0;
-		m_fsm.GetDevState(status);
+		m_fsm.GetCurDevState(status);
 		ctx->Ans.status = status;
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("FingerPrint state is:%d", status);
 		ctx->Answer(Error_Succeed);

+ 9 - 13
Module/mod_HSPScanner/HSPScannerFSM.cpp

@@ -192,7 +192,6 @@ CHSPScannerFSM::CHSPScannerFSM(void)
 	m_nFatalTimes(0),
 	m_nSrcState(s0),
 	m_csDevNo("Default"),
-	m_eDevStatus(DEVICE_STATUS_NOT_READY),
 	m_desiredAction(USER_EVT_QUIT),
 	dwLastUserCode(0),
 	m_dwMaxImageSize(500),
@@ -200,10 +199,6 @@ CHSPScannerFSM::CHSPScannerFSM(void)
 {
 	HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x217);
 	m_FirstStart = TRUE;
-	m_errPkg.msgHead = "";
-	m_errPkg.devSN = "";
-	m_errPkg.devErrCode = Error_Unexpect;
-	m_errPkg.apiErrCode = Error_Succeed;
 }
 
 CHSPScannerFSM::~CHSPScannerFSM(void)
@@ -240,7 +235,7 @@ ErrorCodeEnum CHSPScannerFSM::OnInit()
 
 	if (erroCode == Error_Succeed) {
 		if (Error_Succeed == (erroCode = TryToOpenDevice())) {
-			m_eDevStatus = DEVICE_STATUS_NORMAL;
+			SetDevState(DEVICE_STATUS_NORMAL);
 			ToLogRootINIInfo();
 			ToLogWarnInfoAboutTerm();
 			return erroCode;
@@ -254,7 +249,8 @@ ErrorCodeEnum CHSPScannerFSM::OnInit()
 	}
 
 FAIL:
-	m_bOpened = false;
+
+	SetDevInitFlag(false);
 	m_bOpening = false;
 	
 	PostEventLIFO(new FSMEvent(USER_EVT_GOTOHELL));
@@ -597,7 +593,7 @@ void CHSPScannerFSM::s3_on_entry()
 {
 	LOG_FUNCTION();
 	
-	m_eDevStatus = DEVICE_STATUS_FAULT;
+	SetDevState(DEVICE_STATUS_FAULT);
 
 	m_nTickTimes = 0;
 	m_bOperating = FALSE;
@@ -614,7 +610,7 @@ void CHSPScannerFSM::s3_on_entry()
 
 void CHSPScannerFSM::s3_on_exit()
 {
-	m_eDevStatus = DEVICE_STATUS_NORMAL;
+	SetDevState(DEVICE_STATUS_NORMAL);
 	m_bOperating = FALSE;
 	m_ecSelfTest = Error_Succeed;
 	m_nFatalTimes = 0;
@@ -952,7 +948,7 @@ unsigned int CHSPScannerFSM::s4_on_event(FSMEvent* e)
 
 void CHSPScannerFSM::s5_on_entry()
 {
-	m_eDevStatus = DEVICE_STATUS_MAINTAINCE;
+	SetDevState(DEVICE_STATUS_MAINTAINCE);
 	LogEvent(Severity_Middle,LOG_EVT_HSPS_LOST_CONNECT,"高拍仪断开连接!");
 	SetLastUserCode(HSPScanner_UserErrorCode_DEVICE_OFFLINE);
 	ScheduleTimer(CHECK_CONNECT_TIMER_ID, MILLISECOND_TO_CHECK_CONNECT);
@@ -961,7 +957,7 @@ void CHSPScannerFSM::s5_on_entry()
 void CHSPScannerFSM::s5_on_exit()
 {
 	SetLastUserCode();
-	m_eDevStatus = DEVICE_STATUS_NORMAL;
+	SetDevState(DEVICE_STATUS_NORMAL);
 	CancelTimer(CHECK_CONNECT_TIMER_ID);
 }
 
@@ -2078,7 +2074,7 @@ ErrorCodeEnum CHSPScannerFSM::TryToOpenDevice()
 		SetErrorAndLog(result, MEC_DEVAPI_HSPSCANNER_DevOpen, "DevAdapter::DevOpen", __FUNCTION__, false, ullEnd - ullStart);
 		SetLastUserCode(LOG_ERR_HSPS_DEVOPEN_FAILED);
 	} else {
-		m_bOpened = true;
+		SetDevInitFlag();
 		SetLastUserCode();
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(ullEnd - ullStart)("Open HSPS succ");
 		ullStart = SP::Module::Comm::RVCGetTickCount();
@@ -2097,7 +2093,7 @@ ErrorCodeEnum CHSPScannerFSM::TryToOpenDevice()
 		if (FAILURED(ecInit) || FAILURED(ecInitScan) || FAILURED(ecInitRotate) || FAILURED(ecInitColor)) {
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ViewPos: %s, Scan: %s, rotate: %s, color: %s.", SpStrError(ecInit), SpStrError(ecInitScan), SpStrError(ecInitRotate), SpStrError(ecInitColor));
 		}
-		m_eDevStatus = DEVICE_STATUS_NORMAL;
+		SetDevState(DEVICE_STATUS_NORMAL);
 	}
 	return result;
 }

+ 2 - 3
Module/mod_HSPScanner/HSPScannerFSM.h

@@ -353,11 +353,11 @@ public:
 	virtual unsigned int s7_on_event(FSMEvent* e);
 
 	virtual void s8_on_entry() {
-		m_eDevStatus = DEVICE_STATUS_NOCFG;
+		SetDevState(DEVICE_STATUS_NOCFG);
 		SetLastUserCode(HSPScanner_UserErrorCode_DLLNAME_NOCFG);
 	}
 	virtual void s8_on_exit() {
-		m_eDevStatus = DEVICE_STATUS_NORMAL;
+		SetDevState(DEVICE_STATUS_NORMAL);
 	}
 	virtual unsigned int s8_on_event(FSMEvent* e);
 
@@ -418,7 +418,6 @@ private:
 
 	int m_nRecX, m_nRecY, m_nRecW;
 
-	DevStateEnum m_eDevStatus;
 	EvtType m_desiredAction;
 	CSimpleStringA m_csMachineType;
 	DevCategoryInfo m_devCat;

+ 1 - 6
Module/mod_HSPScanner/mod_HSPScanner.cpp

@@ -77,12 +77,7 @@ void CHSPScannerEntity::OnSysVarEvent(const char* pszKey, const char* pszValue,
 {
 	if ((_strnicmp(pszKey, "UIState", strlen("UIState")) == 0))
 	{
-		if (_strnicmp(pszValue, "M", strlen("M")) == 0)
-			m_fsm.SetInWhatPage(PageType_MainPage);
-		else if (_strnicmp(pszValue, "U", strlen("U")) == 0)
-			m_fsm.SetInWhatPage(PageType_UserDesktop);
-		else
-			m_fsm.SetInWhatPage(PageType_Other);
+		m_fsm.OnUIState4SetWhatPage(pszValue);
 	}
 }
 

+ 5 - 5
Module/mod_IDCertificate/IDCertFSM.cpp

@@ -158,7 +158,7 @@ void CIDCertFSM::s0_on_entry()
 		ToLogWarnInfoAboutTerm();
 		m_logBefore = true;
 	}
-	m_devState = DEVICE_STATUS_NORMAL;
+	SetDevState(DEVICE_STATUS_NORMAL);
 }
 void CIDCertFSM::s0_on_exit()
 {
@@ -274,7 +274,7 @@ unsigned int CIDCertFSM::s1_on_event(FSMEvent *pEvt)
 void CIDCertFSM::s2_on_entry()
 {
 	LOG_FUNCTION();
-	m_devState = DEVICE_STATUS_FAULT;
+	SetDevState(DEVICE_STATUS_FAULT);
 	m_testResult = Error_InvalidState;
 }
 void CIDCertFSM::s2_on_exit()
@@ -334,7 +334,7 @@ unsigned int CIDCertFSM::s4_on_event(FSMEvent* pEvt)
 void CIDCertFSM::s5_on_entry()
 {
 	LOG_FUNCTION();
-	m_devState = DEVICE_STATUS_NOT_READY;
+	SetDevState(DEVICE_STATUS_NOT_READY);
 	InitTask* task = new InitTask(this);
 	GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 }
@@ -1868,7 +1868,7 @@ int CIDCertFSM::Initial()
 	m_csMachineType = sysInfo.strMachineType;
 	m_terminalNo = sysInfo.strTerminalID;
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("machineType:%s,terminalNo:%s", (const char*)m_csMachineType, (const char*)m_terminalNo);
-	m_devState = DEVICE_STATUS_NOT_READY;
+	SetDevState(DEVICE_STATUS_NOT_READY);
 	auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
 
 	//to do device init
@@ -1961,7 +1961,7 @@ int CIDCertFSM::Initial()
 	}
 	if (m_hDevHelper != nullptr)
 	{
-		m_bOpened = true;
+		SetDevInitFlag();
 		LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_DevOpen_Success, "身份证打开成功");
 		return 0;
 	}

+ 0 - 10
Module/mod_IDCertificate/IDCertFSM.h

@@ -246,16 +246,10 @@ public:
 	void SetExitFlag(){m_bExit = true;}
 	bool GetReadFlag(){return m_bReading;}
 	ErrorCodeEnum GetDevCatInfo(DevCategoryInfo &devInfo, CSimpleStringA& devType);
-	void GetDevState(DevStateEnum &devState){ devState = m_devState; }
-
 	void DoExit(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		pTransactionContext->SendAnswer(Error_Succeed);
 	}
-
-	bool GetDevInitFlag() { return m_bOpened; }
-	void ResetDevInitFlag() { m_bOpened = false; }
-
 	int Initial();
 	void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
 
@@ -286,7 +280,6 @@ private:
 	ErrorCodeEnum m_testResult;
 	ErrorCodeEnum m_getDevCategory;
 	DevCategoryInfo m_devCatInfo;
-	DevStateEnum m_devState;
 	CSimpleStringA m_csMachineType, m_terminalNo;
 	CSimpleStringA transImgMsg;
 #ifdef RVC_OS_WIN
@@ -301,9 +294,6 @@ private:
 	
 
 	BOOL closeImgCheck;
-
-	CSimpleStringA m_csAlarmMsg;
-
 	bool invalidBreak;
 	bool m_logBefore;
 	ULLINT m_ullBeginTime, m_ullEndTime;

+ 406 - 234
Module/mod_accessauth/AccessAuthFSM.cpp

@@ -6,8 +6,8 @@
 #include  <stdio.h>
 #include  <stdlib.h>
 #include "fileutil.h"
+#include "iniutil.h"
 #include "CommEntityUtil.hpp"
-#include "CommEntityRestful.hpp"
 #include "SpUtility.h"
 #include "comm.h"
 #include "PinPad_client_g.h"
@@ -23,6 +23,10 @@ using namespace PinPad;
 #include <ws2tcpip.h>
 #include <Winsock2.h>
 #include <algorithm>
+#include "WMIDeviceQuery.h"
+#include <WinCrypt.h>
+#include <Strsafe.h>
+#include "DeviceBaseClass.h"
 #pragma comment(lib, "IPHLPAPI.lib")
 #define ALLOW_MULTI_NETWORKD_CARDS
 #endif // RVC_OS_WIN
@@ -128,20 +132,8 @@ struct TimeSynTask : ITaskSp
 		CSystemStaticInfo si;
 		m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
 
-		struct TimeSynReqStructJson
-		{
-			std::string terminalNo;
-			int curTime;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, curTime)
-		} timeSyncReq;
-		struct TimeSyncAnsStructJson
-		{
-			int timeDiff;
-			int authVersion;
-			std::string sessionKey;
-			std::string reserved;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(timeDiff, authVersion, sessionKey, reserved)
-		}timeSyncAns;
+		CSessionkeySynReq timeSyncReq;
+		CSessionkeySynAns timeSyncAns;
 
 		timeSyncReq.terminalNo = si.strTerminalID.GetData();
 		timeSyncReq.curTime = CSmallDateTime::GetNow().GetTime64();
@@ -264,26 +256,8 @@ struct UpdateWKTask : ITaskSp
 			return;
 		}
 		
-		struct UpdateWKReq
-		{
-			std::string terminalNo;
-			std::string encRandom;
-			string tpkKeyCheck; //tpk密钥校验值
-			string edkKeyCheck; //edk密钥校验值
-			string keyIndex; //密钥序号
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, encRandom, tpkKeyCheck, edkKeyCheck, keyIndex)
-		} updateWKReq;
-
-		struct UpdateWKAns
-		{
-			string tmk;
-			string tpk;
-			string edk;
-			string tpkKeyCheck; //密钥校验值
-			string edkKeyCheck; //edk密钥校验值
-			string keyIndex; //密钥序号
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(tmk, tpk, edk, tpkKeyCheck, edkKeyCheck, keyIndex)
-		} updateWKAns;
+		CAccessAuthUpdateWKReq updateWKReq;
+		CAccessAuthUpdateWKAns updateWKAns;
 
 		updateWKReq.terminalNo = si.strTerminalID.GetData();
 		auto tmkpair = m_entity->GenerateTmkToKMC();//first是加密的,seconde是没加密的
@@ -309,6 +283,7 @@ struct UpdateWKTask : ITaskSp
 			else
 			{
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get keyChek && keyIndex failed.");
+				return;
 			}
 
 			pPinPad->GetFunction()->CloseSession();
@@ -316,6 +291,7 @@ struct UpdateWKTask : ITaskSp
 		else
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to pinpad failed.error code:%d", errRc);
+			return;
 		}
 
 		HttpClientResponseResult result;
@@ -392,46 +368,16 @@ struct GetTokenTask : ITaskSp
 			return;
 		}
 
-		struct GetTokenReq
-		{
-			string installVersion;//终端版本(新加字段)
-			string terminalCharacter;
-			string terminalNo;
-			string sessionTempPubKey;
-			string encTerminalInfo;
-			string publicKeySM;
-			string pinPadID;
-			string existPinPad;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(installVersion, terminalCharacter, terminalNo,
-				sessionTempPubKey, encTerminalInfo, publicKeySM, pinPadID, existPinPad)
-		} getTokenReqJson;
-
-		struct AccessTokenJson
-		{
-			string enToken;
-			string retHash;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(enToken, retHash)
-		};
-		struct SharedKeyJson
-		{
-			string enToken;
-			string sharedSK;
-			string retHash;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(enToken, sharedSK, retHash)
-		};
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("encTerminalInfo: %s", getTokenReq.encTerminalInfo.c_str());
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sessionTempPubKey:%s", getTokenReq.sessionTempPubKey.c_str());
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("terminalNo: %s", getTokenReq.terminalNo.c_str());
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("terminalVersion: %s", getTokenReq.terminalVersion.c_str());
 
-		struct GetTokenAns
-		{
-			AccessTokenJson accessToken;
-			SharedKeyJson sharedKey;
-			bool flag;
-			string warnMessage;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(accessToken, sharedKey, flag, warnMessage)
-		} getTokenAns;
+		CAccessAuthGetTokenAns getTokenAns;
 
 		HttpClientResponseResult result;
 		HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->GetmAccessAuthHost().GetData(), &SpGetToken);
-		config.SetChildUri("/api/v3/access");
+		config.SetChildUri("/api/v4/access");
 
 		if (m_fsm->containsChinese(m_fsm->GetmAccessAuthHost().GetData()))
 		{
@@ -445,23 +391,10 @@ struct GetTokenTask : ITaskSp
 			return;
 		}
 
-		getTokenReqJson.installVersion = getTokenReq.installVersion;
-		getTokenReqJson.terminalCharacter = getTokenReq.terminalCharacter;
-		getTokenReqJson.terminalNo = getTokenReq.terminalNo;
-		getTokenReqJson.sessionTempPubKey = getTokenReq.sessionTempPubKey;
-		getTokenReqJson.encTerminalInfo = getTokenReq.encTerminalInfo;
-		getTokenReqJson.publicKeySM = getTokenReq.publicKeySM;
-		getTokenReqJson.pinPadID = getTokenReq.pinPadID;
-		getTokenReqJson.existPinPad = getTokenReq.existPinPad;
-
-
-		SP::Module::Restful::FulfillRequestJsonBody(&config, getTokenReqJson);
-
-		std::string test;
-		test = config.GetRequestUri();
-
+		SP::Module::Restful::FulfillRequestJsonBody(&config, getTokenReq);
 		RestfulClient client = RestfulClient::getInstance();
 		config.PreDo();
+
 		client.Do(&config, &result);
 		if (result.ResponseOK()) {
 			SP::Module::Restful::CommResponseJson responseStatus;
@@ -476,10 +409,12 @@ struct GetTokenTask : ITaskSp
 			{
 				CSimpleStringA tmsg = CSimpleStringA::Format("{\"errcode\": \"%s\", \"message\": %s}",
 					responseStatus.errorCode.c_str(), getTokenAns.warnMessage.c_str());
+				m_entity->SetAuthErrMsg(tmsg.GetData());
 				m_fsm->GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", tmsg.GetData(), true);
 			}
 			else
 			{
+				m_entity->SetAuthErrMsg("");
 				m_fsm->GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", "", true);
 			}
 
@@ -519,25 +454,13 @@ struct GetTokenTask : ITaskSp
 			}
 
 			m_fsm->AuthLogWarn(result, config.GetRequestUri(), "获取准入token");
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTokenTask Connect Failed.");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTokenTask Connect Failed. [%s]", result.WhatError().c_str());
 		}
 		FSMEvent* pEvent = new FSMEvent(CAccessAuthFSM::Event_ReqTokenFail);
 		m_fsm->PostEventFIFO(pEvent);
 	}
 };
 
-struct InitDeviceTask :public ITaskSp
-{
-	CAccessAuthFSM* m_fsm;
-	InitDeviceReq m_req;
-	InitDeviceTask(CAccessAuthFSM* fsm, InitDeviceReq req) :m_fsm(fsm), m_req(req) {}
-
-	void Process()
-	{
-		return;
-	}
-};
-
 
 #ifdef RVC_OS_LINUX
 bool isChineseChar(const char* p) {
@@ -594,6 +517,8 @@ void CAccessAuthFSM::doWarnMsg(int errReason, std::string errMsg, bool bNeedEven
 #endif // RVC_OS_WIN
 	if (bNeedEvent) 
 	{
+		auto pEntity = (CAccessAuthEntity*)m_pEntity;
+		pEntity->SetAuthErrMsg(fullErrMsg.c_str());
 		const ErrorCodeEnum ec = m_pEntity->GetFunction()->SetSysVar("AuthErrMsg", fullErrMsg.c_str(), true);
 		if (ec != Error_Succeed) {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Update SysVar failed: 0x%X", ec);
@@ -601,6 +526,7 @@ void CAccessAuthFSM::doWarnMsg(int errReason, std::string errMsg, bool bNeedEven
 		
 		if (errReason == ERR_ACCESSAUTH_SERVICE_FAILED)
 		{
+			pEntity->SetAuthErrMsg(errMsg.c_str());
 			m_pEntity->GetFunction()->SetSysVar("AuthErrMsg", errMsg.c_str(), true);
 			LogEvent(Severity_Middle, ERR_ACCESSAUTH_SERVICE_FAILED, errMsg.c_str());
 		}
@@ -889,7 +815,6 @@ DWORD CAccessAuthFSM::HandleGetToken(BYTE* enToken1, BYTE* sharedKey, BYTE* enTo
 		{
 			pEntity->SetAuthErrMsg("保存令牌失败");
 			pEntity->GetFunction()->SetSysVar("AuthErrMsg", "保存令牌失败", true);
-			pEntity->SetAuthErrMsg("保存令牌失败");
 			doWarnMsg(ERR_ACCESSAUTH_SAVE_TOKEN, "保存令牌失败", true);
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5208")(GetOutPutStr("%s%08X", "SaveTokenAndSharedSK", rc).c_str());
 		}
@@ -897,112 +822,55 @@ DWORD CAccessAuthFSM::HandleGetToken(BYTE* enToken1, BYTE* sharedKey, BYTE* enTo
 	return rc;
 }
 
-DWORD CAccessAuthFSM::GetEncTerminalInfo(CBlob& encInfo)
+DWORD CAccessAuthFSM::GetEncTerminalInfoWithKey(CBlob& encInfo, BYTE* key)
 {
 	LOG_FUNCTION();
-	RequestTokenReq1 req1;
-	memset(&req1, 0, sizeof(req1));
-	BYTE* pBuf = (BYTE*)&req1.encTerminalInfo;
-
-	// 设置长度
-	sprintf((char*)pBuf, "%.4d", sizeof(RequestTokenInfo));
-
-	RequestTokenInfo* pInfo = (RequestTokenInfo*)(pBuf + 4);
-
-	CSystemStaticInfo si;
-	m_pEntity->GetFunction()->GetSystemStaticInfo(si);
-	strncpy(pInfo->szTerminalNo, (const char*)si.strTerminalID, sizeof(pInfo->szTerminalNo) - 1);
-
-	CSimpleStringA strPinPadID = "", strDeviceID = "";
-	bool isPinPadMac = false, bPinPadOnline = false;
-	int nRet = ((CAccessAuthEntity*)m_pEntity)->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, isPinPadMac, bPinPadOnline);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPinPadIDAndDeviceID ret: %d, PinPadID: %s, DeviceID: %s", nRet, strPinPadID.GetData(), strDeviceID.GetData());
-	if (nRet == 2 || nRet == 3) {
-		strncpy(pInfo->szPadDeviceID, (const char*)strDeviceID, sizeof(pInfo->szPadDeviceID) - 1);
-	}
-
-	strncpy(pInfo->szMachineType, (const char*)si.strMachineType, sizeof(pInfo->szMachineType) - 1);
-
-	// 设备版本,低两位为小版本号,高两位为大版本号 Binary	4
-	DWORD ver32 = si.MachineVersion.GetVersion32();
-	for (int i = 0; i < 4; i++) {
-		pInfo->machineVersion[3 - i] = ((BYTE*)&ver32)[i];
-	}
-
-	//	安装版本,其中包含软件框架版本	binary	8
-	__int64 ver64 = si.InstallVersion.GetVersion64();
-	for (int i = 0; i < 8; i++) {
-		pInfo->installVersion[7 - i] = ((BYTE*)&ver64)[i];
-	}
-#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];
-			//99开头行内办公网,10开头行内业务网。规范出自《招商银行总行网络规范汇编(2017年版).pdf》
-			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];
+	ErrorCodeEnum rc = Error_Succeed;
+	CSimpleStringA ip, mac, pinpadModel, cpuId, mainBoardId, hardDiskId, osType, osVersion;
+	std::map<std::string, std::string> termInfo;
+	
+	auto pEntity = ((CAccessAuthEntity*)m_pEntity);
+	bool bPinPadOnline = false;
+	pEntity->GetPinPadModel(pinpadModel, bPinPadOnline);
+	
+	GetIPandMac(ip, mac);
+	GetHardWareInfo(cpuId, mainBoardId, hardDiskId);
+	osVersion = GetOsVersion();
 
-		pInfo->ip[0] = in->S_un.S_un_b.s_b1;
-		pInfo->ip[1] = in->S_un.S_un_b.s_b2;
-		pInfo->ip[2] = in->S_un.S_un_b.s_b3;
-		pInfo->ip[3] = in->S_un.S_un_b.s_b4;
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ip:%d.%d.%d.%d", pInfo->ip[0], pInfo->ip[1], pInfo->ip[2], pInfo->ip[3]);
-	}
+#ifdef RVC_OS_WIN
+	termInfo["osType"] = "Windows";
 #else
-	char ip[32] = { 0 };
-	if (getIPFromLinux(ip)) DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Get IP From Linux Error ex.");
-	else {
-		if (ip2byte(ip, pInfo->ip)) DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Ip 2 Byte Error");
-		else {
-			for (int i = 0; i < 4; i++) {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ip[%d]=%d", i, (int)pInfo->ip[i]);
-			}
-		}
-	}
-#endif //#ifdef RVC_OS_WIN
-	strncpy(pInfo->szSites, si.strSite, sizeof(pInfo->szSites) - 1);
-
-	si.EnrolGPS.GetBinaryLongitude(&pInfo->currentGPS[0]);
-	si.EnrolGPS.GetBinaryLatitude(&pInfo->currentGPS[4]);
-
-	CSimpleStringA ts;
-	DWORD rc = m_pEntity->GetFunction()->GetSysVar("TerminalStage", ts);
-	if (rc != Error_Succeed) 
-	{
-		string outStr = GetOutPutStr("%s%08X%s%s", "GetSysVar", rc, "TerminalStage", ts.GetData());
-		doWarnMsg(ERR_ACCESSAUTH_GET_SYS_VAR, outStr.c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(outStr.c_str());
-		return ERR_ACCESSAUTH_GET_SYS_VAR;
-	}
-	assert(ts.GetLength() >= 1);
-	pInfo->chTerminalState = ts[0];
-
-	CSimpleStringA rs;
-	rc = m_pEntity->GetFunction()->GetSysVar("RunState", rs);
-	if (rc != Error_Succeed) 
-	{
-		string outStr = GetOutPutStr("%s%08X%s%s", "GetSysVar", rc, "RunState", rs.GetData());
-		doWarnMsg(ERR_ACCESSAUTH_GET_SYS_VAR, outStr.c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(outStr.c_str());
-		return ERR_ACCESSAUTH_GET_SYS_VAR;
-	}
-	assert(rs.GetLength() >= 1);
-	pInfo->chRunState = rs[0];
+	termInfo["osType"] = "UOS";
+#endif // RVC_OS_WIN
+	termInfo["osVersion"] = osVersion.GetData();
+	termInfo["ip"] = ip.GetData();
+	termInfo["mac"] = mac.GetData();
+	termInfo["cpuId"] = cpuId.GetData();
+	termInfo["mainBoardId"] = mainBoardId.GetData();
+	termInfo["hardDiskId"] = hardDiskId.GetData();
+	termInfo["pinpadModel"] = pinpadModel.GetData();
+
+	std::pair<bool, std::string> strResult;
+	strResult = generateJsonStr(termInfo);
+
+	char* pBuf = new char[2048];
+	int len = 0;
+#ifdef RVC_OS_WIN
+	string tmpStr = strResult.second;
+	SP::Module::Util::ConvertGBKToUtf8(tmpStr);
+	strcpy(pBuf, tmpStr.c_str()); //GBK转UTF8
+	len = tmpStr.size();
+#else
+	strcpy(pBuf, strResult.second.c_str());
+	len = strResult.second.size();
+#endif // RVC_OS_WIN
 
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("HardWareInfo: %s", pBuf);
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("HardWareInfo size: %d", len);
 
 	CBlob raw;
-	auto pEntity = ((CAccessAuthEntity*)m_pEntity);
-	// 使用会话密钥加密
-	raw.Refer(pBuf, sizeof(RequestTokenInfo) + 4);
-	rc = pEntity->EncryptDataWithSessionKey(raw, encInfo);
+	raw.Refer(pBuf, len);
+	rc = pEntity->EncryptDataWithKey(raw, encInfo, key);
 
 	if (rc != Error_Succeed) 
 	{
@@ -1052,26 +920,14 @@ DWORD CAccessAuthFSM::GetTokenReq(CAccessAuthGetTokenReq* getTokenReq)
 	CSystemStaticInfo si;
 	pEntity->GetFunction()->GetSystemStaticInfo(si);
 
-	getTokenReq->installVersion = si.InstallVersion.ToString();
-
-	BYTE fingerPrint[32] = { 0 };
-	int nBufLen = sizeof(fingerPrint);
-	if (!pEntity->GetTerminalFingerPrint(fingerPrint, nBufLen)) 
-	{
-		doWarnMsg(ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
-			GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False").c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
-			(GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False").c_str());
-		return ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT;
-	}
-	char tmp[256] = { 0 };
-	char* fingerPrintHex = Str2Hex((char*)fingerPrint, 64);
-	memcpy(tmp, fingerPrintHex, 64);
-	getTokenReq->terminalCharacter = tmp;
-	delete fingerPrintHex;
+	getTokenReq->terminalVersion = si.InstallVersion.ToString();
+	getTokenReq->terminalNo = si.strTerminalID.GetData();
 
 	CBlob encInfo;
-	if ((rc = GetEncTerminalInfo(encInfo)) != Error_Succeed) 
+	// 使用会话密钥加密
+	char sessionKey[KEY_SIZE] = { 0 };
+	memcpy(sessionKey, pEntity->m_AuthSessionKey, KEY_SIZE);
+	if ((rc = GetEncTerminalInfoWithKey(encInfo, (BYTE*)sessionKey)) != Error_Succeed)
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetEncTerminalInfo failed:%d", rc);
 		return rc;
@@ -1079,23 +935,14 @@ DWORD CAccessAuthFSM::GetTokenReq(CAccessAuthGetTokenReq* getTokenReq)
 	char* pTmp = Str2Hex((char*)encInfo.m_pData, encInfo.m_iLength);
 	getTokenReq->encTerminalInfo = pTmp;
 	delete pTmp;
-	getTokenReq->terminalNo = si.strTerminalID.GetData();
-	string tmpStr = "";
-	if ((rc = GetTmk(tmpStr)) != Error_Succeed) return rc;
-	getTokenReq->sessionTempPubKey = tmpStr;
 
-	CSimpleStringA strPinPadID = "", strDeviceID = "";
-	bool isPinPadMac = false, bPinPadOnline = false;
-	int nRet = ((CAccessAuthEntity*)m_pEntity)->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, isPinPadMac, bPinPadOnline);
-	getTokenReq->pinPadID = strPinPadID.GetData();
-	if (pEntity->HasPinPad()) 
-	{
-		getTokenReq->existPinPad = "1";
-	} 
-	else 
+	string tmpStr = "";
+	if ((rc = GetTmk(tmpStr)) != Error_Succeed) 
 	{
-		getTokenReq->existPinPad = "0";
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTmk failed:%d", rc);
+		return rc;
 	}
+	getTokenReq->sessionTempPubKey = tmpStr;
 	return rc;
 }
 
@@ -1103,9 +950,9 @@ void CAccessAuthFSM::UpdateWK()
 {
 	LOG_FUNCTION();
 	auto pEntity = ((CAccessAuthEntity*)m_pEntity);
-	CSimpleStringA strPinPadID = "", strDeviceID = "";
-	bool isPinPadMac = false, bPinPadOnline = false;
-	pEntity->GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, isPinPadMac, bPinPadOnline);
+	CSimpleStringA strPinPadModel = "";
+	bool bPinPadOnline = false;
+	pEntity->GetPinPadModel(strPinPadModel, bPinPadOnline);
 	if (bPinPadOnline) {
 		CSmartPointer<UpdateWKTask> updateWKTask = new UpdateWKTask(this, pEntity);
 		GetEntityBase()->GetFunction()->PostThreadPoolTask(updateWKTask.GetRawPointer());
@@ -1167,3 +1014,328 @@ void CAccessAuthFSM::GetNetMsg(SpReqAnsContext<AccessAuthService_GetNetMsg_Req,
 
 	ctx->Answer(Error_Succeed);
 }
+
+CSimpleStringA CAccessAuthFSM::GetOsVersion()
+{
+	std::map<std::string, std::string> errInfo;
+	CSimpleStringA errMsg;
+	errInfo["errcode"] = "RTA5219";
+	errInfo["msg"] = "调用系统api获取操作系统版本失败";
+
+#if defined(RVC_OS_WIN)
+	CSimpleStringA runInfoPath;
+	ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("runinfo", runInfoPath);
+	if (eErr != Error_Succeed) {
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GetPath runinfo error=%s.", SpStrError(eErr));
+		errInfo["getLastErr"] = GetLastError();
+		errMsg = generateJsonStr(errInfo).second.c_str();
+		return errMsg;
+	}
+	runInfoPath += "\\runcfg\\osverion";
+	ifstream is;
+	is.open(runInfoPath.GetData(), ios::binary);
+	if (!is.is_open())
+	{
+		DWORD dwErr = GetLastError();
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open runcfg\\osverion file failed. [%d]", dwErr);
+		errInfo["getLastErr"] = dwErr;
+		errMsg = generateJsonStr(errInfo).second.c_str();
+		return errMsg;
+	}
+	string line;
+	while (!is.eof()) {
+		getline(is, line);
+		int start = line.find("版本");
+		if (start != string::npos)
+			//return CSimpleStringA(line.substr(start + 5, line.length() - start - 7).c_str());
+			return CSimpleStringA(line.c_str());
+		else
+			continue;
+	}
+
+	errInfo["getLastErr"] = GetLastError();
+	errMsg = generateJsonStr(errInfo).second.c_str();
+	return errMsg;
+#else
+	std::map<std::string, std::string> osInfo;
+	const char filePath[] = "/etc/os-version";
+	char tmp[33];
+	memset(tmp, 0, 33);
+	inifile_read_str_s("Version", "SystemName", "unknown", tmp, 32, filePath);
+	osInfo["SystemName"] = tmp;
+	memset(tmp, 0, 33);
+	inifile_read_str_s("Version", "ProductType", "unknown", tmp, 32, filePath);
+	osInfo["ProductType"] = tmp;
+	memset(tmp, 0, 33);
+	inifile_read_str_s("Version", "MajorVersion", "unknown", tmp, 32, filePath);
+	osInfo["MajorVersion"] = tmp;
+	memset(tmp, 0, 33);
+	inifile_read_str_s("Version", "MinorVersion", "unknown", tmp, 32, filePath);
+	osInfo["MinorVersion"] = tmp;
+	memset(tmp, 0, 33);
+	inifile_read_str_s("Version", "OsBuild", "unknown", tmp, 32, filePath);
+	osInfo["OsBuild"] = tmp;
+	return generateJsonStr(osInfo).second.c_str();
+#endif
+}
+
+void CAccessAuthFSM::GetIPandMac(CSimpleStringA& ip, CSimpleStringA& mac)
+{
+	CAutoArray<SP::Module::Net::NetworkAdapterItem> netList;
+	ErrorCodeEnum rc = SP::Module::Net::GetINETMacAddresses(netList);
+	std::map<std::string, std::string> errInfo;
+	if (rc != Error_Succeed)
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get sys netinfo failed!. rc=%d.", rc);
+		errInfo["errcode"] = "RTA5216";
+		errInfo["msg"] = "调用系统api获取ip失败";
+		errInfo["getLastErr"] = GetLastError();
+		ip = generateJsonStr(errInfo).second.c_str();
+
+		errInfo["errcode"] = "RTA5217";
+		errInfo["msg"] = "调用系统api获取mac地址失败";
+		errInfo["getLastErr"] = GetLastError();
+		mac = generateJsonStr(errInfo).second.c_str();
+
+		auto pEntity = (CAccessAuthEntity*)m_pEntity;
+		pEntity->SetAuthErrMsg("获取本地ip和mac失败");
+		return;
+	}
+
+	CSimpleStringA csMac(""), csIP(""), csDNS("");
+	for (int i = 0; i < netList.GetCount(); i++) {
+		if (!csMac.IsNullOrEmpty()) {
+			csMac += ";";
+		}
+		csMac += netList[i].mac.c_str();
+	}
+	mac = csMac;
+	
+	for (int i = 0; i < netList.GetCount(); i++) {
+		if (!csIP.IsNullOrEmpty()) {
+			csIP += ";";
+		}
+		csIP += netList[i].ip.c_str();
+	}
+	ip = csIP;
+
+	return;
+}
+
+void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & mainBoard, CSimpleStringA & disk)
+{
+	auto pEntity = (CAccessAuthEntity*)m_pEntity;
+	std::map<std::string, std::string> errInfo;
+
+	//oilyang@20231008 to get system info from runcfg first
+	//no matter calculating from runcfg succeed or not,we also get system info from system api for update runcfg
+	bool bGetFromRunCfg = false;
+	CSimpleString csInfo, strErrMsg, strRet;
+	CSmartPointer<IConfigInfo> pConfigRun;
+	ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, pConfigRun);
+	if (eErr == Error_Succeed && pConfigRun->ReadConfigValue("system", "info", csInfo) == Error_Succeed && !csInfo.IsNullOrEmpty()) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read device info from runcfg: [%s]", csInfo.GetData());
+		CAutoArray<CSimpleStringA> sysInfo = csInfo.Split('|');
+		if (sysInfo.GetCount() == 3)
+		{
+			cpu = sysInfo[0];
+			mainBoard = sysInfo[1];
+			disk = sysInfo[2];
+			bGetFromRunCfg = true;
+		}
+	}
+	else
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTermSysInfo, OpenConfig Config_Run error=%d.", eErr);
+
+#ifdef RVC_OS_LINUX
+	char szTmp[1024] = {};
+	string strTmp;
+	int nTmpBufLen = 1024;
+	CSmartPointer<IEntityFunction> spFunction = GetEntityBase()->GetFunction();
+
+	CSimpleStringA runInfoPath;
+	auto rc = GetEntityBase()->GetFunction()->GetPath("runinfo", runInfoPath);
+	if (rc != Error_Succeed) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPath runinfo error=%d.", rc);
+		return;
+	}
+	runInfoPath += SPLIT_SLASH_STR "runcfg";
+
+	//CPU
+	if (!get_cpu_id_by_system(strTmp, runInfoPath.GetData()))
+	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5213";
+			errInfo["msg"] = "调用系统api获取CPU序号失败";
+			errInfo["getLastErr"] = GetLastError();
+			cpu = generateJsonStr(errInfo).second.c_str();
+		}
+
+		strErrMsg = CSimpleStringA::Format("查询CPU ID失败,请重启机器并重新初始化");
+		pEntity->SetAuthErrMsg((const char*)strErrMsg);
+
+		doWarnMsg(ERROR_ACCESSAUTH_GETCPUID,
+			GetOutPutStr("%s%s", "Processor", "False").c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5213")
+			(GetOutPutStr("%s%s", "Processor", "False").c_str());
+		return;
+	}
+	cpu = strTmp.c_str();
+	strRet = strTmp.c_str();
+	strTmp.clear();
+	
+	//主板
+	if (!get_board_serial_by_system(strTmp, runInfoPath.GetData()))
+	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5214";
+			errInfo["msg"] = "调用系统api获取主板ID号失败";
+			errInfo["getLastErr"] = GetLastError();
+			mainBoard = generateJsonStr(errInfo).second.c_str();
+		}
+		strErrMsg = CSimpleStringA::Format("查询主板序列号失败,  请重启机器并重新初始化");
+		pEntity->SetAuthErrMsg((const char*)strErrMsg);
+
+		doWarnMsg(ERROR_ACCESSAUTH_GETBASEBOARDSN,
+			GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5214")
+			(GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
+		return;
+	}
+	mainBoard = strTmp.c_str();
+	strRet += "|";
+	strRet += strTmp.c_str();
+	
+	//硬盘
+	vector<string> diskArr;
+	int errCode = 0;
+	if (!get_disk_serial_by_system(diskArr, errCode, runInfoPath.GetData()))
+	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5215";
+			errInfo["msg"] = "调用系统api获取硬盘ID号失败";
+			errInfo["getLastErr"] = GetLastError();
+			disk = generateJsonStr(errInfo).second.c_str();
+		}
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get_disk_serial_by_system errCode:%d", errCode);
+		strErrMsg = CSimpleStringA::Format("查询磁盘序列号失败, 请重启机器并重新初始化");
+		pEntity->SetAuthErrMsg((const char*)strErrMsg);
+
+		doWarnMsg(ERROR_ACCESSAUTH_DISKDRIVESN,
+			GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5215")
+			(GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
+		return;
+	}
+	strRet += "|";
+	strTmp = "";
+	vector<string>::iterator it = diskArr.begin();
+	while (it != diskArr.end()) {
+		strTmp += *it;
+		it++;
+	}
+	strRet += strTmp.c_str();
+	disk = strTmp.c_str();
+#else
+	ULONGLONG ullStart = GetTickCount64();
+	char szTmp[1024] = {};
+	int nTmpBufLen = 1024;
+	CSmartPointer<IEntityFunction> spFunction = GetEntityBase()->GetFunction();
+	if (!QueryWMIDevice(Processor, "ProcessorId", szTmp, &nTmpBufLen))
+	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5213";
+			errInfo["msg"] = "调用系统api获取CPU序号失败";
+			errInfo["getLastErr"] = GetLastError();
+			cpu = generateJsonStr(errInfo).second.c_str();
+		}
+		strErrMsg = CSimpleStringA::Format("查询 cpu id 失败: %d, 请尝试重启应用", GetLastError());
+		pEntity->SetAuthErrMsg((const char*)strErrMsg);
+
+		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
+
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
+			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
+		return;
+	}
+	strRet = szTmp;
+	cpu = szTmp;
+
+	nTmpBufLen = 1024;
+	memset(szTmp, 0, sizeof(szTmp));
+	if (!QueryWMIDevice(BaseBoard, "SerialNumber", szTmp, &nTmpBufLen))
+	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5214";
+			errInfo["msg"] = "调用系统api获取主板ID号失败";
+			errInfo["getLastErr"] = GetLastError();
+			mainBoard = generateJsonStr(errInfo).second.c_str();
+		}
+		strErrMsg = CSimpleStringA::Format("查询 baseboard sn 失败: %d, 请尝试重启应用", GetLastError());
+		pEntity->SetAuthErrMsg((const char*)strErrMsg);
+
+		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
+			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
+		
+		return;
+	}
+
+	strRet += "|";
+	strRet += szTmp;
+	mainBoard = szTmp;
+
+	nTmpBufLen = 1024;
+	memset(szTmp, 0, sizeof(szTmp));
+	if (!QueryWMIDevice(DiskDrive, "SerialNumber", szTmp, &nTmpBufLen))
+	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5215";
+			errInfo["msg"] = "调用系统api获取硬盘ID号失败";
+			errInfo["getLastErr"] = GetLastError();
+			disk = generateJsonStr(errInfo).second.c_str();
+		}
+		strErrMsg = CSimpleStringA::Format("查询 harddisk sn 失败: %d, 请尝试重启应用", GetLastError());
+		pEntity->SetAuthErrMsg((const char*)strErrMsg);
+
+		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str());
+		
+		return;
+	}
+
+	strRet += "|";
+	strRet += szTmp;
+	disk = szTmp;
+
+	ULONGLONG ullEnd = GetTickCount64();
+	if (ullEnd - ullStart > 5000)
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5201")
+			("获取系统信息耗时过长:%d秒", (ullEnd - ullStart) / 1000);
+		LogWarn(Severity_Middle, Error_Unexpect, AccessAuthorization_UserErrorCode_GetTermCostTooLong,
+			CSimpleStringA::Format("获取系统信息耗时过长:%d秒", (ullEnd - ullStart) / 1000));
+	}
+#endif // RVC_OS_LINUX
+
+	if (!bGetFromRunCfg || csInfo.Compare(strRet) != 0)
+	{
+		eErr = pConfigRun->WriteConfigValue("system", "info", strRet.GetData());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("device info changed,before[%s],current[%s],write to runcfg:%d"
+			, csInfo.GetData(), strRet.GetData(), eErr);
+	}
+	else
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("device info: [%s]", strRet.GetData());
+
+	return;
+	
+}

+ 75 - 358
Module/mod_accessauth/AccessAuthFSM.h

@@ -7,6 +7,7 @@
 #include "AccessAuthConn.h"
 #include "IHttpFunc.h"
 #include "json/json.h"
+#include "CommEntityRestful.hpp"
 
 #ifdef RVC_OS_WIN
 ///*TODO:  (80374374@11/27/2023)*/
@@ -26,394 +27,106 @@ static void GetLocalTimeRVC(SYSTEMTIME& stTime)
 #define REFLECTION(var) #var
 #define JUAGEHTTPS(ret) (ret.m_sysCode == 200 || ret.m_sysCode == 201)
 
-#ifdef RVC_OS_WIN
-typedef struct CSessionkeySynReq : CHTTPReq {
-	string terminalNo;
-	long curTime;
-
-	string ToJson() {
-		Json::Value value;
-		value[REFLECTION(terminalNo)] = terminalNo;
-		value[REFLECTION(curTime)] = curTime;
-		Json::FastWriter writer;
-		string strData = writer.write(value);
-
-		/*DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CSessionkeySynReq")
-			("req=%s at CSessionkeySynReq", strData.c_str());*/
-
-		return strData;
-	}
+typedef struct CSessionkeySynReq
+{
+	std::string terminalNo;
+	int curTime;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, curTime)
 } CSessionkeySynReq;
 
-typedef struct CSessionkeySynRet : CHTTPRet {
-	struct data {
-		long timeDiff;
-		string sessionKey;
-	} data;
-	bool Parse(string strData) {
-		/*DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CSessionkeySynRet")
-			("ret=%s at CSessionkeySynRet", strData.c_str());*/
-
-		Json::Value root;
-		Json::Reader reader;
-		reader.parse(strData, root, false);
-
-		data.timeDiff = root["data"][REFLECTION(timeDiff)].asInt();
-		data.sessionKey = root["data"][REFLECTION(sessionKey)].asString();
-		return true;
-	}
-} CSessionkeySynRet;
-
-typedef struct CAccessAuthUpdateWKReq : CHTTPReq {
-	string terminalNo;
-	string encRandom;
+typedef struct CSessionkeySynAns
+{
+	int timeDiff;
+	int authVersion;
+	std::string sessionKey;
+	std::string reserved;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(timeDiff, authVersion, sessionKey, reserved)
+}CSessionkeySynAns;
+
+typedef struct CAccessAuthUpdateWKReq
+{
+	std::string terminalNo;
+	std::string encRandom;
 	string tpkKeyCheck; //tpk密钥校验值
 	string edkKeyCheck; //edk密钥校验值
 	string keyIndex; //密钥序号
-	string ToJson() {
-		Json::Value value;
-		value[REFLECTION(terminalNo)] = terminalNo;
-		value[REFLECTION(encRandom)] = encRandom;
-		value[REFLECTION(tpkKeyCheck)] = tpkKeyCheck;
-		value[REFLECTION(edkKeyCheck)] = edkKeyCheck;
-		value[REFLECTION(keyIndex)] = keyIndex;
-		Json::FastWriter writer;
-		string strData = writer.write(value);
-		/*DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CAccessAuthUpdateWKReq")
-			("req=%s at CAccessAuthUpdateWKReq", strData.c_str());*/
-
-		return strData;
-	}
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalNo, encRandom, tpkKeyCheck, edkKeyCheck, keyIndex)
 } CAccessAuthUpdateWKReq;
 
-typedef struct CAccessAuthUpdateWKRet : CHTTPRet {
+typedef struct CAccessAuthUpdateWKAns
+{
+	string tmk;
 	string tpk;
 	string edk;
 	string tpkKeyCheck; //密钥校验值
 	string edkKeyCheck; //edk密钥校验值
 	string keyIndex; //密钥序号
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(tmk, tpk, edk, tpkKeyCheck, edkKeyCheck, keyIndex)
+} CAccessAuthUpdateWKAns;
 
-	bool Parse(string strData) {
-		Json::Value root;
-		Json::Reader reader;
-		reader.parse(strData, root, false);
-
-		tpk = root["data"][REFLECTION(tpk)].asString();
-		edk = root["data"][REFLECTION(edk)].asString();
-		tpkKeyCheck = root["data"][REFLECTION(tpkKeyCheck)].asString();
-		edkKeyCheck = root["data"][REFLECTION(edkKeyCheck)].asString();
-		keyIndex = root["data"][REFLECTION(keyIndex)].asString();
-
-		return true;
-	}
-} CAccessAuthUpdateWKRet;
-#endif // RVC_OS_WIN
-
-typedef struct CAccessAuthGetTokenReq :public CHTTPReq {
-public:
-	string installVersion;//终端版本(新加字段)
-	string terminalCharacter;
+typedef struct CAccessAuthGetTokenReq
+{
+	string terminalVersion;//终端版本(新加字段)
 	string terminalNo;
 	string sessionTempPubKey;
 	string encTerminalInfo;
-	string publicKeySM;
-	string pinPadID;
-	string existPinPad;
-
-	string ToJson() {
-#ifdef RVC_OS_WIN
-		Json::Value value;
-		value[REFLECTION(installVersion)] = installVersion;
-		value[REFLECTION(terminalCharacter)] = terminalCharacter;
-		value[REFLECTION(terminalNo)] = terminalNo;
-		value[REFLECTION(sessionTempPubKey)] = sessionTempPubKey;
-		value[REFLECTION(encTerminalInfo)] = encTerminalInfo;
-		value[REFLECTION(publicKeySM)] = publicKeySM;
-		value[REFLECTION(pinPadID)] = pinPadID;
-		value[REFLECTION(existPinPad)] = existPinPad;
-
-		Json::FastWriter writer;
-		string strData = writer.write(value);
-		/*DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CAccessAuthGetTokenReq")
-			("req=%s at CAccessAuthGetTokenReq", strData.c_str());*/
-
-		return strData;
-#else
-		RVCJson rvcJson(true);
-		rvcJson.AddStringToObject(REFLECTION(installVersion), (char*)installVersion.c_str());
-		rvcJson.AddStringToObject(REFLECTION(terminalCharacter), (char*)terminalCharacter.c_str());
-		rvcJson.AddStringToObject(REFLECTION(terminalNo), (char*)terminalNo.c_str());
-		rvcJson.AddStringToObject(REFLECTION(sessionTempPubKey), (char*)sessionTempPubKey.c_str());
-		rvcJson.AddStringToObject(REFLECTION(encTerminalInfo), (char*)encTerminalInfo.c_str());
-		rvcJson.AddStringToObject(REFLECTION(publicKeySM), (char*)publicKeySM.c_str());
-		rvcJson.AddStringToObject(REFLECTION(pinPadID), (char*)pinPadID.c_str());
-		rvcJson.AddStringToObject(REFLECTION(existPinPad), (char*)existPinPad.c_str());
-		string ret;
-		char* tmp = rvcJson.GetJsonStr();
-		ret.assign(tmp);
-		delete tmp;
-		/*DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CAccessAuthGetTokenReq")
-			("req=%s at CAccessAuthGetTokenReq", ret.c_str());*/
-		return ret;
-#endif // RVC_OS_WIN
-	}
-}CAccessAuthGetTokenReq;
-
-typedef struct CAccessAuthGetTokenRet : CHTTPRet {
-	typedef struct AccessToken {
-		string enToken;
-		string retHash;
-	} AccessToken;
-	typedef struct SharedKey {
-		string enToken;
-		string sharedSK;
-		string retHash;
-	} ShareKey;
-	struct data {
-		AccessToken accessToken;
-		SharedKey sharedKey;
-#ifdef RVC_OS_WIN
-		int flag; //0:非高故障设备,1:高故障设备
-		string warnMessage; //告警提示信息
-#endif // RVC_OS_WIN
-	} data;
-	bool Parse(string strData) {
-#ifdef RVC_OS_WIN
-		Json::Value root;
-		Json::Reader reader;
-		reader.parse(strData, root, false);
-
-		data.accessToken.enToken = root["data"][REFLECTION(accessToken)][REFLECTION(enToken)].asString();
-		data.accessToken.retHash = root["data"][REFLECTION(accessToken)][REFLECTION(retHash)].asString();
-		data.sharedKey.enToken = root["data"][REFLECTION(sharedKey)][REFLECTION(enToken)].asString();
-		data.sharedKey.sharedSK = root["data"][REFLECTION(sharedKey)][REFLECTION(sharedSK)].asString();
-		data.sharedKey.retHash = root["data"][REFLECTION(sharedKey)][REFLECTION(retHash)].asString();
-		data.flag = root["data"][REFLECTION(flag)].asInt();
-		data.warnMessage = root["data"][REFLECTION(warnMessage)].asString();
-
-		return true;
-#else
-		//Dbg("ret=%s at CAccessAuthGetTokenRet", strData.c_str());
-		if (m_userCode.compare(ACS_SUCCESS)) return true;
-		RVCJson rvcJson;
-		rvcJson.SetJson(strData.c_str());
-
-		auto dataJson = rvcJson.GetJsonValue(REFLECTION(data));
-		auto tokenJson = dataJson->GetJsonValue(REFLECTION(accessToken));
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminalVersion, terminalNo, sessionTempPubKey, encTerminalInfo)
+} CAccessAuthGetTokenReq;
 
-		data.accessToken.enToken = tokenJson->GetStringValue(REFLECTION(enToken));
-		data.accessToken.retHash = tokenJson->GetStringValue(REFLECTION(retHash));
-		tokenJson->Destory();
-		delete tokenJson;
-
-		auto sharedJson = dataJson->GetJsonValue(REFLECTION(sharedKey));
-
-		data.sharedKey.enToken = sharedJson->GetStringValue(REFLECTION(enToken));
-		data.sharedKey.sharedSK = sharedJson->GetStringValue(REFLECTION(sharedSK));
-		char* tmp = sharedJson->GetStringValue(REFLECTION(retHash));
-		data.sharedKey.retHash = tmp == NULL ? "" : tmp;
-
-		sharedJson->Destory();
-		delete sharedJson;
-		dataJson->Destory();
-		delete dataJson;
-
-		rvcJson.Destory();
-		return true;
-#endif // RVC_OS_WIN
-	}
-} CAccessAuthGetTokenRet;
+struct AccessTokenJson
+{
+	string enToken;
+	string retHash;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(enToken, retHash)
+};
+struct SharedKeyJson
+{
+	string enToken;
+	string sharedSK;
+	string retHash;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(enToken, sharedSK, retHash)
+};
 
-typedef struct CInitlizerMKReq : CHTTPReq {
-	string enrolAddr;
-	string enrolGPS;
-	string installVersion;
-	string ip;
-	string machineModel;
-	string machineType;
-	string padDeviceID;
-	string site;
+typedef struct CAccessAuthGetTokenAns
+{
+	AccessTokenJson accessToken;
+	SharedKeyJson sharedKey;
+	bool flag;
+	string warnMessage;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(accessToken, sharedKey, flag, warnMessage)
+} CAccessAuthGetTokenAns;
+
+typedef struct CInitlizerMKReq
+{
+	string iniTerminalInfo;
+	string terminalVersion;
 	string terminalNo;
-	string factory;
-	string modal;
-	string type;
-	string version;
-	string terminalCharacter; //终端特征值(fingerPrint + fingerPrintSM)
-	string pinPadID;
 	string publicKey;
 	string user; //操作人
-	string password; //密码
 	string auth;//预留鉴权
 	int loginWay;//1表示错误页发起,需要传入登录密码;0表示用户桌面发起,不需要传入登录密码
 	string encRandom; //tmk pk加密的随机密钥
-	string tpkKeyCheck; //密钥校验值
-	string edkKeyCheck; //密钥校验值
-	string keyIndex; //密钥序号
+	string curTpkKeyCheck; //密钥校验值
+	string curEdkKeyCheck; //密钥校验值
+	string curKeyIndex; //密钥序号
 
-	string ToJson() {
-#ifdef RVC_OS_WIN
-		Json::Value value;
-		value[REFLECTION(enrolAddr)] = enrolAddr;
-		value[REFLECTION(enrolGPS)] = enrolGPS;
-		value[REFLECTION(installVersion)] = installVersion;
-		value[REFLECTION(ip)] = ip;
-		value[REFLECTION(machineModel)] = machineModel;
-		value[REFLECTION(machineType)] = machineType;
-		value[REFLECTION(padDeviceID)] = padDeviceID;
-		value[REFLECTION(site)] = site;
-		value[REFLECTION(terminalNo)] = terminalNo;
-		value[REFLECTION(factory)] = factory;
-		value[REFLECTION(modal)] = modal;
-		value[REFLECTION(type)] = type;
-		value[REFLECTION(version)] = version;
-		value[REFLECTION(terminalCharacter)] = terminalCharacter;
-		value[REFLECTION(pinPadID)] = pinPadID;
-		value[REFLECTION(publicKey)] = publicKey;
-		value[REFLECTION(user)] = user;
-		value[REFLECTION(password)] = password;
-		value[REFLECTION(auth)] = auth;
-		value[REFLECTION(loginWay)] = loginWay;
-		value[REFLECTION(encRandom)] = encRandom;
-		value[REFLECTION(tpkKeyCheck)] = tpkKeyCheck;
-		value[REFLECTION(edkKeyCheck)] = edkKeyCheck;
-		value[REFLECTION(keyIndex)] = keyIndex;
-		Json::FastWriter writer;
-		string strData = writer.write(value);
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(iniTerminalInfo, terminalVersion, terminalNo, publicKey, user, auth,
+		loginWay, encRandom, curTpkKeyCheck, curEdkKeyCheck, curKeyIndex)
 
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CInitlizerMKReq")("CInitlizerMKReq:%s", strData.c_str());
-
-		return strData;
-#else
-		RVCJson rvcJson(true);
-		rvcJson.AddStringToObject(REFLECTION(enrolAddr), (char*)enrolAddr.c_str());
-		rvcJson.AddStringToObject(REFLECTION(enrolGPS), (char*)enrolGPS.c_str());
-		rvcJson.AddStringToObject(REFLECTION(installVersion), (char*)installVersion.c_str());
-		rvcJson.AddStringToObject(REFLECTION(ip), (char*)ip.c_str());
-		rvcJson.AddStringToObject(REFLECTION(machineModel), (char*)machineModel.c_str());
-		rvcJson.AddStringToObject(REFLECTION(machineType), (char*)machineType.c_str());
-		rvcJson.AddStringToObject(REFLECTION(padDeviceID), (char*)padDeviceID.c_str());
-		rvcJson.AddStringToObject(REFLECTION(site), (char*)site.c_str());
-		rvcJson.AddStringToObject(REFLECTION(terminalNo), (char*)terminalNo.c_str());
-		rvcJson.AddStringToObject(REFLECTION(factory), (char*)factory.c_str());
-		rvcJson.AddStringToObject(REFLECTION(modal), (char*)modal.c_str());
-		rvcJson.AddStringToObject(REFLECTION(type), (char*)type.c_str());
-		rvcJson.AddStringToObject(REFLECTION(version), (char*)version.c_str());
-		rvcJson.AddStringToObject(REFLECTION(terminalCharacter), (char*)terminalCharacter.c_str());
-		rvcJson.AddStringToObject(REFLECTION(pinPadID), (char*)pinPadID.c_str());
-		rvcJson.AddStringToObject(REFLECTION(publicKey), (char*)publicKey.c_str());
-		rvcJson.AddStringToObject(REFLECTION(user), (char*)user.c_str());
-		rvcJson.AddStringToObject(REFLECTION(password), (char*)password.c_str());
-		rvcJson.AddStringToObject(REFLECTION(auth), (char*)auth.c_str());
-		rvcJson.AddNumberToObject(REFLECTION(loginWay), loginWay);
-		rvcJson.AddStringToObject(REFLECTION(encRandom), (char*)encRandom.c_str());
-		rvcJson.AddStringToObject(REFLECTION(tpkKeyCheck), (char*)tpkKeyCheck.c_str());
-		rvcJson.AddStringToObject(REFLECTION(edkKeyCheck), (char*)edkKeyCheck.c_str());
-		rvcJson.AddStringToObject(REFLECTION(keyIndex), (char*)keyIndex.c_str());
-		string ret;
-		char* tmp = rvcJson.GetJsonStr();
-		ret.assign(tmp);
-		delete tmp;
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CInitlizerMKReq")("req=%s at CInitlizerMKReq", ret.c_str());
-		rvcJson.Destory();
-		return ret;
-#endif // RVC_OS_WIN
-	}
 } CInitlizerMKReq;
 
-typedef struct CInitlizerMKRet : CHTTPRet {
-#ifdef RVC_OS_WIN
-	string tpk;
-	string edk;
+typedef struct CInitlizerMKAns
+{
+	string TMK;
+	string TPK;
+	string EDK;
 	string tpkKeyCheck;
 	string edkKeyCheck;
 	string keyIndex;
-
-	bool Parse(string strData) {
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("CInitlizerMKRet")("ret=%s at CInitlizerMKRet", strData.c_str());
-
-		Json::Value root;
-		Json::Reader reader;
-		reader.parse(strData, root, false);
-		tpk = root["data"][REFLECTION(tpk)].asString();
-		edk = root["data"][REFLECTION(edk)].asString();
-		tpkKeyCheck = root["data"][REFLECTION(tpkKeyCheck)].asString();
-		edkKeyCheck = root["data"][REFLECTION(edkKeyCheck)].asString();
-		keyIndex = root["data"][REFLECTION(keyIndex)].asString();
-		return true;
-	}
-#else
-	struct data {
-		string TMK;
-		string TPK;
-		string EDK;
-		string tpkKeyCheck;
-		string edkKeyCheck;
-		string keyIndex;
-		string reserved;
-	} data;
-	bool Parse(string strData) {
-		//Dbg("ret=%s at CInitlizerMKRet", strData.c_str());
-		if (m_userCode.compare(ACS_SUCCESS)) return true;
-		RVCJson rvcJson;
-		rvcJson.SetJson((char*)strData.c_str());
-		auto retJson = rvcJson.GetJsonValue(REFLECTION(data));
-		data.TMK = retJson->GetStringValue(REFLECTION(tmk));
-		data.TPK = retJson->GetStringValue(REFLECTION(tpk));
-		data.EDK = retJson->GetStringValue(REFLECTION(edk));
-		data.tpkKeyCheck = retJson->GetStringValue(REFLECTION(tpkKeyCheck));
-		data.edkKeyCheck = retJson->GetStringValue(REFLECTION(edkKeyCheck));
-		data.keyIndex = retJson->GetStringValue(REFLECTION(keyIndex));
-		rvcJson.Destory();
-		retJson->Destory();
-		delete retJson;
-		return true;
-	}
-#endif // RVC_OS_WIN
-} CInitlizerMKRet;
-
-#ifdef RVC_OS_WIN
-typedef struct CAccessAuthInitDeviceReq : CHTTPReq {
-	string cr1;
-	string cr3;
-	string r2;
-	string cDevPubKey;
-	string vendor;
-	string terminalNo;
-	string ToJson() {
-		Json::Value value;
-		value[REFLECTION(cr1)] = cr1;
-		value[REFLECTION(cr3)] = cr3;
-		value[REFLECTION(r2)] = r2;
-		value[REFLECTION(cDevPubKey)] = cDevPubKey;
-		value[REFLECTION(vendor)] = vendor;
-		value[REFLECTION(terminalNo)] = terminalNo;
-
-		Json::FastWriter writer;
-		string strData = writer.write(value);
-		//Dbg("CAccessAuthInitDeviceReq:%s", strData.c_str());
-		return strData;
-}
-} CAccessAuthInitDeviceReq;
-
-typedef struct CAccessAuthInitDeviceRet : CHTTPRet {
-	string r3;
-	string cr2;
-	string r1;
-	string devPubKey;
-
-	bool Parse(string strData) {
-		Json::Value root;
-		Json::Reader reader;
-		reader.parse(strData, root, false);
-		r3 = root["data"][REFLECTION(r3)].asString();
-		cr2 = root["data"][REFLECTION(cr2)].asString();
-		r1 = root["data"][REFLECTION(r1)].asString();
-		devPubKey = root["data"][REFLECTION(devPubKey)].asString();
-
-		return true;
-	}
-} CAccessAuthInitDeviceRet;
-#endif // RVC_OS_WIN
+	string reserved;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(TMK, TPK, EDK, tpkKeyCheck, edkKeyCheck, keyIndex)
+		JSONCONVERT2OBJECT_MEMEBER_RENAME_REGISTER("tmk", "tpk", "edk", "tpkKeyCheck", "edkKeyCheck", "keyIndex")
+} CInitlizerMKAns;
 
 class MyMutex;
 class CAccessAuthFSM : public FSMImpl<CAccessAuthFSM>, public IFSMStateHooker
@@ -476,7 +189,7 @@ public:
 	void doWarnMsg(int errReason, std::string errMsg, bool bNeedEvent = false, string varMsg = "");
 	DWORD HandleTimeSyn(long nTimeDiff, BYTE* nSessionKey);
 	DWORD HandleGetToken(BYTE* token, BYTE* sharedKey, BYTE* token2, BYTE* retHash);
-	DWORD GetEncTerminalInfo(CBlob& encInfo);
+	DWORD GetEncTerminalInfoWithKey(CBlob& encInfo, BYTE* key);
 	DWORD GetTmk(string& tmk);
 	DWORD GetTokenReq(CAccessAuthGetTokenReq* getTokenReq);
 	void UpdateWK();
@@ -491,6 +204,10 @@ public:
 
 	bool containsChinese(const std::string& str);
 
+	CSimpleStringA GetOsVersion();
+	void GetIPandMac(CSimpleStringA& ip, CSimpleStringA& mac);
+	void GetHardWareInfo(CSimpleStringA& cpu, CSimpleStringA& mainBoard, CSimpleStringA& disk);
+
 private:
 	void GetDiffSyncTimeFromCenterSettings();
 private:

+ 88 - 510
Module/mod_accessauth/mod_AccessAuth.cpp

@@ -24,9 +24,6 @@ using namespace PinPad;
 #include "DeviceBaseClass.h"
 #endif
 
-#define KEY_SIZE 16
-#define BUF_SIZE 256
-
 extern int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len);
 extern int StrBuf2HexBuf(LPCTSTR strBuf, PBYTE* hexBuf);
 
@@ -40,8 +37,8 @@ struct InitializerInitMKTask : ITaskSp
 	{
 		CSystemStaticInfo si;
 		m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
-		CInitlizerMKReq initMKReq;//oiltest dev module count
-		bool initFlag = m_entity->SendInitMKReqACS(initMKReq);
+		CInitlizerMKReq instanceReq;//oiltest dev module count
+		bool initFlag = m_entity->SendInitMKReqACS(instanceReq);
 		if (!initFlag)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5204")("连接密码键盘异常");
@@ -56,87 +53,29 @@ struct InitializerInitMKTask : ITaskSp
 		}
 
 		auto tmkpair = m_entity->GenerateTmkToKMC();
-		struct InstanceReqJson
-		{
-			string enrolAddr;
-			string enrolGPS;
-			string installVersion;
-			string ip;
-			string machineModel;
-			string machineType;
-			string padDeviceID;
-			string site;
-			string terminalNo;
-			string factory;
-			string modal;
-			string type;
-			string version;
-			string terminalCharacter; //终端特征值(fingerPrint + fingerPrintSM)
-			string pinPadID;
-			string publicKey;
-			string user; //操作人
-			string password; //密码
-			string auth;//预留鉴权
-			int loginWay;//1表示错误页发起,需要传入登录密码;0表示用户桌面发起,不需要传入登录密码
-			string encRandom; //tmk pk加密的随机密钥
-			string tpkKeyCheck; //密钥校验值
-			string edkKeyCheck; //密钥校验值
-			string keyIndex; //密钥序号
-
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(enrolAddr, enrolGPS, installVersion, ip, machineModel, machineType,
-				padDeviceID, site, terminalNo, factory, modal, type, version, terminalCharacter, pinPadID, publicKey,
-				user, password, auth, loginWay, encRandom, tpkKeyCheck, edkKeyCheck, keyIndex)
-
-		} instanceReq;
-
-		instanceReq.enrolAddr = initMKReq.enrolAddr;
-		instanceReq.enrolGPS = initMKReq.enrolGPS;
-		instanceReq.installVersion = initMKReq.installVersion;
-		instanceReq.ip = initMKReq.ip;
-		instanceReq.machineModel = initMKReq.machineModel;
-		instanceReq.machineType = initMKReq.machineType;
-		instanceReq.padDeviceID = initMKReq.padDeviceID;
-		instanceReq.site = initMKReq.site;
-		instanceReq.terminalNo = initMKReq.terminalNo;
-		instanceReq.factory = initMKReq.factory;
-		instanceReq.modal = initMKReq.modal;
-		instanceReq.type = initMKReq.type;
-		instanceReq.version = initMKReq.version;
-		instanceReq.terminalCharacter = initMKReq.terminalCharacter;
-		instanceReq.pinPadID = initMKReq.pinPadID;
-		instanceReq.publicKey = initMKReq.publicKey;
-		instanceReq.user = initMKReq.user;
-		instanceReq.password = initMKReq.password;
-		instanceReq.auth = initMKReq.auth;
-		instanceReq.loginWay = initMKReq.loginWay;
 		instanceReq.encRandom = tmkpair.first;
-		instanceReq.tpkKeyCheck = initMKReq.tpkKeyCheck;
-		instanceReq.edkKeyCheck = initMKReq.edkKeyCheck;
-		instanceReq.keyIndex = initMKReq.keyIndex;
 
-		struct InstanceAnsJson
-		{
-			string TMK;
-			string TPK;
-			string EDK;
-			string tpkKeyCheck;
-			string edkKeyCheck;
-			string keyIndex;
-			string reserved;
-			JSONCONVERT2OBJECT_MEMEBER_REGISTER(TMK, TPK, EDK, tpkKeyCheck, edkKeyCheck, keyIndex)
-				JSONCONVERT2OBJECT_MEMEBER_RENAME_REGISTER("tmk", "tpk", "edk", "tpkKeyCheck", "edkKeyCheck", "keyIndex")
-		} instanceAns;
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("iniTerminalInfo: %s", instanceReq.iniTerminalInfo.c_str());
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("auth:%s", instanceReq.auth.c_str());
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("curEdkKeyCheck: %s", instanceReq.curEdkKeyCheck.c_str());
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("curKeyIndex: %s", instanceReq.curKeyIndex.c_str());
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("curTpkKeyCheck: %s", instanceReq.curTpkKeyCheck.c_str());
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("encRandom: %s", instanceReq.encRandom.c_str());
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("publicKey: %s", instanceReq.publicKey.c_str());
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("terminalNo: %s", instanceReq.terminalNo.c_str());
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("terminalVersion: %s", instanceReq.terminalVersion.c_str());
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("user: %s", instanceReq.user.c_str());
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("loginWay: %d", instanceReq.loginWay);
+
+		CInitlizerMKAns instanceAns;
 
 		HttpClientResponseResult result;
 		HttpClientRequestConfig config(HttpRequestMethod::POST, m_entity->GetInitUrl().GetData(), &SpGetToken);
-		config.SetChildUri("/api/v5/initmk");
+		config.SetChildUri("/api/v6/initmk");
 		SP::Module::Restful::FulfillRequestJsonBody(&config, instanceReq);
-
-		std::string test;
-		test = config.GetRequestUri();
-
 		RestfulClient client = RestfulClient::getInstance();
 		config.PreDo();
+
 		client.Do(&config, &result);
 		if (result.ResponseOK()) {
 			SP::Module::Restful::CommResponseJson responseStatus;
@@ -179,19 +118,6 @@ struct InitializerInitMKTask : ITaskSp
 	}
 };
 
-#ifdef RVC_OS_WIN
-struct GetTermSysInfoTask : ITaskSp
-{
-	CAccessAuthEntity* m_entity;
-	GetTermSysInfoTask(CAccessAuthEntity* entity) :m_entity(entity) {}
-
-	void Process()
-	{
-		m_entity->GetTermSysInfo();
-	}
-};
-#endif // RVC_OS_WIN
-
 typedef struct _REG_TZI_FORMAT
 {
 	LONG Bias;
@@ -264,11 +190,6 @@ void CAccessAuthEntity::OnStarted()
 			GetOutPutStr("%s%08X", "获取系统静态信息错误", rc).c_str(), strErrMsg.GetData());
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(GetOutPutStr("%s%08X", "获取系统静态信息错误", rc).c_str());
 	}
-#ifdef RVC_OS_WIN
-	spFunction->RegistSysVarEvent("NetState", this);
-	CSmartPointer<GetTermSysInfoTask> getTermSysInfoTask = new GetTermSysInfoTask(this);
-	GetFunction()->PostThreadPoolTask(getTermSysInfoTask.GetRawPointer());
-#endif // RVC_OS_WIN
 }
 
 void CAccessAuthEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext) 
@@ -279,9 +200,6 @@ void CAccessAuthEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPoin
 
 void CAccessAuthEntity::OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext) 
 { 
-#ifdef RVC_OS_WIN
-	GetFunction()->UnregistSysVarEvent("NetState");
-#endif // RVC_OS_WIN
 	m_FSM.PostExitEvent();
 	pTransactionContext->SendAnswer(Error_Succeed); 
 }
@@ -619,8 +537,8 @@ static BYTE* ConvertHexStrToBytes(const char *pszStr)
 	return pRet;
 }
 
-// 使用准入会话密钥加密
-ErrorCodeEnum CAccessAuthEntity::EncryptDataWithSessionKey(const CBlob &raw, CBlob &enc)
+// 使用密钥加密
+ErrorCodeEnum CAccessAuthEntity::EncryptDataWithKey(const CBlob &raw, CBlob &enc, BYTE* key)
 {
 	LOG_FUNCTION();
 	//这里不需要delete,由CBlob析构函数去执行
@@ -630,14 +548,10 @@ ErrorCodeEnum CAccessAuthEntity::EncryptDataWithSessionKey(const CBlob &raw, CBl
 	char* pPlainInfo = Str2Hex((char*)raw.m_pData, raw.m_iLength);
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("raw Length=%d", raw.m_iLength);
 	delete[] pPlainInfo;
-	
-	char sessionKey[KEY_SIZE] = { 0 };
-	memcpy(sessionKey,m_AuthSessionKey,KEY_SIZE);
-	char* tmpKey = Str2Hex((char*)m_AuthSessionKey, KEY_SIZE);
-	delete[] tmpKey;
 
-	if (!EncWithSM4_ECB((BYTE*)sessionKey, (BYTE*)(raw.m_pData), raw.m_iLength, pEncData, &pEncDataSize)) {
+	if (!EncWithSM4_ECB(key, (BYTE*)(raw.m_pData), raw.m_iLength, pEncData, &pEncDataSize)) {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("会话密钥加密准入信息失败!");
+		SetAuthErrMsg("会话密钥加密准入信息失败");
 		return Error_Unexpect;
 	}
 	
@@ -680,112 +594,6 @@ static char* ConvertBytesToHexStr(BYTE *pBuf, int nLen)
 	return pRet;
 }
 
-bool CAccessAuthEntity::GetTerminalFingerPrint(BYTE *pBuf, int &nBufLen)
-{
-#ifdef RVC_OS_LINUX
-	char szTmp[1024] = {};
-	string strTmp;
-	int nTmpBufLen = 1024;
-	CSimpleStringA strErrMsg;
-	CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
-
-	CSimpleStringA strRet;
-	CSimpleStringA runInfoPath;
-	auto rc = GetFunction()->GetPath("runinfo", runInfoPath);
-	if (rc != Error_Succeed) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPath runinfo error=%d.", rc);
-		return false;
-	}
-	runInfoPath += SPLIT_SLASH_STR "runcfg";
-	if (!get_cpu_id_by_system(strTmp, runInfoPath.GetData()))
-	{
-		strErrMsg = CSimpleStringA::Format("查询CPU ID失败,请重启机器并重新初始化");
-		SetAuthErrMsg((const char*)strErrMsg);
-
-		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETCPUID,
-			GetOutPutStr("%s%s", "Processor", "False").c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5213")
-			(GetOutPutStr("%s%s", "Processor", "False").c_str());
-		return false;
-	}
-
-	strRet = strTmp.c_str();
-	strTmp.clear();
-	if (!get_board_serial_by_system(strTmp, runInfoPath.GetData()))
-	{
-		strErrMsg = CSimpleStringA::Format("查询主板序列号失败,  请重启机器并重新初始化");
-		SetAuthErrMsg((const char*)strErrMsg);
-
-		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETBASEBOARDSN,
-			GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5214")
-			(GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
-		return false;
-	}
-	strRet += "|";
-
-	strRet += strTmp.c_str();
-	vector<string> disk;
-	int errCode = 0;
-	if (!get_disk_serial_by_system(disk, errCode, runInfoPath.GetData()))
-	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get_disk_serial_by_system errCode:%d", errCode);
-		strErrMsg = CSimpleStringA::Format("查询磁盘序列号失败, 请重启机器并重新初始化");
-		SetAuthErrMsg((const char*)strErrMsg);
-
-		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_DISKDRIVESN,
-			GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5215")
-			(GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
-		return false;
-	}
-	strRet += "|";
-
-	strTmp = "";
-	vector<string>::iterator it = disk.begin();
-	while (it != disk.end()) {
-		strTmp += *it;
-		it++;
-	}
-	strRet += strTmp.c_str();
-
-	BYTE m_btTermSysInfoSM3[32] = { 0 };
-	if (!SM3Hash(reinterpret_cast<BYTE*>(const_cast<char*>(strRet.GetData())), strRet.GetLength(), m_btTermSysInfoSM3))
-	{
-		strErrMsg = "get sm3 hash as fingerprint fail";
-		SetAuthErrMsg((const char*)strErrMsg);
-		spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
-		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETSM3HASH, (const char*)strErrMsg);
-		return false;
-	}
-#endif // RVC_OS_LINUX
-	if (nBufLen < 32)
-	{
-		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETSM3HASH, "buf len is too small fail");
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("buf len is too small fail");
-
-		return false;
-	}
-#ifdef RVC_OS_WIN
-	while (1)
-	{
-		if (m_iGetTermSysInfo == -1)
-			return false;
-		else if (m_iGetTermSysInfo == 1)
-			break;
-		else if (m_iGetTermSysInfo == 0)
-			Sleep(1000);//oiltmp@20220917 之前的逻辑是不跳出去,现在要加么?暂时不加,连调用系统接口都有问题,让其他逻辑处理
-	}
-#endif // RVC_OS_WIN
-	nBufLen = 32;
-	memcpy(pBuf, m_btTermSysInfoSM3, nBufLen);
-
-	char *pszSM3 = ConvertBytesToHexStr(m_btTermSysInfoSM3, nBufLen);
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("fringerprint: [%s]", pszSM3);
-	free(pszSM3);
-	return true;
-}
-
 // 生成RSA密钥对,并导出公钥
 bool CAccessAuthEntity::GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& pubkey)
 {
@@ -887,18 +695,20 @@ bool CAccessAuthEntity::GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& p
 
 //oilyang@20210510 嵌入"bool CAccessAuthEntity::HasPinPad()"的逻辑
 // 返回1:只有PinPadID;2:只有DeviceID;3:两者都有;0:没有;-1表示失败
-int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimpleStringA &strDeviceID, bool& isPinPadMac, bool& bPinPadOnline)
+ErrorCodeEnum CAccessAuthEntity::GetPinPadModel(CSimpleStringA& pinpadModel, bool& bPinPadOnline)
 {
-	isPinPadMac = false;
 	bPinPadOnline = false;
 	CSimpleStringA strErrMsg;
 	CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
-
+	std::map<std::string, std::string> errInfo;
 	//oilyang@20210514 
 	if (!IsMachineTypeConfigurePinPad(m_info.strMachineType))
-		return 0;
+	{
+		pinpadModel = "";
+		return Error_Succeed;
+	}
 
-	int nRet = -1;
+	ErrorCodeEnum nRet = Error_Unexpect;
 	auto pPinPadClient = new PinPadService_ClientBase(this);
 	bool bPinPadID = false;
 	bool bDeviceID = false;
@@ -908,10 +718,15 @@ int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimp
 	CSimpleStringA strBluetoothID;
 	CSimpleStringA strPID;
 	CSimpleStringA strMID;
-	isPinPadMac = true;
 	auto rc = 0;
 	if ((rc = pPinPadClient->Connect()) == Error_Succeed)
 	{
+		//初始错误信息
+		errInfo["errcode"] = "RTA5205";
+		errInfo["msg"] = "调用PinPad发生错误";
+		errInfo["getLastErr"] = GetLastError();
+		pinpadModel = generateJsonStr(errInfo).second.c_str();
+
 		PinPadService_GetDevInfo_Req req = {};
 		PinPadService_GetDevInfo_Ans ans = {};
 
@@ -919,69 +734,26 @@ int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimp
 		if (rc == Error_Succeed)
 		{
 			bPinPadOnline = true;
-			nRet = 0;
+			nRet = Error_Succeed;
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pinpad model: %s", ans.model.GetData());
 
 			// CM = V2.0#PM = V1.0#MID = 75500001#PID = 12345678#FWID = V1234567#Vendor = nantian
 			// 密码键盘ID,PID,8到16字节;  设备ID,MID,8到16字节;  固件版本号,FWID,8字节
-			CSimpleStringA str = ans.model;
-			if (!str.IsNullOrEmpty())
-			{
-				auto arr = str.Split('#');
-				if (arr.GetCount() > 0)
-				{
-					for (int i = 0; i < arr.GetCount(); i++)
-					{
-						auto arr2 = arr[i].Split('=');
-						if (arr2.GetCount() != 2)
-							continue;
-
-						//if (arr2[0] == "PID")
-						if (!strnicmp((LPCTSTR)arr2[0], "PID", strlen("PID")))
-						{
-							strPID = arr2[1];
-
-							if (!strPID.IsNullOrEmpty())
-								bPinPadID = true;
-						}
-						//else if (arr2[0] == "MID")
-						else if (!strnicmp((LPCTSTR)arr2[0], "MID", strlen("MID")))
-						{
-							strMID = arr2[1];
-
-							if (!strMID.IsNullOrEmpty())
-								bDeviceID = true;
-						}
-						//else if (arr2[0] == "Vendor")
-						else if (!strnicmp((LPCTSTR)arr2[0], "Vendor", strlen("Vendor")))
-						{
-							strVendor = arr2[1];
-
-							if (!strVendor.IsNullOrEmpty())
-								bVendor = true;
-						}
-						else if (!strnicmp((LPCTSTR)arr2[0], "FWBID", strlen("FWBID")))
-						{
-							strBluetoothID = arr2[1];
-							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("strBluetoothID=%s", strBluetoothID.GetData());
-							if (!strBluetoothID.IsNullOrEmpty())
-								bBluetooth = true;
-						}
-					}
-				}
-			}
+			pinpadModel = ans.model;
 		}
 		else if(rc == Error_NotInit)
 		{
-			if (!HasPinPad())
-				isPinPadMac = false;
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pinpad NOT INIT!, state: %d", ans.state);
-			return nRet; //此时nRet = -1, pinpad调用失败
+			strErrMsg = "PinPad打开失败";
+			SetAuthErrMsg(strErrMsg.GetData());
+
+			string outStr = GetOutPutStr("%s%08X%s%s", "GetDevInfo", rc, "strErrMsg", strErrMsg.GetData());
+			m_FSM.doWarnMsg(ERR_ACCESSAUTH_FROM_PINPAD, outStr.c_str());
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5205")(outStr.c_str());
+			return nRet; 
 		}
 		else
 		{
-			if (!HasPinPad())
-				isPinPadMac = false;
 			strErrMsg = "调用PinPad实体的GetDevInfo方法失败";
 			SetAuthErrMsg(strErrMsg.GetData());
 
@@ -989,15 +761,29 @@ int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimp
 			m_FSM.doWarnMsg(ERR_ACCESSAUTH_FROM_PINPAD, outStr.c_str());
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5205")(outStr.c_str());
 			
-			return nRet; //此时nRet = -1, pinpad调用失败
+			return nRet;
 		}
 
 		pPinPadClient->GetFunction()->CloseSession();
 	}
+	else if (rc == Error_NetBroken)
+	{
+		strErrMsg = "PinPad实体未启动, 连接密码键盘失败";
+		SetAuthErrMsg((const char*)strErrMsg);
+
+		m_FSM.doWarnMsg(ERR_ACCESSAUTH_CONNECT_PINPAD_UNLOAD,
+			GetOutPutStr("%s%08X%s%s", "Connect", rc, "strErrMsg", "PinPad实体未启动, 连接密码键盘失败").c_str());
+		pPinPadClient->SafeDelete();
+
+		errInfo["errcode"] = "RTA5218";
+		errInfo["msg"] = "PinPad实体未启动";
+		errInfo["getLastErr"] = GetLastError();
+		pinpadModel = generateJsonStr(errInfo).second.c_str();
+
+		return nRet; 
+	}
 	else
 	{
-		if (!HasPinPad())
-			isPinPadMac = false;
 		strErrMsg = "连接PinPad实体失败";
 		SetAuthErrMsg((const char*)strErrMsg);
 
@@ -1006,39 +792,16 @@ int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimp
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5204")("连接密码键盘异常");
 		pPinPadClient->SafeDelete();
 
+		errInfo["errcode"] = "RTA5204";
+		errInfo["msg"] = "PinPad实体启动成功,但连接PinPad实体失败";
+		errInfo["getLastErr"] = GetLastError();
+		pinpadModel = generateJsonStr(errInfo).second.c_str();
+
 		return nRet; //此时nRet = -1, pinpad调用失败
 	}
 
 	pPinPadClient = NULL;
 
-	if (bPinPadID)
-	{
-		if (bVendor)
-			strPinPadID = strVendor + "_" + strPID;
-		else
-			strPinPadID = strPID;
-
-		nRet += 1;
-	}
-
-	if (bDeviceID)
-	{
-		if (bVendor)
-			strDeviceID = strVendor + "_" + strMID;
-		else
-			strDeviceID = strMID;
-
-		if (bBluetooth)
-			strDeviceID = strDeviceID + "_" + strBluetoothID;
-
-		nRet += 2;
-	}
-	else if (bBluetooth)
-	{
-		strDeviceID = strDeviceID + "_" + strBluetoothID;
-		nRet += 2;
-	}
-
 	return nRet;
 }
 
@@ -1248,89 +1011,30 @@ bool CAccessAuthEntity::SendInitMKReqACS(CInitlizerMKReq& initMKReq)
 {
 	LOG_FUNCTION();
 	CSmartPointer<IEntityFunction> pFunc = GetFunction();
-	CSimpleStringA strPinPadID = "", strDeviceID = "";
-	bool isPinPadMac, bPinPadOnline;
-	int nRet = GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, isPinPadMac, bPinPadOnline);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPinPadIDAndDeviceID ret: %d, PinPadID: %s, DeviceID: %s", nRet, strPinPadID.GetData(), strDeviceID.GetData());
-
-	if (nRet < 0)
-	{
-		return false; //具有pinpad的设备调用pinpad失败
+	ErrorCodeEnum nRet = Error_Unexpect;
+
+	CBlob encInfo;
+	char* hexStr = "21009872C31CBC00D0C8F421D09CF707";
+	BYTE key[KEY_SIZE] = { 0 };
+	memcpy(key, ConvertHexStrToBytes(hexStr), KEY_SIZE);
+	//char key[KEY_SIZE] = { 0 };
+	//memcpy(key, "1234567890123456234", KEY_SIZE);
+	nRet = (ErrorCodeEnum)m_FSM.GetEncTerminalInfoWithKey(encInfo, key);
+	if (nRet != Error_Succeed)
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetEncTerminalInfo failed:%d", nRet);
+		return false;
 	}
-
-	// 从系统获取设备信息和硬件信息	
-	// 变长结构初始化
-	char buf2[512];
-	memset(buf2, 0, 512);
+	char* pTmp = Str2Hex((char*)encInfo.m_pData, encInfo.m_iLength);
+	initMKReq.iniTerminalInfo = pTmp;
 
 	CSystemStaticInfo si;
 	pFunc->GetSystemStaticInfo(si);
-
-	initMKReq.enrolGPS = "00000A4500000A4E";//oiltmp
-	initMKReq.enrolAddr = si.strEnrolAddr;
-	initMKReq.installVersion = si.InstallVersion.ToString();
-
-#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);
-		initMKReq.ip = xIP;
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ip:%s", xIP);
-	}
-#else
-	BYTE xIP[64] = {};
-	char ip[32] = { 0 };
-	if (getIPFromLinux(ip)) DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get IP From Linux Error ex.");
-	else {
-		if (ip2byte(ip, xIP)) DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Ip 2 Byte Error");
-		else {
-			for (int i = 0; i < 4; i++) {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ip[%d]=%d", i, xIP[i]);
-			}
-			char strIP[64];
-			memset(strIP, 0, 64);
-			sprintf(strIP, "%d.%d.%d.%d", xIP[0], xIP[1], xIP[2], xIP[3]);
-			initMKReq.ip = strIP;
-		}
-	}
-#endif // RVC_OS_WIN
-
-	initMKReq.machineType = si.strMachineType;
-
-	if (nRet == 2 || nRet == 3)
-		initMKReq.padDeviceID = strDeviceID;
-	initMKReq.site = si.strSite;
-	initMKReq.terminalNo = si.strTerminalID;
-
-	BYTE fingerPrint[32] = { 0 };
-	int nBufLen = sizeof(fingerPrint);
-	if (!GetTerminalFingerPrint(fingerPrint, nBufLen))
-	{
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
-			GetOutPutStr("%s%s", "GetTerminalFingerPrint", "False").c_str());
-		return ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT;
-	}
-	initMKReq.terminalCharacter = ConvertBytesToHexStr(fingerPrint, nBufLen);
-
-	if (nRet == 1 || nRet == 3)
-		initMKReq.pinPadID = strPinPadID;
+	initMKReq.terminalVersion = si.InstallVersion.ToString();
+	initMKReq.terminalNo = si.strTerminalID.GetData();
 
 	BYTE xPublicKey[148];
-	nBufLen = sizeof(xPublicKey);
+	int nBufLen = sizeof(xPublicKey);
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SendInitMKReqACS")("开始获取公钥。。。");
 	memset(xPublicKey, 0, nBufLen);
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SendInitMKReqACS")("nBufLen=%d", nBufLen);
@@ -1338,10 +1042,10 @@ bool CAccessAuthEntity::SendInitMKReqACS(CInitlizerMKReq& initMKReq)
 	{
 		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY,
 			GetOutPutStr("%s%s", "GetTerminalPublicKey", "False").c_str());
-		return ERR_ACCESSAUTH_GET_TERMINAL_PUBKEY;
+		return false;
 	}
+
 	initMKReq.user = m_strUserID.GetData();
-	initMKReq.password = m_strPassword.GetData();
 	if (!m_strUserID.IsNullOrEmpty() && !m_strPassword.IsNullOrEmpty())
 	{
 		LogWarn(Severity_Low, Error_Succeed, AccessAuthorization_UserErrorCode_Init_From_ClosePage, "Init by ClosePage.");
@@ -1367,8 +1071,8 @@ bool CAccessAuthEntity::SendInitMKReqACS(CInitlizerMKReq& initMKReq)
 		errRc = (*pPinPad)(EntityResource::getLink().upgradeLink())->GetCheckCode(req, ans, 10000);
 		if (errRc == Error_Succeed)
 		{
-			initMKReq.tpkKeyCheck = ans.checkcode[0].GetData();
-			initMKReq.keyIndex = ans.index[0].GetData();
+			initMKReq.curTpkKeyCheck = ans.checkcode[0].GetData();
+			initMKReq.curKeyIndex = ans.index[0].GetData();
 		}
 		else
 		{
@@ -1395,7 +1099,7 @@ void CAccessAuthEntity::EndInitMK(DWORD rc, const char *pszErrMsg)
 
 	if (rc != Error_Succeed)
 	{
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_INITIALIZER_FAILED,
+		LogWarn(Severity_Middle, Error_Unexpect, rc,
 			GetOutPutStr("%s%08X%s%s", "EndInitMK", rc,"pszErrMsg", pszErrMsg).c_str());
 
 		GetFunction()->ShowFatalError(pszErrMsg);
@@ -1579,132 +1283,6 @@ pair<string, string> CAccessAuthEntity::EncryptedByPubKey(CSimpleStringA pubKey,
 	return make_pair(pBlock, strRam);
 }
 
-#ifdef RVC_OS_WIN
-void CAccessAuthEntity::GetTermSysInfo()
-{
-	//oilyang@20231008 to get system info from runcfg first
-	//no matter calculating from runcfg succeed or not,we also get system info from system api for update runcfg
-	bool bCalcFromRunCfg = false;
-	CSimpleString csInfo, strErrMsg, strRet;
-	CSmartPointer<IConfigInfo> pConfigRun;
-	ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, pConfigRun);
-	if (eErr == Error_Succeed && pConfigRun->ReadConfigValue("system", "info", csInfo) == Error_Succeed && !csInfo.IsNullOrEmpty()) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read device info from runcfg: [%s]", csInfo.GetData());
-
-		ZeroMemory(m_btTermSysInfoSM3, sizeof(m_btTermSysInfoSM3));
-		if (!SM3Hash(reinterpret_cast<BYTE*>(const_cast<char*>(csInfo.GetData())), csInfo.GetLength(), m_btTermSysInfoSM3))
-		{
-			strErrMsg = "get sm3 hash as fingerprint fail";
-			SetAuthErrMsg((const char*)strErrMsg);
-			this->GetFunction()->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
-			LogWarn(Severity_Middle, Error_Unexpect, ERROR_ACCESSAUTH_GETSM3HASH, (const char*)strErrMsg);
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("GetTerminalFingerPrint")((const char*)strErrMsg);
-			m_iGetTermSysInfo = -1;
-		}
-		else
-		{
-			m_iGetTermSysInfo = 1;
-			bCalcFromRunCfg = true;
-		}
-	}
-	else
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTermSysInfo, OpenConfig Config_Run error=%d.", eErr);
-
-	ULONGLONG ullStart = GetTickCount64();
-	char szTmp[1024] = {};
-	int nTmpBufLen = 1024;
-	CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
-
-	if (!QueryWMIDevice(Processor, "ProcessorId", szTmp, &nTmpBufLen))
-	{
-		strErrMsg = CSimpleStringA::Format("查询 cpu id 失败: %d, 请尝试重启应用", GetLastError());
-		SetAuthErrMsg((const char*)strErrMsg);
-
-		LogWarn(Severity_Middle, Error_Unexpect,ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT, 
-			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
-		
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
-			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
-		if (!bCalcFromRunCfg)
-			m_iGetTermSysInfo = -1;
-		return;
-	}
-	strRet = szTmp;
-
-	nTmpBufLen = 1024;
-	memset(szTmp, 0, sizeof(szTmp));
-	if (!QueryWMIDevice(BaseBoard, "SerialNumber", szTmp, &nTmpBufLen))
-	{
-		strErrMsg = CSimpleStringA::Format("查询 baseboard sn 失败: %d, 请尝试重启应用", GetLastError());
-		SetAuthErrMsg((const char*)strErrMsg);
-
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
-			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
-			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
-		if (!bCalcFromRunCfg)
-			m_iGetTermSysInfo = -1;
-		return;
-	}
-
-	strRet += "|";
-	strRet += szTmp;
-
-	nTmpBufLen = 1024;
-	memset(szTmp, 0, sizeof(szTmp));
-	if (!QueryWMIDevice(DiskDrive, "SerialNumber", szTmp, &nTmpBufLen))
-	{
-		strErrMsg = CSimpleStringA::Format("查询 harddisk sn 失败: %d, 请尝试重启应用", GetLastError());
-		SetAuthErrMsg((const char*)strErrMsg);
-
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
-			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str());
-		if (!bCalcFromRunCfg)
-			m_iGetTermSysInfo = -1;
-		return;
-	}
-
-	strRet += "|";
-	strRet += szTmp;
-
-	if (!bCalcFromRunCfg || csInfo.Compare(strRet) != 0)
-	{
-		eErr = pConfigRun->WriteConfigValue("system", "info", strRet.GetData());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("device info changed,before[%s],current[%s],write to runcfg:%d"
-			, csInfo.GetData(), strRet.GetData(), eErr);
-	}
-	else
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("device info: [%s]", strRet.GetData());
-
-	
-	if (!bCalcFromRunCfg)
-	{
-		ZeroMemory(m_btTermSysInfoSM3, sizeof(m_btTermSysInfoSM3));
-		if (!SM3Hash(reinterpret_cast<BYTE*>(const_cast<char*>(strRet.GetData())), strRet.GetLength(), m_btTermSysInfoSM3))
-		{
-			strErrMsg = "get sm3 hash as fingerprint fail";
-			SetAuthErrMsg((const char*)strErrMsg);
-			spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
-			m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETSM3HASH, (const char*)strErrMsg);
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)((const char*)strErrMsg);
-			m_iGetTermSysInfo = -1;
-		}
-		else
-			m_iGetTermSysInfo = 1;
-	}
-	ULONGLONG ullEnd = GetTickCount64();
-	if (ullEnd - ullStart > 5000)
-	{
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5201")
-			("获取系统信息耗时过长:%d秒", (ullEnd - ullStart) / 1000);
-		LogWarn(Severity_Middle, Error_Unexpect, AccessAuthorization_UserErrorCode_GetTermCostTooLong, 
-			CSimpleStringA::Format("获取系统信息耗时过长:%d秒", (ullEnd - ullStart) / 1000));
-	}
-	return;
-}
-#endif // RVC_OS_WIN
-
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CAccessAuthEntity)
 SP_END_ENTITY_MAP()

+ 7 - 7
Module/mod_accessauth/mod_AccessAuth.h

@@ -8,6 +8,9 @@ using namespace AccessAuthorization;
 
 #include "AccessAuthFSM.h"
 
+#define KEY_SIZE 16
+#define BUF_SIZE 256
+
 int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len);
 int StrBuf2HexBuf(LPCTSTR strBuf, PBYTE* hexBuf);
 
@@ -89,8 +92,8 @@ public:
 	// 保存会话密钥
 	bool SaveAuthKey(BYTE* pKey);
 
-	// 调用准入会话密钥加密
-	ErrorCodeEnum EncryptDataWithSessionKey(const CBlob& raw, CBlob& enc);
+	// 调用指定密钥加密
+	ErrorCodeEnum EncryptDataWithKey(const CBlob& raw, CBlob& enc, BYTE* key);
 
 	bool GetTerminalFingerPrint(BYTE* pBuf, int& nBufLen);
 	bool GetTerminalPublicKey(BYTE* pBuf, int& nBufLen, string& pubkey);
@@ -98,10 +101,8 @@ public:
 	void SetAuthErrMsg(const char* pszErrMsg) { m_strAuthErrMsg = pszErrMsg; }
 	const char* GetAuthErrMsg() { return m_strAuthErrMsg; }
 
-	// 获取密码键盘ID和外设ID
-	//oilyang@20210510 add:in order to avoid getting info out of async, check if has pinpad while getting info
-	// 返回1:只有PinPadID;2:只有DeviceID;3:两者都有;0:失败
-	int GetPinPadIDAndDeviceID(CSimpleStringA& strPinPadID, CSimpleStringA& strDeviceID, bool& isPinPadMac, bool& bPinPadOnline);
+	// 获取密码键盘szModel
+	ErrorCodeEnum GetPinPadModel(CSimpleStringA& pinpadModel, bool& bPinPadOnline);
 
 	// 设置时区
 	wstring ANSIToUnicode(const string& str);
@@ -130,7 +131,6 @@ public:
 	SpReqAnsContext<AccessAuthService_InitializeNew_Req, AccessAuthService_InitializeNew_Ans>::Pointer m_ctx;
 	pair<string, string> GenerateTmkToKMC();
 	pair<string, string> EncryptedByPubKey(CSimpleStringA pubKey, bool bNeed04Head = false);
-	void GetTermSysInfo();
 
 	CSimpleStringA m_publicKey;
 	CSimpleStringA m_privateKey;

+ 20 - 38
Module/mod_cardissuerstore/CardIssuerFSM.cpp

@@ -67,7 +67,7 @@ void CCardIssuerFSM::s0_on_entry()
 {
 	LOG_FUNCTION();
 	m_currentFSMState = 0;
-	SetDevStateAndSendMsg(DEVICE_STATUS_NOT_READY);
+	SetDevState(DEVICE_STATUS_NOT_READY);
 	FSMEvent *e;
 	e = new FSMEvent(USER_EVT_INIT);
 	PostEventFIFO(e);
@@ -138,7 +138,7 @@ void CCardIssuerFSM::s2_on_entry()
 
 	ToLogWarnInfoAboutTerm();
 	m_currentFSMState = 2;
-	SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL, false);
+	SetDevState(DEVICE_STATUS_NORMAL);
 	
 	m_resetTimes = 0;
 	m_testResult = Error_Succeed;
@@ -1078,7 +1078,7 @@ void CCardIssuerFSM::s9_on_entry()
 {
 	LOG_FUNCTION();
 	m_currentFSMState = 9;	
-	SetDevStateAndSendMsg(DEVICE_STATUS_FAULT);
+	SetDevState(DEVICE_STATUS_FAULT);
 	if (m_quickSelfcheck) {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer in fault state, need to quickSelfcheck.");
 		m_testResult = Error_InvalidState;
@@ -1384,24 +1384,20 @@ unsigned int CCardIssuerFSM::s19_on_event(FSMEvent* pEvt)
 ErrorCodeEnum CCardIssuerFSM::OnInit()
 {
 	LOG_FUNCTION();
-
 	m_pCardProcess = new CCardProcess();
 	if (m_pCardProcess == NULL)//almost no use...
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("create card process failed.");
 		return Error_Resource;
 	}
-	m_csDevSN = "";
 	CSystemStaticInfo sysInfo;
 	//oilyang 20160331
 	//so many function always return Error_Succeed,so is useless to process it.
-	m_csMachineType = m_csSite = m_terminalNo = "";
+	m_csMachineType = m_terminalNo = "";
 	GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
 	m_csMachineType = sysInfo.strMachineType;
-	m_csSite = sysInfo.strSite;
 	m_terminalNo = sysInfo.strTerminalID;
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuer, MachineType:%s, Site:%s, TerminalNo:%s",
-		m_csMachineType.GetData(), m_csSite.GetData(), m_terminalNo.GetData());
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuer, MachineType:%s, TerminalNo:%s",m_csMachineType.GetData(), m_terminalNo.GetData());
 #ifdef RVC_OS_WIN
 	//如果是东信卡库,将CardLibDB_CMB.db3文件拷贝到运行时中,若运行时已存在该文件,不再拷贝
 	if(!m_csMachineType.Compare("RVC.CardStore", true))
@@ -1819,7 +1815,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 	}
 	long l_beginTime,l_endTime;
 	do {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CreateDevComponent suc. m_port:%d, m_baudRate:%d, pDevSN:%s",
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CreateDevComponent suc. port:%d, baudRate:%d, pDevSN:%s",
 			m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt(), pDevSN);
 
 		l_beginTime = GetTickCountRVC();
@@ -1830,7 +1826,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpenEx").setCostTime(l_endTime - l_beginTime)("OpenDevice::DevOpenEx, openType:%d, connectType:%d", btOpenType, m_connectType);
 			ToLogRootINIInfo();
-			m_bOpened = true;
+			SetDevInitFlag();
 			m_devOpenFailedCount = 0;
 			ZeroMemory(m_devCat.szModel, sizeof(m_devCat.szModel));
 			ZeroMemory(m_devCat.szType, sizeof(m_devCat.szType));
@@ -2058,7 +2054,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		}
 		else
 		{
-			m_bOpened = false;
+			SetDevInitFlag(false);
 			LogWarn(Severity_Middle, Error_Unexpect, CardIssuerStore_UserErrorCode_Open_Failed, "启动后检查卡机状态失败");
 			return Error_Unexpect;
 		}
@@ -2073,7 +2069,7 @@ int CCardIssuerFSM::Initial()
 	{
 		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("OpenDevice in Initial return failed with errCode:%d(0x%x)", errCode, errCode);
 		CloseAndClearDevObj(false);
-		m_bOpened = false;
+		SetDevInitFlag(false);
 		m_bOpening = false;
 		return 1;
 	}
@@ -2282,7 +2278,7 @@ int CCardIssuerFSM::IssueCard(SpReqAnsContext<CardIssuerStoreService_IssueEx_Req
 			&& ((m_bHasHopper[3] && m_mixedEx[1] >= 3) || !m_bHasHopper[3])
 			&& ((m_bHasHopper[4] && m_mixedEx[1] >= 3) || !m_bHasHopper[4])
 			&& ((m_bHasHopper[5] && m_mixedEx[1] >= 3) || !m_bHasHopper[5]))
-			SetDevStateAndSendMsg(DEVICE_STATUS_MAINTAINCE);
+			SetDevState(DEVICE_STATUS_MAINTAINCE);
 
 		errMsg = CSimpleStringA::Format("the current card hopper %d may be wrong.mixedEx:%d",
 			m_currentHopper, m_mixedEx[m_currentHopper-1]);
@@ -2508,7 +2504,7 @@ int CCardIssuerFSM::CaptureCard(SpReqAnsContext<CardIssuerStoreService_Capture_R
 	}
 	else {
 		if (ctx != NULL){
-			if (m_iInWhatPage == PageType_Other) {
+			if (m_iInWhatPage == PageType_Other) { //TODO: 这里本应使用IsInBusiness()替换,但实体重新实现了该函数,待确认
 				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI("DevAdapter::MoveCard").setLogCode("QLR040222004").setResultCode("RTA2W07")("吞卡失败,请检查吞卡箱是否已满或联系厂商检查是否有吞卡");
 				LogError(Severity_Middle, Error_Unexpect, 0x22000034, "CaptureCard failed");
 			}
@@ -2966,7 +2962,7 @@ int CCardIssuerFSM::ReadCard_Contact(SpReqAnsContext<CardIssuerStoreService_Read
 						SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
 					}
 					else {
-						SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL);
+						SetDevState(DEVICE_STATUS_NORMAL);
 					}
 				}
 			}
@@ -3242,7 +3238,7 @@ int CCardIssuerFSM::ReadCard_RF(SpReqAnsContext<CardIssuerStoreService_Read_Req,
 						SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
 					}
 					else {
-						SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL);
+						SetDevState(DEVICE_STATUS_NORMAL);
 					}
 				}
 			}
@@ -3890,7 +3886,7 @@ int CCardIssuerFSM::PreOnline_Contact(SpReqAnsContext<CardIssuerStoreService_Pre
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnline>, set %d card mixed %d,%d", m_currentHopper, bSetMix, m_mixedEx[m_currentHopper - 1]);
 				}
 				else {
-					SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL);
+					SetDevState(DEVICE_STATUS_NORMAL);
 				}
 			}
 		}
@@ -4696,7 +4692,7 @@ bool CCardIssuerFSM::SetCardMixed(const int num, const int hopper)
 		return false;
 	}
 	if (num == 0)
-		SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL);
+		SetDevState(DEVICE_STATUS_NORMAL);
 	else
 	{
 		CSimpleStringA errMsg = CSimpleStringA::Format("the current card hopper %d may be wrong.mixedEx:%d",
@@ -4792,14 +4788,7 @@ int CCardIssuerFSM::QueryCardInfo()
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("QueryCardInfo, ret:%d", ret);
 	return ret;
 }
-int CCardIssuerFSM::SetDevStateAndSendMsg(const DevStateEnum eState, bool bForceSend)
-{
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetDevStateAndSendMsg, m_eDevState:%d, eState:%d, bForceSend:%d", m_eDevState, eState, bForceSend);
-	if(m_eDevState != eState || bForceSend) {
-		m_eDevState = eState;
-	}
-	return 0;
-}
+
 static char DecCh2HexCh(BYTE c)
 {
 	if (c >= 0x0 && c <= 0x9)
@@ -4859,7 +4848,7 @@ int CCardIssuerFSM::SyncDataToDB(bool bMaintain[12], bool bSetCaptured)
 	info.dwCardBoxNum = m_hopperNum;
 	info.strDeviceNo = m_terminalNo;
 
-	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<SyncDataToDB>, to init sync info, CardBox Num:%d, m_csDevSN:%s", info.dwCardBoxNum, info.strDeviceNo.GetData());
+	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<SyncDataToDB>, to init sync info, CardBox Num:%d, DeviceNo:%s", info.dwCardBoxNum, info.strDeviceNo.GetData());
 	info.arrMaintainFlag.Init(m_hopperNum+1);
 	info.arrMaintainer.Init(m_hopperNum+1);
 	info.arrMaintainTime.Init(m_hopperNum+1);
@@ -5133,7 +5122,7 @@ bool CCardIssuerFSM::RegistCardWhileCaptureCard(CSimpleStringA cardno)
 
 	qRegistCardReq.swallowDate = csDate;
 	qRegistCardReq.swallowTime = csTime;
-	qRegistCardReq.deviceSciNo = m_csDevSN;
+	qRegistCardReq.deviceSciNo = "";
 	qRegistCardReq.terminalNo = m_terminalNo;
 	qRegistCardReq.terminalType = m_csMachineType;
 	//qRegistCardReq.m_url = "http://55.13.170.50:8080/defa-gateway/dee1/EacQuery/queryByEac";
@@ -5964,7 +5953,6 @@ int CCardIssuerFSM::IssueCardFromStore(SpReqAnsContext<CardIssuerStoreService_Is
 						//DWORD dwTmpUserErrCode = TryMapAPIRetToUEC(eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_BACK_NOT_HOLD, bTrans);
 						//bTrans ? AlarmDEC() : dwTmpUserErrCode = GetAlarmDEC();
 						//DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402220A3").setResultCode("RTA2W07")("吞卡失败");
-						//SetErrPackage("IssueCardFromStore capture card failed:", m_csDevSN, eErr, dwTmpUserErrCode);
 
 						bool bTrans = true;
 						DWORD dwTmpUserErrCode = TryMapAPIRetToUEC(eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_BACK_NOT_HOLD, bTrans);
@@ -6202,7 +6190,6 @@ int CCardIssuerFSM::AddCardToStoreStepFirst(SpReqAnsContext<CardIssuerStoreServi
 		{
 			//bool bTrans = true;
 			//DWORD dwTmpUserErrCode = TryMapAPIRetToUEC(eErr, CardIssuerStore_UserErrorCode_CaptureCard_AddCard_ReadFailed, bTrans);
-			//SetErrPackage("AddCardToStoreStepFirst::ReadAccount", m_csDevSN, eErr, dwTmpUserErrCode);
 			//bTrans ? AlarmDEC() : dwTmpUserErrCode = AlarmDEC();
 			bool bTrans = true;
 			DWORD dwTmpUserErrCode = 0;
@@ -7026,7 +7013,6 @@ int CCardIssuerFSM::SplitDevModelInfo()
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<SplitDevModelInfo>, Wrong szModel:%s", m_devCat.szModel);
 		return -1;
 	}
-	m_csCM = "";
 	m_csRF = "";
 	CSimpleStringA csTmpModel(m_devCat.szModel);
 	CAutoArray<CSimpleStringA> arrParam;
@@ -7034,10 +7020,6 @@ int CCardIssuerFSM::SplitDevModelInfo()
 	arrParam = csTmpModel.Split('#');
 	for (int i = 0; i < arrParam.GetCount(); ++i)
 	{
-		if (_strnicmp(arrParam[i], "CM", 2) == 0)
-		{
-			m_csCM = arrParam[i].SubString(3, arrParam[i].GetLength() - 3);
-		}
 		if (_strnicmp(arrParam[i], "RF", 2) == 0)
 		{
 			if (arrParam[i].GetLength() > 3) {
@@ -7058,7 +7040,7 @@ void CCardIssuerFSM::CloseAndClearDevObj(bool bCheckConnecting, bool bCloseOnly)
 	if (m_hDevHelper != nullptr && !bCloseOnly)
 	{
 		m_hDevHelper.TearDown();
-		m_bOpened = false;//硬件适配器关闭,则设置打开失败
+		SetDevInitFlag(false);//硬件适配器关闭,则设置打开失败
 	}
 }
 
@@ -9205,7 +9187,7 @@ int CCardIssuerFSM::ReadMag(SpReqAnsContext<CardIssuerStoreService_ReadJS_Req, C
 				if (m_issueStatus)
 				{
 					//设置为mixed从读卡失败恢复为成功时才触发同步计数和写运行时
-					SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL);
+					SetDevState(DEVICE_STATUS_NORMAL);
 				}
 			}
 			if (_strnicmp(track2Data.t2Account, ddd, strlen(ddd)) && (track2Data.t2Account.GetLength() != 8))

+ 7 - 16
Module/mod_cardissuerstore/CardIssuerFSM.h

@@ -1113,12 +1113,12 @@ public:
 	//,m_pTACReject(NULL),m_pIACOnline(NULL),m_pTACOnline(NULL),m_pIACDefault(NULL),m_pTACDefault(NULL)
 	,m_bCDA(false),m_pDataToARQC(NULL),m_bIssuingExit(false)
 	,m_bCardIssued(false),m_issueStatusFromFile(1),m_issueStatus(1),m_currCardNo("")
-	, m_captureReason(""), m_machineType(1), m_csDevSN(true)
+	, m_captureReason(""), m_machineType(1)
 	, m_currentHopper(1), m_hopperNum(1), EncypteDukptHSM(NULL)
 	, m_bSettingMaterial(false)
 	, m_maxSlot(0), m_addCardNo(""), m_addCardSerial(""), m_hasCardWhileDevOpen(false)
 	, m_bChannelOK(false), m_bCancelByRFIC(false), m_devOpenFailedCount(0)
-			, m_iInWhatPage(PageType_Init), m_EacQueryHost(""),m_eacQueryFlag(0), m_bUseCardnoMismatch(false), m_ICRetryTimes(1)
+			, m_EacQueryHost(""),m_eacQueryFlag(0), m_bUseCardnoMismatch(false), m_ICRetryTimes(1)
 			, m_bCardFromHopper(true), m_bStopUseRF(false),m_rfVendorList(""), m_bUseRFTillNext(false), m_csSwallowCardUrl(""),m_csSyncMaterialUrl(""), m_bNewAnsError(false)
 		, m_bCrossPreOnline(false), m_csMagT2Track(""), m_csMagT3Track(""), m_csMagAccout(""), m_csMagRegion(""), m_csMagCardSerial(""), m_csMagCVC(""), m_csMagExpireDate("")
 		, m_quickSelfcheck(false), m_SelfcheckSleepTime(0)
@@ -1217,7 +1217,7 @@ public:
 	ErrorCodeEnum MachineMoveCardFrontGate(bool bInBussiness=false);
 	
 	void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
-	DevStateEnum GetDevState()
+	DevStateEnum GetDevState() const
 	{
 		if ((m_eDevState == DEVICE_STATUS_NORMAL) 
 			&& ((m_bHasHopper[0] && m_mixedEx[0] >= 3) || !m_bHasHopper[0])
@@ -1228,7 +1228,6 @@ public:
 			return m_eDevState;
 	}
 	int QueryCardInfo();
-	int SetDevStateAndSendMsg(const DevStateEnum eState, bool bForceSend = true);
 	int UpdateLocalRunCfg(CAutoArray<int> hopperArr);
 	int SyncDataToDB(bool bMaintain[12],bool bSetCaptured=true);//同步物料计数
 	void SetHopperNum(int hopperNum);
@@ -1268,10 +1267,6 @@ public:
 	void SetCancelByRFICFlag(bool bCancel = true) { m_bCancelByRFIC = bCancel; }
 	CSimpleStringA GetPreOnlineICCardNo() { return m_currCardNo; }
 	void CloseAndClearDevObj(bool bCheckConnecting = true, bool bCloseOnly = false);
-	bool GetDevInitFlag() { return m_bOpened; }
-	bool GetDevInitingFlag() { return m_bOpening; }
-
-	void SetInWhatPage(int bValue) { m_iInWhatPage = bValue; }
 	void SetEnterMainPage();
 	static void HttpsLogCallBack(const char* logtxt);
 	//0:unknow(havn't access microservice or access failed),1:both mag & ic ,2:mag only,3:ic only
@@ -1299,7 +1294,7 @@ private:
 	ErrorCodeEnum m_testResult;
 
 
-	int m_CardCaptured, m_iInWhatPage/*在哪个页面,区分首页,用户桌面,其他页*/;
+	int m_CardCaptured;
 	int m_issueStatusFromFile, m_issueStatus/*the status maybe changed by Business call*/;
 	//1:default, 2:SCI, 3:no cfg
 	int m_machineType;
@@ -1311,20 +1306,16 @@ private:
 	DWORD m_MaintainTimeEx[HOPPER_NUM];
 	BYTE m_connectType, m_r1[128], m_r2[128], m_r3[128], m_priKey[ONE_K / 2], m_devPubKey[ONE_K / 2], m_bdk[64], m_ksn[64];
 	CardIssuerStatus m_devStatus;
-	DevStateEnum m_eDevState;
 	CCardProcess *m_pCardProcess;
 	CAutoArray<CSimpleStringA> m_aidList;
-	ErrorPackage m_errPkg;
 	pfEncryptDukptHSM EncypteDukptHSM;
 	pfGetEncrypedData GetEncrypedData;
 	char *m_pDataToARQC;
 	long xxTest;
-	CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_csSite, m_csDevSN/*for SCI only*/, m_terminalNo,m_addCardNo,m_addCardSerial
-		,m_csCM, m_rfVendorList, m_csRF;
+	CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_terminalNo,m_addCardNo,m_addCardSerial, m_rfVendorList, m_csRF;
 	char m_AuthCode[2];
 	vector<CMBBin> m_vBin;
 
-
 	UINT64 m_crossStart;
 	int m_bBTChecking;
 	int SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData);
@@ -1340,7 +1331,7 @@ private:
 	bool IfUseRf();
 	CSimpleStringA m_csMagT2Track, m_csMagT3Track, m_csMagAccout, m_csMagRegion, m_csMagCardSerial, m_csMagCVC, m_csMagExpireDate;
 	
-	CSimpleStringA m_csAlarmMsg,m_EacQueryHost, m_csSwallowCardUrl, m_csSyncMaterialUrl;
+	CSimpleStringA m_EacQueryHost, m_csSwallowCardUrl, m_csSyncMaterialUrl;
 	MagTracks m_magTracks;
 	vector<int> m_badSlot;
 	std::map<std::string, JsonElem> m_mapJsonErr;
@@ -1380,7 +1371,7 @@ private:
 		}
 	}
 	CSimpleStringA generateJsonString(std::map<std::string, JsonElem>& objectArr);
-	bool IsInBusiness()
+	bool IsInBusiness() const
 	{
 		return (m_bCrossPreOnline || m_iInWhatPage == PageType_Other);
 	}

+ 1 - 12
Module/mod_cardissuerstore/mod_cardissuer.cpp

@@ -292,21 +292,10 @@ void CCardIssuerEntity::OnSysVarEvent(const char* pszKey, const char* pszValue,
 {
 	if ((_strnicmp(pszKey, "UIState", strlen("UIState")) == 0))
 	{
-		if (_strnicmp(pszValue, "M", strlen("M")) == 0) {
-			m_fsm.SetInWhatPage(PageType_MainPage);
-			m_fsm.SetEnterMainPage();//设置进入首页
-		}
-		else if (_strnicmp(pszValue, "U", strlen("U")) == 0) {
-			m_fsm.SetInWhatPage(PageType_UserDesktop);
-		}
-		else {
-			m_fsm.SetInWhatPage(PageType_Other);
-		}
+		m_fsm.OnUIState4SetWhatPage(pszValue);
 	}
 }
 
-
-
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CCardIssuerEntity)
 SP_END_ENTITY_MAP()

+ 60 - 61
Module/mod_chromium/CWSCodec.cpp

@@ -399,14 +399,14 @@ namespace Chromium {
 		cJSON_AddStringToObject(ret, PARAMLIST_HEAD, dstPayLoad.c_str());
 	}
 
-	std::pair<bool, std::string>  CWSCodec::DeserializeRequestAck(CMessage & msg, std::map<int, entity_def_struct>::iterator & it, int& rpos, cJSON * ret) {
+	std::pair<bool, std::string>  CWSCodec::DeserializeRequestAck(CMessage & msg, std::map<int, entity_def_struct>::iterator & it, int& rpos, cJSON * ret, bool isSafe) {
 		entity_def_struct* p_struct = &it->second;
 		CMedthodInterface* mi = mInterpreter->getFunctionInterface(p_struct->entity_name, p_struct->class_name, p_struct->methodID);
 		CTransStruct ts = mi->mResponseInterpreter;
 
 		try
 		{
-			DeserializeBase(msg, ts, rpos, ret, !mi->m_forceNewReturn);
+			DeserializeBase(msg, ts, rpos, ret, !(mi->m_forceNewReturn || isSafe));
 			return std::make_pair(true, mi->mMethodName);
 		}
 		catch (...)
@@ -430,12 +430,11 @@ namespace Chromium {
 		
 	}
 
-	void CWSCodec::DeserializeEvent(CMessage & msg,
-		std::vector<CMedthodInterface>*list,
-		int& rpos, cJSON * ret) {
+	void CWSCodec::DeserializeEvent(CMessage & msg,	std::vector<CMedthodInterface>*list, int& rpos, cJSON * ret, bool isSafe) {
 		int eventID = msg.getEventID();
 		if (NULL == list || eventID < 0 || eventID >= list->size())
 		{
+			cJSON_DeleteItemFromObject(ret, "errorCode");
 			cJSON_AddNumberToObject(ret, "errorCode", Error_Unexpect);
 			CSimpleStringA errmsg = "";
 			errmsg.Format("Cannot find the eventID = %d!", eventID);
@@ -446,7 +445,7 @@ namespace Chromium {
 		CTransStruct ts = mi->mResponseInterpreter;
 		try
 		{
-			DeserializeBase(msg, ts, rpos, ret, !mi->m_forceNewReturn);
+			DeserializeBase(msg, ts, rpos, ret, !(mi->m_forceNewReturn || isSafe));
 		}
 		catch (...)
 		{
@@ -468,6 +467,44 @@ namespace Chromium {
 		}
 	}
 
+	void CWSCodec::processErrorCode(cJSON* ret, CMessage& msg, int errorCode, socket_msgInfo& msgInfo, int &rpos, bool isSafe) {
+		CSimpleStringA errorMsg = "";
+		ReadT(msg.getPayload(), errorMsg, &rpos);
+		auto userCodeInfo = getErrMsgByRemark(errorMsg.GetData());
+
+		//init msgInfo
+		msgInfo.userCodeVal = errorCode;
+		msgInfo.userCode = userCodeInfo.second.userCode;
+		msgInfo.rtaCode = userCodeInfo.second.VTMCode;
+		msgInfo.warnMsg = userCodeInfo.second.errMsg;
+		
+		cJSON_DeleteItemFromObject(ret, "errorCode");
+		if (isSafe)
+		{
+			if (errorCode == 0)
+				cJSON_AddStringToObject(ret, "errorCode", SUC_RETURN_STR);
+			else
+			{
+				if(userCodeInfo.second.VTMCode.length() > 0)
+					cJSON_AddStringToObject(ret, "errorCode", userCodeInfo.second.VTMCode.c_str());
+				else
+					cJSON_AddStringToObject(ret, "errorCode", "RTA42F1");
+			}
+				
+		}
+		else
+		{
+			cJSON_AddNumberToObject(ret, "errorCode", errorCode);
+			if (userCodeInfo.first != 0) {
+				cJSON_AddNumberToObject(ret, "userCode", userCodeInfo.first);
+				cJSON_AddStringToObject(ret, "rtaCode", userCodeInfo.second.VTMCode.c_str());
+			}
+		}
+
+		cJSON_AddStringToObject(ret, "errorMsg", userCodeInfo.second.errMsg.c_str());
+
+		
+	}
 
 	std::string CWSCodec::BufferToJson(CMessage & msg, boost::function<void(int, int)> dealErrcodeFun, socket_msgInfo& msgInfo, int replaceTransId) {
 		//replaceTransId==0,MessageType为8(Event),其他都应该有值
@@ -481,6 +518,10 @@ namespace Chromium {
 		if (msg.getLength() < 12)	//End session len = 12
 			return std::string(); // 丢弃消息
 
+		bool isSafe = false;
+		auto it = ConfigManager::getInstance().m_ws_infoArr;
+		if (it.find(msgInfo.hdlId) != it.end())
+			isSafe = it[msgInfo.hdlId].isSafe;
 
 		int srcTransId = msg.getTransID();
 		// 通用反序列化
@@ -501,45 +542,14 @@ namespace Chromium {
 #endif
             
 			ReadT(msg.getPayload(), errorCode, &rpos);
-			cJSON_AddNumberToObject(ret, "errorCode", errorCode);
-			ReadT(msg.getPayload(), errorMsg, &rpos);
-			{
-				auto userCodeInfo = getErrMsgByRemark(errorMsg.GetData());
-				if (userCodeInfo.first != 0)
-				{
-					cJSON_AddNumberToObject(ret, "userCode", userCodeInfo.first);
-					cJSON_AddStringToObject(ret, "rtaCode", userCodeInfo.second.VTMCode.c_str());
-				}
-					
-				cJSON_AddStringToObject(ret, "errorMsg", userCodeInfo.second.errMsg.c_str());
-
-				msgInfo.userCodeVal = errorCode;
-				msgInfo.userCode = userCodeInfo.second.userCode;
-				msgInfo.rtaCode = userCodeInfo.second.VTMCode;
-				msgInfo.warnMsg = userCodeInfo.second.errMsg;
-			}
+			processErrorCode(ret, msg, errorCode, msgInfo, rpos, isSafe);
 			msgInfo.sessionId = msg.getSessionID();
 			break;
 		case MessageType::SessionAck:
 			cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
 			cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
 			ReadT(msg.getPayload(), errorCode, &rpos);
-			cJSON_AddNumberToObject(ret, "errorCode", errorCode);
-			ReadT(msg.getPayload(), errorMsg, &rpos);
-			{
-				auto userCodeInfo = getErrMsgByRemark(errorMsg.GetData());
-				if (userCodeInfo.first != 0)
-				{
-					cJSON_AddNumberToObject(ret, "userCode", userCodeInfo.first);
-					cJSON_AddStringToObject(ret, "rtaCode", userCodeInfo.second.VTMCode.c_str());
-				}
-
-				cJSON_AddStringToObject(ret, "errorMsg", userCodeInfo.second.errMsg.c_str());
-				msgInfo.userCodeVal = errorCode;
-				msgInfo.userCode = userCodeInfo.second.userCode;
-				msgInfo.rtaCode = userCodeInfo.second.VTMCode;
-				msgInfo.warnMsg = userCodeInfo.second.errMsg;
-			}
+			processErrorCode(ret, msg, errorCode, msgInfo, rpos, isSafe);
 			msgInfo.inner_transID = srcTransId;
 			msgInfo.sessionId = msg.getSessionID();
 			break;
@@ -553,34 +563,21 @@ namespace Chromium {
 			cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
 			cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
 			ReadT(msg.getPayload(), errorCode, &rpos);
-			cJSON_AddNumberToObject(ret, "errorCode", errorCode);
-			ReadT(msg.getPayload(), errorMsg, &rpos);
-			{
-				auto userCodeInfo = getErrMsgByRemark(errorMsg.GetData());
-				if (userCodeInfo.first != 0)
-				{
-					cJSON_AddNumberToObject(ret, "userCode", userCodeInfo.first);
-					cJSON_AddStringToObject(ret, "rtaCode", userCodeInfo.second.VTMCode.c_str());
-				}
-				cJSON_AddStringToObject(ret, "errorMsg", userCodeInfo.second.errMsg.c_str());
-
-				msgInfo.userCodeVal = errorCode;
-				msgInfo.userCode = userCodeInfo.second.userCode;
-				msgInfo.rtaCode = userCodeInfo.second.VTMCode;
-				msgInfo.warnMsg = userCodeInfo.second.errMsg;
-			}
+			processErrorCode(ret, msg, errorCode, msgInfo, rpos, isSafe);
 			break;
 		case MessageType::GetVarAck:
 			cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
 			cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
 			ReadT(msg.getPayload(), errorCode, &rpos);
-			cJSON_AddNumberToObject(ret, "errorCode", errorCode);
-			ReadT(msg.getPayload(), errorMsg, &rpos);
-			cJSON_AddStringToObject(ret, "value", errorMsg);
+			processErrorCode(ret, msg, errorCode, msgInfo, rpos, isSafe);
 			break;
 		default:
 			errorCode = Error_Unexpect;
-			cJSON_AddNumberToObject(ret, "errorCode", errorCode);
+			cJSON_DeleteItemFromObject(ret, "errorCode");
+			if (isSafe)
+				cJSON_AddStringToObject(ret, "errorCode", RTA_UNKNOW_ERR);
+			else
+				cJSON_AddNumberToObject(ret, "errorCode", errorCode);
 			cJSON_AddStringToObject(ret, "errorMsg", "未知消息类型");
 			break;
 		}
@@ -628,6 +625,7 @@ namespace Chromium {
 			if (m_AckCallbackList.end() == it)
 			{
 				// 没有对应的request,无法反序列化
+				cJSON_DeleteItemFromObject(ret, "errorCode");
 				cJSON_AddNumberToObject(ret, "errorCode", Error_Unexpect);
 				cJSON_AddStringToObject(ret, "errorMsg", "Cannot find the request for the ack!");
 				char* str = getJsonStr(ret);
@@ -636,7 +634,7 @@ namespace Chromium {
 				free(str);
 				return s;
 			}
-			auto deserializeRet = DeserializeRequestAck(msg, it, rpos, ret);
+			auto deserializeRet = DeserializeRequestAck(msg, it, rpos, ret, isSafe);
 			msgInfo.entityName = it->second.entity_name;
 			msgInfo.className = it->second.class_name;
 			msgInfo.functionName = deserializeRet.second;			
@@ -650,6 +648,7 @@ namespace Chromium {
 			if (m_EventCallbackList.end() == iter)
 			{
 				// 没有对应的register, 无法反序列化
+				cJSON_DeleteItemFromObject(ret, "errorCode");
 				cJSON_AddNumberToObject(ret, "errorCode", Error_Unexpect);
 				cJSON_AddStringToObject(ret, "errorMsg", "Cannot find the register for the ack!");
 				char* str = getJsonStr(ret);
@@ -658,7 +657,7 @@ namespace Chromium {
 				free(str);
 				return s;
 			}
-			DeserializeEvent(msg, iter->second, rpos, ret);
+			DeserializeEvent(msg, iter->second, rpos, ret, isSafe);
 		}
 
 		char* str = getJsonStr(ret);

+ 3 - 2
Module/mod_chromium/CWSCodec.h

@@ -85,6 +85,7 @@ namespace Chromium {
 		void setEntityHandler(CSmartPointer<IEntityFunction> p);
 
 		std::pair<int, CMessage*> JsonToBuffer(std::string strJson, ws_msgInfo& msgInf);
+		void processErrorCode(cJSON* ret, CMessage& msg, int errorCode, socket_msgInfo& msgInfo, int& rpos, bool isSafe);
 		std::string BufferToJson(CMessage& msg, boost::function<void(int,int)> dealErrcodeFun, socket_msgInfo &msgInfo, int replaceTransId = 0);
 
 		std::string GetEntityName(std::string strJson);
@@ -92,8 +93,8 @@ namespace Chromium {
 
 		bool checkEntityHasService(std::string entityName);
 	private:
-		std::pair<bool, std::string> DeserializeRequestAck(CMessage& msg, std::map<int, entity_def_struct>::iterator& it, int& rpos, cJSON* ret);
-		void DeserializeEvent(CMessage& msg, std::vector<CMedthodInterface>* list, int& rpos, cJSON* ret);
+		std::pair<bool, std::string> DeserializeRequestAck(CMessage& msg, std::map<int, entity_def_struct>::iterator& it, int& rpos, cJSON* ret, bool isSafe);
+		void DeserializeEvent(CMessage& msg, std::vector<CMedthodInterface>* list, int& rpos, cJSON* ret, bool isSafe);
 		void DeserializeBase(CMessage& msg, CTransStruct& ts, int& rpos, cJSON* ret, bool writeToOldParam);	//解析json->buffer
 
 		char* getJsonStr(cJSON* pJson);

+ 72 - 8
Module/mod_chromium/CWebsocketServer.cpp

@@ -565,9 +565,8 @@ namespace Chromium {
 				dst_js = "";
 			else
 				dst_js = m_esm->Get_getconfig_ack(staticInfo.strTerminalID.GetData()).second;
-			do_send_msg(hdl, dst_js);
-
-			
+			do_send_msg(hdl, dst_js);	
+			return;
 		}
 		else if (ret.first == MessageType::BeginSession)
 			storeEntityWithCLass(m_serializer->GetEntityName(payload), m_serializer->GetClassName(payload));
@@ -668,14 +667,14 @@ namespace Chromium {
 			auto sign = json_deal::getStringFromCjsonObj(pJson.get(), "sign");
 			if (sign.first == false)
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("sign == null");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("sign == null, full json:%s", payload.c_str());
 				return;
 			}
 
 			auto msgData = json_deal::getStringFromCjsonObj(pJson.get(), "msg");
 			if (msgData.first == false)
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("msgData == null");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("msgData == null, full json:%s", payload.c_str());
 				return;
 			}
 
@@ -801,11 +800,66 @@ namespace Chromium {
 		return std::make_pair(dstTransId, dstPayLoad);
 	}
 
+	std::string url_decode(const std::string& str) {
+		std::string decoded_str;
+		for (size_t i = 0; i < str.length(); ++i) {
+			if (str[i] == '%') {
+				if (i + 2 < str.length()) {
+					std::string hex_str = str.substr(i + 1, 2);
+					try {
+						int hex_val = std::stoi(hex_str, nullptr, 16);
+						decoded_str += static_cast<char>(hex_val);
+						i += 2;
+					}
+					catch (const std::invalid_argument& e) {
+						// 处理无效的编码
+						decoded_str += '%';
+					}
+					catch (const std::out_of_range& e) {
+						decoded_str += '%';
+					}
+				}
+				else {
+					decoded_str += '%';
+				}
+			}
+			else if (str[i] == '+') {
+				decoded_str += ' ';
+			}
+			else {
+				decoded_str += str[i];
+			}
+		}
+		return decoded_str;
+	}
+
+	// 解析 query string 的函数
+	std::map<std::string, std::string> parse_query_string(const std::string& query_string) {
+		std::map<std::string, std::string> params;
+		std::stringstream ss(query_string);
+		std::string pair;
+
+		while (std::getline(ss, pair, '&')) {
+			size_t equal_pos = pair.find('=');
+			if (equal_pos != std::string::npos) {
+				std::string key = pair.substr(0, equal_pos);
+				std::string value = pair.substr(equal_pos + 1);
+				params[url_decode(key)] = url_decode(value); // 解码 key 和 value
+			}
+			else if (!pair.empty()) {
+				params[url_decode(pair)] = ""; // 处理只有 key 没有 value 的情况
+			}
+		}
+		return params;
+	}
 
 	void CWebsocketServer::open_handler(websocketpp::connection_hdl hdl) {
 		// hand shake here
 		server::connection_ptr con = m_wsserver.get_con_from_hdl(hdl);
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new ws connection to ws server : %u, isSecure:%d, url:%s", hdl.lock().get(), con->get_uri()->get_secure(), con->get_uri()->str().c_str());
+		std::string query_str = con->get_uri()->get_query();
+		auto params = parse_query_string(query_str);
+		if (params.find("name") != params.end())
+			ConfigManager::getInstance().m_ws_infoArr[(long)hdl.lock().get()] = websocket_info(params["name"], false);
 		LogManager::getInstance().logWebSocketBuild((uint64_t)hdl.lock().get(), con->get_uri()->str(), "unsafe");
 		ConfigManager::getInstance().m_connection_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>((long)hdl.lock().get(), hdl));
 	}
@@ -813,8 +867,11 @@ namespace Chromium {
 	void CWebsocketServer::open_handler_wss(websocketpp::connection_hdl hdl) {
 		// hand shake here
 		auto con = m_server_wss.get_con_from_hdl(hdl);
+		std::string query_str = con->get_uri()->get_query();
+		auto params = parse_query_string(query_str);
+		if (params.find("name") != params.end())
+			ConfigManager::getInstance().m_ws_infoArr[(long)hdl.lock().get()] = websocket_info(params["name"], true);
 		unsigned int dstHdl = (long)hdl.lock().get();//start from 0, be different from ws
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new wss connection to ws server : %u, isSecure:%d, url:%s", dstHdl, con->get_uri()->get_secure(), con->get_uri()->str().c_str());
 		LogManager::getInstance().logWebSocketBuild((uint64_t)hdl.lock().get(), con->get_uri()->str(), "wss");
 		ConfigManager::getInstance().m_connection_wss_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>((long)dstHdl, hdl));
 	}
@@ -823,7 +880,10 @@ namespace Chromium {
 		// hand shake here
 		auto con = m_ws_sm2_server.get_con_from_hdl(hdl);
 		unsigned int dstHdl = (long)hdl.lock().get();//start from 0, be different from ws
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new ws by encrypt connection to ws server : %u, isSecure:%d, url:%s", dstHdl, con->get_uri()->get_secure(), con->get_uri()->str().c_str());
+		std::string query_str = con->get_uri()->get_query();
+		auto params = parse_query_string(query_str);
+		if (params.find("name") != params.end())
+			ConfigManager::getInstance().m_ws_infoArr[(long)hdl.lock().get()] = websocket_info(params["name"], true);
 		LogManager::getInstance().logWebSocketBuild((uint64_t)hdl.lock().get(), con->get_uri()->str(), "ws_sm2");
 		ConfigManager::getInstance().m_connection_ws_sm2_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>(dstHdl, hdl));
 		ConfigManager::getInstance().m_ws_sm2_hdls_manager.insert(std::make_pair(dstHdl, new SM2_Encrypt_Manager()));
@@ -1313,6 +1373,7 @@ namespace Chromium {
 			for (auto i = sendArr.begin(); i != sendArr.end(); i++)
 			{
 				msg.setTransID(i->first);
+				cur_from_socket.hdlId = i->second;
 				std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), cur_from_socket, 0);
 				do_sendJson(js, msg.getMessageType(), i->second, id, cur_from_socket);
 				unaccurate_js = js;
@@ -1362,6 +1423,7 @@ namespace Chromium {
 			}
 			if (0 != hdlID)
 			{//hdlId为0时,说明本地发起的session
+				cur_from_socket.hdlId = hdlID;
 				std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), cur_from_socket, replaceTransId);
 				do_sendJson(js, msg.getMessageType(), hdlID, id, cur_from_socket);	//发给首记录的CMessage
 			}
@@ -1398,6 +1460,7 @@ namespace Chromium {
 		else
 		{
 			m_esm->AckProcess(&msg, hdlID); //替换真实的transId,update session map
+			cur_from_socket.hdlId = hdlID;
 			std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), cur_from_socket, replaceTransId);
 			do_sendJson(js, msg.getMessageType(), hdlID, id, cur_from_socket);
 		}
@@ -1576,6 +1639,7 @@ namespace Chromium {
 
 			// Initialize Asio
 			m_wsserver.init_asio(&m_ios);
+			m_wsserver.set_reuse_addr(true);
 
 
 			// Set the default message handler to the echo handler

+ 122 - 52
Module/mod_chromium/baseEx.cpp

@@ -366,7 +366,7 @@ std::pair<unsigned long, ErrMsgStruct> getErrMsgByRemark(std::string srcMsg)
 {
 	const std::string headerStr = "UserError=";
 	if (srcMsg.find(headerStr) != 0)
-		return std::make_pair(0, ErrMsgStruct("", srcMsg, ""));
+		return std::make_pair(0, ErrMsgStruct("RTA42F1", CSimpleString::Format("[RTA42F1]错误映射异常|(%s)", srcMsg.c_str()).GetData(), ""));
 
 	unsigned long userCode = std::stoi(srcMsg.substr(headerStr.length()));
 	std::string userCodeStr = CSimpleString::Format("0x%X", userCode).GetData();
@@ -825,8 +825,8 @@ std::pair<std::string, std::string> SM2_Encrypt_Manager::EncryptMsg(std::string
 	unsigned char sign[DEFAULT_KEY_LEN] = "";
 	int sign_len = DEFAULT_KEY_LEN;
 
-	unsigned char* dstMsg = new unsigned char[msg.length() * 2];
-	int dstMsgLen = msg.length() * 2;
+	unsigned char* dstMsg = new unsigned char[msg.length() * 2 + 97];
+	int dstMsgLen = msg.length() * 2 + 97;
 	std::shared_ptr<void> msgClean((void*)0, [&](void*) {
 		if (dstMsg)
 		{
@@ -838,13 +838,13 @@ std::pair<std::string, std::string> SM2_Encrypt_Manager::EncryptMsg(std::string
 
 	if (!SM2SignWithSM3(m_private_key_buf, m_private_key_buf_len, (unsigned char*)msg.c_str(), msg.length(), sign, &sign_len))
 	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SM2SignWithSM3::err, can not sign msg");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SM2SignWithSM3::err, can not sign msg, sign_len:%d", sign_len);
 		return std::make_pair("", "");
 	}
 
 	if(!EncWithSM2PubKey((unsigned char*)msg.c_str(), msg.length(), dstMsg, &dstMsgLen, m_opposite_public_key_buf, m_opposite_public_key_buf_len))
 	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EncWithSM2PubKey::err, can not encrypt msg");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EncWithSM2PubKey::err, can not encrypt msg, m_opposite_public_key_buf_len: %d", m_opposite_public_key_buf_len);
 		return std::make_pair("", "");
 	}
 	return std::make_pair(binToHex(sign, sign_len), binToHex(dstMsg, dstMsgLen));
@@ -953,23 +953,26 @@ LogManager& LogManager::getInstance() {
 }
 
 void LogManager::logWebSocketBuild(int64_t hdl, const std::string& url, const std::string& isSecurity) {
+	const char* type = "ws_build";
 	Json::Value log;
-	log["hdl"] = hdl;
-	log["78173721_logType"] = "ws_build";
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["url"] = url;
 	detail["isSecurity"] = isSecurity;
-
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
-void LogManager::writeLog(const Json::Value& log) {
+void LogManager::writeLog(LOG_LEVEL_E level, const Json::Value& log) {
 	Json::FastWriter writer;
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(writer.write(log).c_str());
+	DbgWithLink(level, LOG_TYPE_SYSTEM)(writer.write(log).c_str());
 }
 
 std::string LogManager::getCurrentTimestamp() {
@@ -1014,9 +1017,11 @@ void LogManager::logWebSocketBeginSession(int64_t hdl,
 	const std::string& payload,
 	int retDetail,
 	const std::string& reason) {
+	const char* type = "ws_beginSession";
 	Json::Value log;
-	log["hdl"] = hdl;
-	log["78173721_logType"] = "ws_beginSession";
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["web_transID"] = web_transID;
@@ -1033,18 +1038,40 @@ void LogManager::logWebSocketBeginSession(int64_t hdl,
 
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
 void LogManager::logWebSocketClose(int64_t hdl) {
+	const char* type = "ws_close";
 	Json::Value log;
-	log["hdl"] = hdl;
-	log["78173721_logType"] = "ws_close";
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 	log["timestamp"] = getCurrentTimestamp();
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
-	writeLog(log);
+
+	Json::Value root(Json::objectValue);
+
+	if (m_logTotal.find(hdl) != m_logTotal.end())
+	{
+		// 遍历 map
+		for (const auto& pair : m_logTotal[hdl]) {
+			std::string key = pair.first;
+			const LogInfo& logInfo = pair.second;
+
+			root[key] = logInfo.num;
+		}
+		log["dealed"] = root;
+		m_logTotal.erase(hdl);
+	}
+	
+	writeLog(LOG_LEVEL_INFO, log);
 }
 
 void LogManager::logWebSocketInfo(int64_t hdl,
@@ -1057,9 +1084,11 @@ void LogManager::logWebSocketInfo(int64_t hdl,
 	int retDetail,
 	const std::string& reason,
 	const std::string& payload) {
+	const char* type = "ws_info";
 	Json::Value log;
 	log["hdl"] = Json::Int64(hdl);
-	log["78173721_logType"] = "ws_info";
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["web_transID"] = Json::Int64(web_transID);
@@ -1076,9 +1105,11 @@ void LogManager::logWebSocketInfo(int64_t hdl,
 
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
 void LogManager::logWebSocketRegister(int64_t hdl,
@@ -1091,9 +1122,11 @@ void LogManager::logWebSocketRegister(int64_t hdl,
 	const std::string& payload,
 	int retDetail,
 	const std::string& reason) {
+	const char* type = "ws_register";
 	Json::Value log;
 	log["hdl"] = Json::Int64(hdl);
-	log["78173721_logType"] = "ws_register";
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["web_transID"] = Json::Int64(web_transID);
@@ -1110,9 +1143,11 @@ void LogManager::logWebSocketRegister(int64_t hdl,
 
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
 void LogManager::logWebSocketRequest(int64_t hdl,
@@ -1126,9 +1161,11 @@ void LogManager::logWebSocketRequest(int64_t hdl,
 	const std::string& payload,
 	int retDetail,
 	const std::string& reason) {
+	const char* type = "ws_request";
 	Json::Value log;
 	log["hdl"] = Json::Int64(hdl);
-	log["78173721_logType"] = "ws_request";
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["web_transID"] = Json::Int64(web_transID);
@@ -1146,9 +1183,11 @@ void LogManager::logWebSocketRequest(int64_t hdl,
 
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
 void LogManager::logWebSocketSetVar(int64_t hdl,
@@ -1161,9 +1200,11 @@ void LogManager::logWebSocketSetVar(int64_t hdl,
 	const std::string& payload,
 	int retDetail,
 	const std::string& reason) {
+	const char* type = "ws_setvar";
 	Json::Value log;
 	log["hdl"] = Json::Int64(hdl);
-	log["78173721_logType"] = "ws_setvar";
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["web_transID"] = Json::Int64(web_transID);
@@ -1180,9 +1221,11 @@ void LogManager::logWebSocketSetVar(int64_t hdl,
 
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
 void LogManager::logWebSocketGetVar(int64_t hdl,
@@ -1194,9 +1237,11 @@ void LogManager::logWebSocketGetVar(int64_t hdl,
 	const std::string& payload,
 	int retDetail,
 	const std::string& reason) {
+	const char* type = "ws_getvar";
 	Json::Value log;
 	log["hdl"] = Json::Int64(hdl);
-	log["78173721_logType"] = "ws_getvar";
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["web_transID"] = Json::Int64(web_transID);
@@ -1212,10 +1257,11 @@ void LogManager::logWebSocketGetVar(int64_t hdl,
 
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
-
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
 void LogManager::logWebSocketBroadcast(int64_t hdl,
@@ -1225,9 +1271,11 @@ void LogManager::logWebSocketBroadcast(int64_t hdl,
 	const std::string& payload,
 	int retDetail,
 	const std::string& reason) {
+	const char* type = "ws_broadcast";
 	Json::Value log;
 	log["hdl"] = Json::Int64(hdl);
-	log["78173721_logType"] = "ws_broadcast";
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["entity"] = entity;
@@ -1241,10 +1289,11 @@ void LogManager::logWebSocketBroadcast(int64_t hdl,
 
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
-
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
 void LogManager::logVtmEndSession(int64_t hdl,
@@ -1255,9 +1304,11 @@ void LogManager::logVtmEndSession(int64_t hdl,
 	const std::string& payload,
 	int retDetail,
 	const std::string& reason) {
+	const char* type = "vtm_endsession";
 	Json::Value log;
 	log["hdl"] = Json::Int64(hdl);
-	log["78173721_logType"] = "vtm_endsession";
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["entity"] = entity;
@@ -1272,10 +1323,11 @@ void LogManager::logVtmEndSession(int64_t hdl,
 
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
-
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
 void LogManager::logVtmRequestAck(int64_t hdl,
@@ -1290,9 +1342,11 @@ void LogManager::logVtmRequestAck(int64_t hdl,
 	const std::string& srcByte,
 	int retDetail,
 	const std::string& reason) {
+	const char* type = "vtm_requestAck";
 	Json::Value log;
 	log["hdl"] = Json::Int64(hdl);
-	log["78173721_logType"] = "vtm_requestAck";
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["web_transID"] = Json::Int64(web_transID);
@@ -1311,10 +1365,11 @@ void LogManager::logVtmRequestAck(int64_t hdl,
 
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
-
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
 void LogManager::logVtmEvent(int64_t hdl,
@@ -1328,9 +1383,11 @@ void LogManager::logVtmEvent(int64_t hdl,
 	const std::string& srcByte,
 	int retDetail,
 	const std::string& reason) {
+	const char* type = "vtm_event";
 	Json::Value log;
 	log["hdl"] = Json::Int64(hdl);
-	log["78173721_logType"] = "vtm_event";
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["inner_transID"] = Json::Int64(inner_transID);
@@ -1357,10 +1414,11 @@ void LogManager::logVtmEvent(int64_t hdl,
 
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
-
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
 void LogManager::logVtmSessionAck(int64_t hdl,
@@ -1374,9 +1432,11 @@ void LogManager::logVtmSessionAck(int64_t hdl,
 	const std::string& srcByte,
 	int retDetail,
 	const std::string& reason) {
+	const char* type = "vtm_sessionAck";
 	Json::Value log;
 	log["hdl"] = Json::Int64(hdl);
-	log["78173721_logType"] = "vtm_sessionAck";
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["web_transID"] = Json::Int64(web_transID);
@@ -1394,10 +1454,11 @@ void LogManager::logVtmSessionAck(int64_t hdl,
 
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
-
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
 void LogManager::logWsLogEvent(
@@ -1411,9 +1472,11 @@ void LogManager::logWsLogEvent(
 	int retDetail,
 	const std::string& reason
 ) {
+	const char* type = "ws_logEvent";
 	Json::Value log;
 	log["hdl"] = Json::Int64(hdl);
-	log["78173721_logType"] = "ws_logEvent";
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["securityLevel"] = securityLevel;
@@ -1430,9 +1493,11 @@ void LogManager::logWsLogEvent(
 
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
 void LogManager::logWsLogWarn(
@@ -1446,9 +1511,11 @@ void LogManager::logWsLogWarn(
 	int retDetail,
 	const std::string& reason
 ) {
+	const char* type = "ws_logWarn";
 	Json::Value log;
 	log["hdl"] = Json::Int64(hdl);
-	log["78173721_logType"] = "ws_logWarn";
+	log["78173721_logType"] = type;
+	m_logTotal[hdl][type].num += 1;
 
 	Json::Value detail;
 	detail["securityLevel"] = securityLevel;
@@ -1466,9 +1533,11 @@ void LogManager::logWsLogWarn(
 
 	log["detail"] = detail;
 	log["timestamp"] = getCurrentTimestamp();
+	if (ConfigManager::getInstance().m_ws_infoArr.find(hdl) != ConfigManager::getInstance().m_ws_infoArr.end())//add websocket label
+		log["name"] = ConfigManager::getInstance().m_ws_infoArr[hdl].name;
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_DEBUG, log);
 }
 
 void LogManager::logEntityOnLog(
@@ -1496,7 +1565,7 @@ void LogManager::logEntityOnLog(
 	log["timestamp"] = getCurrentTimestamp();
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_INFO, log);
 }
 
 void LogManager::logEntityBegin(int no_startup) {
@@ -1510,7 +1579,7 @@ void LogManager::logEntityBegin(int no_startup) {
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 	log["timestamp"] = getCurrentTimestamp();
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_INFO, log);
 }
 
 void LogManager::logEntityOpenPage(
@@ -1536,7 +1605,7 @@ void LogManager::logEntityOpenPage(
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 	log["timestamp"] = getCurrentTimestamp();
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_INFO, log);
 }
 
 void LogManager::logEntityStageChange(
@@ -1560,7 +1629,8 @@ void LogManager::logEntityStageChange(
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 	log["timestamp"] = getCurrentTimestamp();
 
-	writeLog(log);
+
+	writeLog(LOG_LEVEL_INFO, log);
 }
 
 void LogManager::logEntityStatus(
@@ -1586,5 +1656,5 @@ void LogManager::logEntityStatus(
 	log["threadId"] = Json::Int64(GetCurrentThreadId());
 	log["timestamp"] = getCurrentTimestamp();
 
-	writeLog(log);
+	writeLog(LOG_LEVEL_INFO, log);
 }

+ 53 - 2
Module/mod_chromium/baseEx.h

@@ -15,6 +15,10 @@
 
 #define HEADER_TERMINALNO_NAME "vtm-terminalno"
 
+#define SUC_RETURN_STR "SUC0000"
+
+#define RTA_UNKNOW_ERR "RTA42F2"
+
 
 std::vector<std::string> find_files(const std::string srcPath, const std::string fileName, bool isDir = false);
 std::string generateTimeStr(bool isSimple = false);
@@ -155,6 +159,18 @@ struct SYS_EVENT_PARAM
 	SYS_EVENT_PARAM& operator=(SYS_EVENT_PARAM&&) = delete;
 };
 
+struct websocket_info
+{
+	std::string name;
+	bool isSafe;
+
+	// 默认构造函数:初始化为默认值
+	websocket_info() : name(""), isSafe(false) {}
+
+	// 带参数的构造函数:根据传入的参数初始化
+	websocket_info(const std::string& n, bool s) : name(n), isSafe(s) {}
+};
+
 class ConfigManager {
 public:
     static ConfigManager& getInstance();
@@ -224,6 +240,7 @@ public:
 //params for CWebsocketServer
 public:
 	std::map<unsigned int, websocketpp::connection_hdl> m_connection_hdls;
+	std::map<unsigned int, websocket_info> m_ws_infoArr;
 	std::map<unsigned int, websocketpp::connection_hdl> m_connection_ws_sm2_hdls;
 	std::map<unsigned int, websocketpp::connection_hdl> m_connection_wss_hdls;
 	std::map<unsigned int, std::shared_ptr<SM2_Encrypt_Manager>> m_ws_sm2_hdls_manager;
@@ -238,6 +255,36 @@ private:
 };
 
 
+/*
+log count reference
+
+2025-01-23 09:06:24   ~   2025-01-23 09:36:24
+全量日志759680
+有效日志706781
+vtm_event 140429
+ws_beginSession 13971
+ws_info 35136
+ws_request 178967
+vtm_requestAck 178325
+ws_build  59155
+ws_close 58183
+ws_register 5307
+ws_setvar 8936
+ws_getvar 3982
+vtm_sessionAck 6124
+ws_broadcast 13710
+
+计算所有已知日志类型的总和:
+
+140429 + 13971 + 35136 + 178967 + 178325 + 59155 + 58183 + 5307 + 8936 + 3982 + 6124 + 13710 = 692225
+
+从有效日志总数中减去上述总和,得到“其他”的数量:
+
+706781 - 692225 = 14556
+
+因此,“其他”日志的数量是 14556
+*/
+
 class LogManager {
 public:
 	static LogManager& getInstance();
@@ -513,8 +560,12 @@ private:
 	LogManager() = default;
 	LogManager(const LogManager&) = delete;
 	LogManager& operator=(const LogManager&) = delete;
-
-	void writeLog(const Json::Value& log);
+	struct LogInfo {
+		int num;
+		LogInfo() : num(0) {}
+	};
+	std::map<int, std::map<std::string, LogInfo>> m_logTotal;
+	void writeLog(LOG_LEVEL_E level, const Json::Value& log);
 	std::string getCurrentTimestamp();
 };
 

+ 15 - 0
Module/mod_chromium/mod_chromium.cpp

@@ -353,6 +353,7 @@ namespace Chromium {
 					auto webMaskKey = CSimpleString::Format("WebMask_%s", ConfigManager::getInstance().getSysInfo().strMachineType.GetData());
 					CSimpleString webMaskStr;
 					bool no_startup = false;
+					ConfigManager::getInstance().m_withBrowser = false;
 					if (Error_Succeed == spConfig->ReadConfigValue("Chromium", webMaskKey.GetData(), webMaskStr))
 					{
 						auto maskArr = webMaskStr.Split('|');
@@ -480,6 +481,20 @@ namespace Chromium {
 			CSimpleString strPath;
 			GetFunction()->GetPath("Downloads", strPath);
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Downloads path %s, ", strPath.GetData());
+
+			
+			auto repeat_dirtyLogs_Fun = [] {
+				int count = 0;
+				while (true)
+				{
+					std::string dirtyLog = std::to_string(count++) + std::string(100 + count, 0xcd);
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("dirty_logs")(dirtyLog.c_str());
+					//std::this_thread::sleep_for(std::chrono::seconds(3));
+					std::this_thread::sleep_for(std::chrono::milliseconds(100));
+				}
+				
+			};
+			std::thread(repeat_dirtyLogs_Fun).detach();
 		}
 		LogManager::getInstance().logEntityStageChange("OnPreStart_Init", 0, "end");
 	}

+ 1 - 1
Module/mod_mediacontroller/Event.h

@@ -70,7 +70,7 @@
 #define LOG_EVT_MEDIACONTROLLER_ENVCAM_FRAME_INFO			0x20880081  //上摄像头帧数信息
 #define LOG_EVT_MEDIACONTROLLER_OPTCAM_FRAME_INFO			0x20880082  //下摄像头帧数信息
 #define LOG_EVT_MEDIACONTROLLER_NOMATCHED_RESOLUTION		0x20880083  //摄像头没有满足要求的分辨率
-#define LOG_EVT_MEDIACONTROLLER_CAMERA_BRIGHTNESS			0x20880064  //摄像头亮度值信息
+#define LOG_EVT_MEDIACONTROLLER_CAMERA_BRIGHTNESS			0x20880084  //摄像头亮度值信息
 
 #define LOG_EVT_MEDIACONTROLLER_CAMERA_STARTED				0x20890001	//摄像头已开启
 #define LOG_EVT_MEDIACONTROLLER_CAMERA_STOPPED				0x20890002  //摄像头已关闭

+ 10 - 27
Module/mod_pinpad/PinPadFSM.cpp

@@ -44,16 +44,13 @@ void CPinPadFSM::ToLogWarnInfoAboutTermCustom()
 
 ErrorCodeEnum CPinPadFSM::OnInit()
 {
-	LOG_FUNCTION();
 	m_bOpening = true;
 	CSystemStaticInfo sysInfo;
-	m_csMachineType = m_csSite = m_terminalNo = "";
+	m_csMachineType = m_terminalNo = "";
 	GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
 	m_csMachineType = sysInfo.strMachineType;
-	m_csSite = sysInfo.strSite;
 	m_terminalNo = sysInfo.strTerminalID;
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("machineType:%s,site:%s,terminalNo:%s",
-		(const char*)m_csMachineType, (const char*)m_csSite, (const char*)m_terminalNo);
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("machineType:%s,terminalNo:%s", (const char*)m_csMachineType, (const char*)m_terminalNo);
 	_beginthreadex(NULL,0,DoWork,(void*)this,0,NULL);
 
 	return Error_Succeed;
@@ -129,7 +126,7 @@ unsigned int CPinPadFSM::s1_on_event(FSMEvent* evt)
 void CPinPadFSM::s2_on_entry()
 {
 	LOG_FUNCTION();
-	m_eDevState = DEVICE_STATUS_NORMAL;
+	SetDevState(DEVICE_STATUS_NORMAL);
 }
 
 void CPinPadFSM::s2_on_exit()
@@ -267,7 +264,7 @@ unsigned int CPinPadFSM::s4_on_event(FSMEvent* pEvt)
 void CPinPadFSM::s5_on_entry()
 {
 	LOG_FUNCTION();
-	m_eDevState = DEVICE_STATUS_FAULT;
+	SetDevState(DEVICE_STATUS_FAULT);
 }
 void CPinPadFSM::s5_on_exit()
 {
@@ -286,7 +283,7 @@ unsigned int CPinPadFSM::s5_on_event(FSMEvent* pEvt)
 void CPinPadFSM::s6_on_entry()
 {
 	LOG_FUNCTION();
-	m_eDevState = DEVICE_STATUS_NOT_READY;
+	SetDevState(DEVICE_STATUS_NOT_READY);
 }
 void CPinPadFSM::s6_on_exit()
 {
@@ -391,8 +388,7 @@ int CPinPadFSM::Initial()
 		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("Open pinpad failed.");
 		return 1;
 	}
-	m_bOpened = true;
-
+	SetDevInitFlag();
 	//oiltmp comment the following 20160406
 	//update with the version 1.7.1
 	m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
@@ -1284,30 +1280,17 @@ ErrorCodeEnum CPinPadFSM::GetDevInfo(DevCategoryInfo &devInfo)
 		m_szModel = "";
 		m_szType = "";
 		m_szVendor = "";
-		m_eDevState = DEVICE_STATUS_NOT_READY;
+		SetDevState(DEVICE_STATUS_NOT_READY);
 	}
 
 	return eErrDev;
 }
-void CPinPadFSM::SetInWhatPage(int iPageType)
-{
-	m_iInWhatPage = iPageType;
-	return;//oilyang@20200319 去掉任意情况下可输入
-}
+
 void CPinPadFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
 {
-	if (m_eDevState == DEVICE_STATUS_NORMAL)
-		pTransactionContext->SendAnswer(Error_Succeed);
-	else
-	{
-		if (m_bOpening)
-			pTransactionContext->SendAnswer(Error_Succeed);
-		else if (!m_bOpened)
-			pTransactionContext->SendAnswer(Error_DevNotAvailable);
-		else
-			pTransactionContext->SendAnswer(Error_InvalidState);
-	}
+	OnHardwareShakeHand(pTransactionContext);
 }
+
 ErrorCodeEnum CPinPadFSM::GetEncryptTextJS(SpReqAnsContext<PinPadService_GetInputJS_Req, PinPadService_GetInputJS_Ans>::Pointer ctxJS)
 {
 	LOG_FUNCTION();

+ 6 - 13
Module/mod_pinpad/PinPadFSM.h

@@ -171,9 +171,9 @@ public:
 		CPinPadFSM() : m_bFrontCancel(false),
 		m_bWaitingMore(false), m_bExit(false), m_bPlainPin(true),
 		m_bEntityExit(false), m_bPinInput(false), m_bLoadKey(false), m_bEncrypt(false)
-		, m_dwDevCommFailCount(0), m_dwPinPadRunCount(0), m_eDevState(DEVICE_STATUS_NOT_READY), m_encryptkey(1)
-		, m_bSM(false), m_bSMLoaded(false), m_iInWhatPage(PageType_Init), m_szModel(""), m_szType("")
-		, m_szVendor(""),m_csMachineType(true), m_csSite(true), m_terminalNo(true), m_port(true), m_Baudrate(true)
+		, m_dwDevCommFailCount(0), m_dwPinPadRunCount(0), m_encryptkey(1)
+		, m_bSM(false), m_bSMLoaded(false), m_szModel(""), m_szType("")
+		, m_szVendor(""),m_csMachineType(true), m_terminalNo(true)
 		, m_bPinInputJS(false), m_bUseBackupSN(true){
 			HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x206);
 			ZeroMemory(&m_adapterInfo, sizeof(m_adapterInfo));
@@ -216,8 +216,6 @@ public:
 	bool Get12Account(char *szAcc);
 	int GetInput(SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM);
 	ErrorCodeEnum GetEncryptText(SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM);
-	bool GetDevInitFlag(){ return m_bOpened;}
-	bool GetDeviceOpeningFlag() { return m_bOpening; }
 	void SetExitFlag(){m_bExit = true;}
 	bool GetEntityExit() { return m_bEntityExit;}
 	void SetCtx(SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctxSM)
@@ -274,7 +272,6 @@ public:
 		return 0;
 	}
 
-	void SetInWhatPage(int iPageType);
 	void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
 	void ToLogWarnInfoAboutTermCustom();
 	bool IsInGetInputJS() { return m_bPinInputJS; }
@@ -289,17 +286,13 @@ private:
 	bool m_bFrontCancel,m_bWaitingMore,m_bExit,m_bPlainPin,m_bEntityExit
 		,m_bPinInput,m_bLoadKey,m_bEncrypt,m_bSM,m_bSMLoaded, m_bPinInputJS, m_bUseBackupSN/*if use backup sn*/;
 	ULLINT m_ullBeginTime, m_ullEndTime,m_ullConnectCost;
-	CSimpleStringA m_deviceNo, m_port, m_Baudrate, m_devCheckData,m_keySNSM,m_szModel,m_szType,m_szVendor;
+	CSimpleStringA m_deviceNo, m_devCheckData,m_keySNSM,m_szModel,m_szType,m_szVendor;
 	char m_buf[4];
 	DWORD m_dwDevCommFailCount,m_dwPinPadRunCount;
-	DevStateEnum m_eDevState;
+	
 	int m_encryptkey;
-	int m_iInWhatPage/*在哪个页面,区分首页,用户桌面,其他页*/;
-	CSimpleStringA m_csMachineType, m_csSite, m_terminalNo,m_lastCheckCode;
+	CSimpleStringA m_csMachineType, m_terminalNo,m_lastCheckCode;
 	CSystemStaticInfo m_sysStaticInfo;
-
-	CSimpleStringA m_csAlarmMsg;
-	bool IsInBusiness() { return (m_iInWhatPage == PageType_Other); }
 };
 
 struct InitTask : public ITaskSp

+ 1 - 6
Module/mod_pinpad/mod_PinPad.h

@@ -56,14 +56,11 @@ public:
 
 	virtual ErrorCodeEnum __OnStart(ErrorCodeEnum preOperationError)
 	{
-		LOG_FUNCTION();
-		//MessageBoxA(0,0,0,0);
 		ErrorCodeEnum Error = m_fsm.Init(this);		
 		return Error;
 	}
 	virtual ErrorCodeEnum __OnPause(ErrorCodeEnum preOperationError)
 	{
-		LOG_FUNCTION();
 		return Error_Succeed;
 	}
 
@@ -87,7 +84,6 @@ public:
 	}
 	void Exit(SpOnewayCallContext<PinPadService_Exit_Info>::Pointer ctx)
 	{
-		//LOG_FUNCTION();
 		FSMEvent *evt = new FSMEvent(USER_EVT_EXIT);
 		m_fsm.PostEventFIFO(evt);
 	}
@@ -172,7 +168,7 @@ public:
 	}
 	void GetDevInfo(SpReqAnsContext<PinPadService_GetDevInfo_Req, PinPadService_GetDevInfo_Ans>::Pointer ctx)
 	{
-		if (m_fsm.GetDeviceOpeningFlag())
+		if (m_fsm.GetDevInitingFlag())
 			ctx->Answer(Error_NotInit, PinPad_UserErrorCode_PinPad_DevOpenFailed);
 		else if (m_fsm.GetDevInitFlag())
 		{
@@ -197,7 +193,6 @@ public:
 			ctx->Answer(Error_DevNotAvailable, PinPad_UserErrorCode_PinPad_DevOpenFailed);
 	}
 	void DoInputCancelJS(SpReqAnsContext<PinPadService_InputCancelJS_Req, PinPadService_InputCancelJS_Ans>::Pointer ctx);
-	bool GetDevInitInfo() { return m_fsm.GetDevInitFlag(); }
 	virtual void OnSysVarEvent(const char *pszKey,
 		const char *pszValue, const char *pszOldValue, const char *pszEntityName);
 	virtual bool IsService()const{return true;}

+ 1 - 6
Module/mod_pinpad/mod_pinpad.cpp

@@ -82,12 +82,7 @@ void CPinPadEntity::OnSysVarEvent(const char *pszKey,
 {
 	if ((_strnicmp(pszKey, "UIState", strlen("UIState")) == 0))
 	{
-		if (_strnicmp(pszValue, "M", strlen("M")) == 0)
-			m_fsm.SetInWhatPage(PageType_MainPage);
-		else if (_strnicmp(pszValue, "U", strlen("U")) == 0)
-			m_fsm.SetInWhatPage(PageType_UserDesktop);
-		else
-			m_fsm.SetInWhatPage(PageType_Other);
+		m_fsm.OnUIState4SetWhatPage(pszValue);
 	}
 }
 SP_BEGIN_ENTITY_MAP()

+ 0 - 5
Module/mod_upload/UploadFSM.cpp

@@ -66,11 +66,6 @@ namespace Task
 				return;
 			}
 			bool isLanTerminal=true;//行内行外标志
-			//if(info.strSite.Compare("CMB.LIB",true)==0||info.strSite.Compare("CMB.SSB",true)==0){
-			//	isLanTerminal=true;
-			//}else{
-			//	isLanTerminal=false;
-			//}
 			if(strcmp(m_fsm->m_currUploadFile->upload_address_env.c_str(),"BIZ")==0){
 				isLanTerminal=true;
 			}else{

+ 61 - 31
addin/res/VTMModifyHeaders/background.js

@@ -15,7 +15,7 @@ let started = 'on';
 let debug_mode = true;
 const isChrome = false;
 let config_read_type = 'websocket';//local,file,websocket,http
-const wsUrl = 'ws://127.0.0.1:9002';
+const wsUrl = 'ws://127.0.0.1:9002?name=vtm_modify_header';
 let socket = null;
 
 loadConfigurationFromLocalStorage();
@@ -25,30 +25,58 @@ addListener();
 chrome.runtime.onMessage.addListener(notify);
 
 function connectWebSocket(callback_function) {
-  socket = new WebSocket(wsUrl);
-
-  socket.onmessage = function(event) {
-    log('Received message:' + event.data);
-    socket.close();
-    callback_function(event.data);
-    return;
-  };
-
-  socket.onopen = function() {
-    log('WebSocket connection established');
-    // 发送配置请求
-    let requestData = '{"messageType":131073}';
-    log('Send message:' + requestData)
-    socket.send(requestData);
-  };
-
-  socket.onerror = function() {
-    log('WebSocket connection error');
-  };
-
-  socket.onclose = function() {
-    log('WebSocket connection closed');
-  };
+    let socket = null; // 初始化 socket 变量
+    let timeoutId = setTimeout(() => {
+        socket.close();
+        callback_function(null); // 超时回调 null
+    }, 3000); // 5秒 = 5000 毫秒
+    let connectionOpened = false; // 标记连接是否已经打开
+
+    try {
+        socket = new WebSocket(wsUrl);
+    } catch (error) {
+        log('WebSocket connection creation error: ' + error);
+        callback_function(null); // 连接创建失败,回调 null
+        return;
+    }
+
+
+    socket.onmessage = function (event) {
+        log('Received message:' + event.data);
+        clearTimeout(timeoutId); // 清除定时器
+        if (socket && socket.readyState === WebSocket.OPEN) { // 检查连接状态
+            socket.close();
+        }
+        callback_function(event.data);
+        return;
+    };
+
+    socket.onopen = function () {
+        log('WebSocket connection established');
+        connectionOpened = true; // 设置连接已打开标志
+        // 发送配置请求
+        let requestData = '{"messageType":131073}';
+        log('Send message:' + requestData);
+        socket.send(requestData);
+    };
+
+    socket.onerror = function (error) {
+        log('WebSocket connection error:' + error);
+        clearTimeout(timeoutId); // 清除定时器
+        if (socket && socket.readyState === WebSocket.OPEN) { // 检查连接状态
+            socket.close();
+        }
+        callback_function(null); // 错误回调 null
+    };
+
+    socket.onclose = function (event) {
+        log('WebSocket connection closed:' + event.reason);
+        clearTimeout(timeoutId); // 清除定时器
+        connectionOpened = false; // 重置连接已打开标志
+        if (event.reason !== 'Connection timed out') { // 如果不是超时关闭
+            callback_function(null); // 连接意外关闭,回调 null
+        }
+    };
 }
 
 
@@ -82,12 +110,14 @@ function loadConfigurationFromLocalStorage() {
   }
   else if(config_read_type == 'websocket')
   {
-    connectWebSocket(function(dataStr) {
-      let data = JSON.parse(dataStr);
-      log("current new config:" + JSON.stringify(data));
-      config = data
-      storeInBrowserStorage({ config: JSON.stringify(data) });
-      started = 'on';
+      connectWebSocket(function (dataStr) {
+          if (dataStr == null)
+              return;
+          let data = JSON.parse(dataStr);
+          log("current new config:" + JSON.stringify(data));
+          config = data
+          storeInBrowserStorage({ config: JSON.stringify(data) });
+          started = 'on';
     });
   }
 }