Bläddra i källkod

!10645 合并脏数据处理+日志精简+安全ws
Merge pull request !10645 from 80374463/ST2_1224_fix_dirtyData

Gifur 7 månader sedan
förälder
incheckning
7441efc113
35 ändrade filer med 1178 tillägg och 432 borttagningar
  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. 60 61
      Module/mod_chromium/CWSCodec.cpp
  30. 3 2
      Module/mod_chromium/CWSCodec.h
  31. 72 8
      Module/mod_chromium/CWebsocketServer.cpp
  32. 122 52
      Module/mod_chromium/baseEx.cpp
  33. 53 2
      Module/mod_chromium/baseEx.h
  34. 15 0
      Module/mod_chromium/mod_chromium.cpp
  35. 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;
 }

+ 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");
 	}

+ 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';
     });
   }
 }