Browse Source

将PacketAnalizer.cpp编译成动态库供平台层使用,不再使用公共文件的方式,使用公共文件的方式容易出问题!

lwk 1 week ago
parent
commit
03e5ae5b99

+ 4 - 6
CCOS.Dev.IODevice/CMakeLists.txt

@@ -43,7 +43,7 @@ include_directories(
     ${DELIVER_INCLUDE_DIR}
 )
 
-# 配置源文件
+# 配置源文件(移除PacketAnalizer重复源文件,保留EasyJSONEncoder)
 set(SRC_FILES
     CCOS.Dev.IODevice.Detail.hpp
     CCOS.Dev.IODevice.Detail.cpp
@@ -51,8 +51,6 @@ set(SRC_FILES
     CCOS.Dev.IODevice.cpp
 	${DELIVER_INCLUDE_DIR}/EasyJSONEncoder.hpp
 	${DELIVER_INCLUDE_DIR}/EasyJSONEncoder.cpp
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
 )
 
 # 创建库目标
@@ -65,10 +63,10 @@ set_target_properties(CCOS.Dev.IODevice PROPERTIES
     OUTPUT_NAME "CCOS.Dev.IODevice"
 )
 
-# 链接依赖库
+# 链接依赖库(添加CommonPacket)
 if(UNIX AND NOT APPLE)
-    target_link_libraries(CCOS.Dev.IODevice PRIVATE DevTree CcosLock LogicDevice LogicDriver OemBusUnit common_api)
-    message(STATUS "已链接: LogicDevice LogicClient LogicDriver")
+    target_link_libraries(CCOS.Dev.IODevice PRIVATE DevTree CcosLock LogicDevice LogicDriver OemBusUnit common_api CommonPacket)
+    message(STATUS "已链接: DevTree CcosLock LogicDevice LogicDriver OemBusUnit common_api CommonPacket")
 endif()
 
 # 确保交付目录结构存在

+ 14 - 15
CDI/CMakeLists.txt

@@ -44,7 +44,7 @@ include_directories(
     ${DELIVER_INCLUDE_DIR}/Img_header
 )
 
-# 配置源文件
+# 配置源文件(移除PacketAnalizer重复源文件)
 set(SRC_FILES
     CDI.h
     CDI.cpp
@@ -64,8 +64,6 @@ set(SRC_FILES
     ProcThreadManager.cpp
     LogLocalHelper.cpp
     LogLocalHelper.h
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
 	${DELIVER_INCLUDE_DIR}/common_api.h
 )
 
@@ -79,27 +77,28 @@ set_target_properties(CDI PROPERTIES
     OUTPUT_NAME "CDI"
 )
 
-# 链接依赖库
+# 链接依赖库(添加CommonPacket)
 if(UNIX AND NOT APPLE)
-    target_link_libraries(CDI PRIVATE 
-    Crc64 
+    target_link_libraries(CDI PRIVATE
+    Crc64
     common_api
-    DeviceBus 
-    DevTree 
-    CcosFileHandle 
-    CcosLock 
-    CcosThread 
-    DPC 
-    LocalConfig 
-    LogicClient 
+    DeviceBus
+    DevTree
+    CcosFileHandle
+    CcosLock
+    CcosThread
+    DPC
+    LocalConfig
+    LogicClient
     LogicDevice
     NewModelDPC
     OemBusUnit
     ResDataObject
     ContainerDPC
     log4cpp_wrapper
+    CommonPacket
     )
-    message(STATUS "已链接: LogicDevice")
+    message(STATUS "已链接: Crc64 common_api DeviceBus DevTree CcosFileHandle CcosLock CcosThread DPC LocalConfig LogicClient LogicDevice NewModelDPC OemBusUnit ResDataObject ContainerDPC log4cpp_wrapper CommonPacket")
 endif()
 
 # 确保交付目录结构存在

+ 1 - 0
CMakeLists.txt

@@ -6,6 +6,7 @@ add_subdirectory(Crc64)
 add_subdirectory(DevTree)
 add_subdirectory(ResDataObject)
 add_subdirectory(CcosLock)
+add_subdirectory(CommonPacket)
 add_subdirectory(CcosThread)
 add_subdirectory(SCF/SCF)
 add_subdirectory(SCF/SerialSCF)

+ 4 - 6
CcosSMachineV3/CMakeLists.txt

@@ -34,7 +34,7 @@ include_directories(
     ${DELIVER_INCLUDE_DIR}
 )
 
-# 配置源文件
+# 配置源文件(移除PacketAnalizer重复源文件)
 set(SRC_FILES
     CcosSMachineV3.cpp
     CcosSMachineV3.h
@@ -43,8 +43,6 @@ set(SRC_FILES
     ConditionEvent.cpp
     ExpressionTranslation.h
     ExpressionTranslation.cpp
-    ${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
-    ${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
     StateMachineDevicePool.h
     StateMachineDevicePool.cpp
     stdafx.h
@@ -63,10 +61,10 @@ set_target_properties(CcosSMachineV3 PROPERTIES
     OUTPUT_NAME "CcosSMachineV3"
 )
 
-# 链接依赖库
+# 链接依赖库(添加CommonPacket)
 if(UNIX AND NOT APPLE)
-    target_link_libraries(CcosSMachineV3 PRIVATE common_api)
-    # message(STATUS "已链接: pthread 和 CcosLock")
+    target_link_libraries(CcosSMachineV3 PRIVATE common_api CommonPacket)
+    message(STATUS "已链接: common_api CommonPacket")
 endif()
 
 # 确保交付目录结构存在

+ 185 - 0
CommonPacket/CMakeLists.txt

@@ -0,0 +1,185 @@
+cmake_minimum_required(VERSION 3.12)
+project(CommonPacket VERSION 1.0.0 LANGUAGES CXX)
+
+# === 基础配置 ===
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS OFF)
+set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+
+# 添加编译选项: -g 生成调试信息, -fPIC 位置无关代码
+add_compile_options(-g -fPIC)
+
+# 添加地址 sanitizer 选项(用于检测内存错误)
+# 仅在 Debug 模式下启用,避免影响 Release 性能
+set(SANITIZE_OPTIONS -fsanitize=address)
+add_compile_options($<$<CONFIG:Debug>:${SANITIZE_OPTIONS}>)
+link_libraries($<$<CONFIG:Debug>:${SANITIZE_OPTIONS}>)
+
+# === 输出目录配置 ===
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
+
+# === 路径配置 ===
+set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+set(INCLUDE_DIR ${SRC_DIR})
+
+# 核心交付目录【复用,无需修改】
+set(DELIVER_DIR "${CMAKE_BINARY_DIR}/../../Deliver" CACHE PATH "交付目录路径")
+get_filename_component(DELIVER_DIR ${DELIVER_DIR} ABSOLUTE)
+message(STATUS "交付目录: ${DELIVER_DIR}")
+
+set(CCOSLOCK_INCLUDE_DIR "${DELIVER_DIR}/include")
+set(CCOSLOCK_LIB_DIR "${DELIVER_DIR}/lib")
+get_filename_component(CCOSLOCK_INCLUDE_DIR ${CCOSLOCK_INCLUDE_DIR} ABSOLUTE)
+get_filename_component(CCOSLOCK_LIB_DIR ${CCOSLOCK_LIB_DIR} ABSOLUTE)
+message(STATUS "CcosLock 头文件目录: ${CCOSLOCK_INCLUDE_DIR}")
+message(STATUS "CcosLock 库文件目录: ${CCOSLOCK_LIB_DIR}")
+
+set(CRC64_INCLUDE_DIR "${DELIVER_DIR}/include")
+set(CRC64_LIB_DIR "${DELIVER_DIR}/lib")
+get_filename_component(CRC64_INCLUDE_DIR ${CRC64_INCLUDE_DIR} ABSOLUTE)
+get_filename_component(CRC64_LIB_DIR ${CRC64_LIB_DIR} ABSOLUTE)
+message(STATUS "Crc64 头文件目录: ${CRC64_INCLUDE_DIR}")
+message(STATUS "Crc64 库文件目录: ${CRC64_LIB_DIR}")
+
+# === 源文件与头文件 ===
+set(SRC_FILES
+    ${SRC_DIR}/PacketAnalizer.cpp
+)
+
+set(HEADER_FILES
+    ${INCLUDE_DIR}/PacketAnalizer.h
+)
+
+# 验证当前工程头文件是否存在
+foreach(header ${HEADER_FILES})
+    if(NOT EXISTS ${header})
+        message(FATAL_ERROR "头文件不存在: ${header}")
+    endif()
+endforeach()
+
+if(NOT EXISTS "${CCOSLOCK_INCLUDE_DIR}/CcosLock.h")
+    message(FATAL_ERROR "CcosLock.h 不存在于 ${CCOSLOCK_INCLUDE_DIR}")
+endif()
+
+if(NOT EXISTS "${CRC64_INCLUDE_DIR}/Crc64.h")
+    message(FATAL_ERROR "Crc64.h 不存在于 ${CRC64_INCLUDE_DIR}")
+endif()
+
+find_library(CCOSLOCK_LIB
+    NAMES CcosLock libCcosLock  # 同时检查带/不带lib前缀的库名
+    PATHS ${CCOSLOCK_LIB_DIR}
+    NO_DEFAULT_PATH  # 只在指定目录查找,不搜索系统默认路径
+)
+if(NOT CCOSLOCK_LIB)
+    message(FATAL_ERROR "找不到CcosLock库,路径: ${CCOSLOCK_LIB_DIR}")
+else()
+    message(STATUS "找到CcosLock库: ${CCOSLOCK_LIB}")
+endif()
+
+find_library(CRC64_LIB
+    NAMES Crc64 libCrc64  # 同时检查带/不带lib前缀的库名
+    PATHS ${CRC64_LIB_DIR}
+    NO_DEFAULT_PATH  # 只在指定目录查找,不搜索系统默认路径
+)
+if(NOT CRC64_LIB)
+    message(FATAL_ERROR "找不到Crc64库,路径: ${CRC64_LIB_DIR}")
+else()
+    message(STATUS "找到Crc64库: ${CRC64_LIB}")
+endif()
+
+# === 构建共享库 ===
+add_library(CommonPacket SHARED ${SRC_FILES} ${HEADER_FILES})
+
+# === 目标属性配置 ===
+set_target_properties(CommonPacket PROPERTIES
+    VERSION ${PROJECT_VERSION}
+    SOVERSION 1
+    OUTPUT_NAME "CommonPacket"
+    PUBLIC_HEADER "${HEADER_FILES}"
+)
+
+# === 编译选项 ===
+if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
+    target_compile_options(CommonPacket PRIVATE -Wall -Wextra -Wpedantic -Werror=return-type)
+elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+    target_compile_options(CommonPacket PRIVATE -Wall -Wextra -Wpedantic -Werror=return-type)
+endif()
+
+# === 依赖配置 - 头文件目录 ===
+target_include_directories(CommonPacket
+    PUBLIC
+        $<BUILD_INTERFACE:${INCLUDE_DIR}>
+        $<BUILD_INTERFACE:${CCOSLOCK_INCLUDE_DIR}>
+        $<BUILD_INTERFACE:${CRC64_INCLUDE_DIR}>  # 【新增】添加CRC64头文件目录
+        $<INSTALL_INTERFACE:include>
+)
+
+# === 依赖配置 - 链接库【核心修改】===
+# 同时链接:CcosLock + Crc64 + pthread + dl,所有依赖一次性配置完成
+target_link_libraries(CommonPacket
+    PUBLIC
+        ${CCOSLOCK_LIB}   # 原有:CcosLock库
+        ${CRC64_LIB}      # 新增:Crc64/libCrc库
+    PRIVATE
+        pthread
+        dl
+)
+
+# === 交付与安装 ===
+file(MAKE_DIRECTORY
+    ${DELIVER_DIR}/lib
+    ${DELIVER_DIR}/include
+)
+
+add_custom_command(TARGET CommonPacket POST_BUILD
+    COMMENT "复制构建产物到交付目录: ${DELIVER_DIR}"
+    # 1. 确保交付目录存在(避免链接/复制失败)
+    COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/lib"
+    COMMAND ${CMAKE_COMMAND} -E make_directory "${DELIVER_DIR}/include"
+    
+    # 2. 复制核心库文件(唯一真实二进制文件,如 libCommonPacket.so.1.0.0)
+    COMMAND ${CMAKE_COMMAND} -E echo "复制CommonPacket核心库文件..."
+    COMMAND ${CMAKE_COMMAND} -E copy_if_different
+        "$<TARGET_FILE:CommonPacket>"          # 源:完整版本核心库(含全版本号)
+        "${DELIVER_DIR}/lib/"                # 目标:交付目录的lib文件夹
+    
+    # 3. 创建主版本符号链接(如 libCommonPacket.so.1 -> libCommonPacket.so.1.0.0)
+    COMMAND ${CMAKE_COMMAND} -E echo "创建CommonPacket主版本符号链接..."
+    COMMAND ${CMAKE_COMMAND} -E create_symlink
+        "$<TARGET_FILE_NAME:CommonPacket>"     # 链接指向的目标(核心库文件名)
+        "${DELIVER_DIR}/lib/$<TARGET_SONAME_FILE_NAME:CommonPacket>"  # 链接文件本身(主版本名)
+    
+    # 4. 创建通用符号链接(如 libCommonPacket.so -> libCommonPacket.so.1)
+    COMMAND ${CMAKE_COMMAND} -E echo "创建CommonPacket通用符号链接..."
+    COMMAND ${CMAKE_COMMAND} -E create_symlink
+        "$<TARGET_SONAME_FILE_NAME:CommonPacket>"  # 链接指向的目标(主版本链接名)
+        "${DELIVER_DIR}/lib/$<TARGET_LINKER_FILE_NAME:CommonPacket>"  # 链接文件本身(通用名)
+    
+    # 5. 复制头文件(保持原逻辑,确保头文件正确交付)
+    COMMAND ${CMAKE_COMMAND} -E echo "复制CommonPacket头文件..."
+    COMMAND ${CMAKE_COMMAND} -E copy_if_different
+        ${HEADER_FILES}
+        ${DELIVER_DIR}/include/
+)
+
+# 安装配置
+install(TARGETS CommonPacket
+    EXPORT CommonPacketTargets
+    LIBRARY DESTINATION lib
+    ARCHIVE DESTINATION lib
+    PUBLIC_HEADER DESTINATION include
+)
+
+install(EXPORT CommonPacketTargets
+    FILE CommonPacketConfig.cmake
+    DESTINATION lib/cmake/CommonPacket
+    EXPORT_LINK_INTERFACE_LIBRARIES
+)
+
+# === 调试辅助 - 【新增CRC64日志】===
+message(STATUS "CommonPacket 源文件: ${SRC_FILES}")
+message(STATUS "CommonPacket 头文件: ${HEADER_FILES}")
+message(STATUS "CommonPacket 链接库: ${CCOSLOCK_LIB} ${CRC64_LIB} pthread dl")

+ 952 - 0
CommonPacket/PacketAnalizer.cpp

@@ -0,0 +1,952 @@
+#include <assert.h>
+#include "Crc64.h"
+#include "CcosLock.h"
+#include "PacketAnalizer.h"
+#include <iostream>
+#include <sstream> // 添加字符串流支持
+#include <cstdint> // 添加标准整数类型头文件
+
+// 使用标准命名空间
+using namespace std;
+
+PacketAnalizer::PacketAnalizer(void)
+{
+}
+
+PacketAnalizer::~PacketAnalizer(void)
+{
+}
+
+uint32_t PacketAnalizer::MakePacketIdx()
+{
+    return Thread_GetUniqTick();
+}
+
+uint32_t PacketAnalizer::GetPacketIdx(ResDataObject* pObj)
+{
+    uint32_t ret = 0;
+    try {
+        int Idx = (*pObj).GetFirstOf(CCOS_PACK_IDX);
+        if (Idx >= 0)
+        {
+            ret = static_cast<uint32_t>((*pObj)[CCOS_PACK_IDX]);
+        }
+
+    }
+    catch (ResDataObjectExption& exp)
+    {
+        cout << exp.what() << endl;
+    }
+    catch (...)
+    {
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::GetDestinationMachineId(ResDataObject& packet, string& machineId)
+{
+    bool ret = false;
+    try {
+        // 检查目标并分派
+        PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
+
+        switch (type)
+        {
+            // 请求:设备总线+进程
+        case PACKET_TYPE_REQ:
+            if (PacketAnalizer::GetPacketHandleMachineId(&packet, machineId, true))
+            {
+                return true;
+            }
+            break;
+            // 响应和通知:所有者总线+进程
+        case PACKET_TYPE_RES:
+        case PACKET_TYPE_NOTIFY:
+            if (PacketAnalizer::GetPacketHandleMachineId(&packet, machineId, false))
+            {
+                return true;
+            }
+
+            break;
+        default:
+            break;
+        }
+    }
+    catch (...)
+    {
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::GetDestinationBusId(ResDataObject& packet, string& busId)
+{
+    bool ret = false;
+    try {
+        // 检查目标并分派
+        PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
+
+        switch (type)
+        {
+            // 请求:设备总线+进程
+        case PACKET_TYPE_REQ:
+            if (PacketAnalizer::GetPacketHandleBusId(&packet, busId, true))
+            {
+                return true;
+            }
+            break;
+            // 响应和通知:所有者总线+进程
+        case PACKET_TYPE_RES:
+        case PACKET_TYPE_NOTIFY:
+            if (PacketAnalizer::GetPacketHandleBusId(&packet, busId, false))
+            {
+                return true;
+            }
+
+            break;
+        default:
+            break;
+        }
+    }
+    catch (...)
+    {
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::GetDestinationProcId(ResDataObject& packet, uint64_t& procId)
+{
+    bool ret = false;
+    try {
+        // 检查目标并分派
+        PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
+
+        switch (type)
+        {
+            // 请求:设备总线+进程
+        case PACKET_TYPE_REQ:
+            if (PacketAnalizer::GetPacketHandleProcId(&packet, procId, true))
+            {
+                return true;
+            }
+            break;
+            // 响应和通知:所有者总线+进程
+        case PACKET_TYPE_RES:
+        case PACKET_TYPE_NOTIFY:
+            if (PacketAnalizer::GetPacketHandleProcId(&packet, procId, false))
+            {
+                return true;
+            }
+
+            break;
+        default:
+            break;
+        }
+    }
+    catch (...)
+    {
+    }
+
+    return ret;
+}
+
+PACKET_TYPE PacketAnalizer::GetPacketType(ResDataObject* pObj)
+{
+    int cmd;
+    PACKET_TYPE ret = PACKET_TYPE_NONE;
+
+    try {
+        cmd = static_cast<int>((*pObj)[CCOS_PACK_TYPE]);
+        ret = static_cast<PACKET_TYPE>(cmd);
+        if (ret >= 0 && ret < PACKET_TYPE_MAX)
+        {
+            return ret;
+        }
+
+    }
+    catch (ResDataObjectExption& exp)
+    {
+        cout << exp.what() << endl;
+    }
+    catch (...)
+    {
+    }
+
+    return PACKET_TYPE_NONE;
+}
+
+PACKET_CMD PacketAnalizer::GetPacketCmd(ResDataObject* pObj)
+{
+    int cmd;
+    PACKET_CMD ret = PACKET_CMD_NONE;
+
+    try {
+        cmd = static_cast<int>(((*pObj)[CCOS_PACK_CMD]));
+        ret = static_cast<PACKET_CMD>(cmd);
+        if (ret >= 0 && ret < PACKET_CMD_MAX)
+        {
+            return ret;
+        }
+
+    }
+    catch (ResDataObjectExption& exp)
+    {
+        cout << exp.what() << endl;
+    }
+    catch (...)
+    {
+    }
+
+    return PACKET_CMD_NONE;
+}
+
+ACTION_SYNC_MODE PacketAnalizer::GetPacketSyncMode(ResDataObject* pObj)
+{
+    ACTION_SYNC_MODE ret = ACTION_SYNC;
+    try {
+        ret = static_cast<ACTION_SYNC_MODE>(static_cast<int>((*pObj)[CCOS_PACKET_SYNC]));
+    }
+    catch (...)
+    {
+        ret = ACTION_SYNC;
+    }
+
+    return ret;
+}
+
+ResDataObject* PacketAnalizer::GetPacketKeysRes(ResDataObject* pObj)
+{
+    try {
+        int Idx = (*pObj).GetFirstOf(CCOS_PACK_KEY);
+        if (Idx >= 0)
+        {
+            ResDataObject& Res = (*pObj)[CCOS_PACK_KEY];
+            return &Res;
+        }
+
+    }
+    catch (ResDataObjectExption& exp)
+    {
+        cout << exp.what() << endl;
+    }
+    catch (...)
+    {
+    }
+
+    return NULL;
+}
+
+string PacketAnalizer::GetPacketPublisher(ResDataObject* pObj)
+{
+    std::string key = "";
+    try {
+        int Idx = (*pObj).GetFirstOf(CCOS_PUBLISH);
+        if (Idx >= 0)
+        {
+            key = static_cast<const char*>((*pObj)[CCOS_PUBLISH]);
+        }
+
+    }
+    catch (ResDataObjectExption& exp)
+    {
+        cout << exp.what() << endl;
+        key = "";
+    }
+    catch (...)
+    {
+        key = "";
+    }
+
+    return key;
+}
+
+std::string PacketAnalizer::GetPacketKey(ResDataObject* pObj)
+{
+    std::string key = "";
+    try {
+        int Idx = (*pObj).GetFirstOf(CCOS_PACK_KEY);
+        if (Idx >= 0)
+        {
+            key = static_cast<const char*>((*pObj)[CCOS_PACK_KEY]);
+        }
+
+    }
+    catch (ResDataObjectExption& exp)
+    {
+        cout << exp.what() << endl;
+        key = "";
+    }
+    catch (...)
+    {
+        key = "";
+    }
+
+    return key;
+}
+
+bool PacketAnalizer::GetPacketHandleExistance(ResDataObject* pPacket)
+{
+    bool ret = false;
+    try {
+        if ((*pPacket).GetFirstOf(CCOS_PACK_HANDLE) >= 0)
+        {
+            ret = true;
+        }
+    }
+    catch (...)
+    {
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::GetPacketHandle(ResDataObject* pPacket, ResDataObject& Handle)
+{
+    bool ret = true;
+    try {
+        Handle = (*pPacket)[CCOS_PACK_HANDLE];
+    }
+    catch (...)
+    {
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::GetPacketHandleBusId(ResDataObject* pPacket, string& BusId, bool dev)
+{
+    bool ret = true;
+    try {
+        if (dev)
+        {
+            BusId = static_cast<const char*>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_BUSID]);
+        }
+        else
+        {
+            BusId = static_cast<const char*>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_OWNERID][CCOS_PACK_TARGET_BUSID]);
+        }
+
+    }
+    catch (...)
+    {
+        BusId = "";
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::GetPacketHandleMachineId(ResDataObject* pPacket, string& MachineId, bool dev)
+{
+    bool ret = true;
+    try {
+        if (dev)
+        {
+            MachineId = static_cast<const char*>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_MACHINEID]);
+        }
+        else
+        {
+            MachineId = static_cast<const char*>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_OWNERID][CCOS_PACK_TARGET_MACHINEID]);
+        }
+
+    }
+    catch (...)
+    {
+        MachineId = "";
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::GetPacketHandleProcId(ResDataObject* pPacket, uint64_t& ProcId, bool dev)
+{
+    bool ret = true;
+    try {
+        if (dev)
+        {
+            ProcId = static_cast<uint64_t>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_PROCID]);
+        }
+        else
+        {
+            ProcId = static_cast<uint64_t>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_OWNERID][CCOS_PACK_TARGET_PROCID]);
+        }
+
+    }
+    catch (...)
+    {
+        ProcId = 0;
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::GetPacketHandleCrc(ResDataObject* pPacket, uint64_t& Crc)
+{
+    bool ret = true;
+    try {
+        Crc = static_cast<uint64_t>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACKET_HANDLE_KEY]);
+    }
+    catch (...)
+    {
+        Crc = 0;
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::GetPacketHandleAddr(ResDataObject* pPacket, uint64_t& Addr, bool dev)
+{
+    bool ret = true;
+    try {
+        if (dev)
+        {
+            Addr = static_cast<uint64_t>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_ADDR]);
+        }
+        else
+        {
+            Addr = static_cast<uint64_t>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_OWNERID][CCOS_PACK_TARGET_ADDR]);
+        }
+
+    }
+    catch (...)
+    {
+        Addr = 0;
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::MakePacketContextExistance(ResDataObject* pPacket)
+{
+    bool ret = false;
+    try {
+        if ((*pPacket).GetFirstOf(CCOS_PACK_CONTEXT) >= 0)
+        {
+            ret = true;
+        }
+        else
+        {
+            (*pPacket).add(CCOS_PACK_CONTEXT, "");
+            ret = true;
+        }
+    }
+    catch (...)
+    {
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::GetPacketRoute(ResDataObject* pPacket, CCOS_PACKET_ROUTE& Route)
+{
+    bool ret = true;
+    Route = CCOS_PACKET_ROUTE_ANY; // 设置默认值
+    try {
+        Route = static_cast<CCOS_PACKET_ROUTE>(static_cast<int>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_ROUTE]));
+    }
+    catch (...)
+    {
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::GetPacketContext(ResDataObject* pPacket, ResDataObject& Context)
+{
+    bool ret = true;
+    try {
+        int Idx = (*pPacket).GetFirstOf(CCOS_PACK_CONTEXT);
+        if (Idx >= 0)
+        {
+            Context = (*pPacket)[Idx];
+        }
+    }
+    catch (...)
+    {
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::GetPacketTransaction(ResDataObject* pPacket, string& transaction)
+{
+    bool ret = true;
+    try {
+        int Idx = (*pPacket).GetFirstOf(CCOS_TRANSACTION);
+        if (Idx >= 0)
+        {
+            string id = static_cast<string>((*pPacket)[Idx]);
+            transaction = id;
+        }
+    }
+    catch (...)
+    {
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::GetPacketRetCode(ResDataObject* pPacket, RET_STATUS& retcode)
+{
+    bool ret = true;
+    try {
+        (retcode) = (RET_STATUS)((int)((*pPacket)[CCOS_PACK_RETURN][CCOS_PACK_CODE]));
+    }
+    catch (...)
+    {
+        retcode = RET_FAILED;
+        ret = false;
+    }
+
+    return ret;
+
+}
+
+bool PacketAnalizer::GetPacketMsgInfo(ResDataObject* pPacket, string& Info)
+{
+    bool ret = true;
+    try {
+        int Idx = (*pPacket)[CCOS_PACK_RETURN].GetFirstOf(CCOS_PACK_MSG);
+        if (Idx >= 0)
+        {
+            Info = static_cast<const char*>(((*pPacket)[CCOS_PACK_RETURN][Idx]));
+        }
+    }
+    catch (...)
+    {
+        ret = false;
+    }
+
+    return ret;
+}
+
+void  PacketAnalizer::MakeRetCode(RET_STATUS retcode, ResDataObject* pObj, const char* pMsg)
+{
+    ResDataObject RetObj, SubObj;
+    SubObj.add(CCOS_PACK_CODE, static_cast<int>(retcode));
+    if (pMsg)
+    {
+        SubObj.add(CCOS_PACK_MSG, pMsg);
+    }
+
+    pObj->update(CCOS_PACK_RETURN, SubObj);
+}
+
+bool  PacketAnalizer::CloneResponse(ResDataObject& Obj, ResDataObject* pReq)
+{
+    Obj.clear();
+    // 复制索引
+    uint32_t Idx = PacketAnalizer::GetPacketIdx(pReq);
+    if (Idx)
+    {
+        Obj.add(CCOS_PACK_IDX, Idx);
+        Obj.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_RES));
+        PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(pReq);
+        if (cmd != PACKET_CMD_NONE)
+        {
+            Obj.add(CCOS_PACK_CMD, static_cast<int>(cmd));
+            Obj.add(CCOS_PACK_HANDLE, (*pReq)[CCOS_PACK_HANDLE]);
+            string keystr = PacketAnalizer::GetPacketKey(pReq);
+            Obj.add(CCOS_PACK_KEY, keystr.c_str());
+            Obj.add(CCOS_PACK_CONTEXT, "");
+
+            return true;
+        }
+    }
+
+    return false;
+}
+
+bool  PacketAnalizer::UpdateOpenRequest(ResDataObject& Req, ResDataObject& MachineId, ResDataObject& busId, uint64_t ProcId, uint64_t Addr)
+{
+    try {
+        Req[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_ADDR] = Addr;
+        Req[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_PROCID] = ProcId;
+        Req[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_BUSID] = busId;
+        Req[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_MACHINEID] = MachineId;
+        string the_crc = "";
+        the_crc += Req[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_OWNERID].encode();
+        the_crc += static_cast<const char*>(Req[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID].encode());
+
+        uint64_t crc = GetCrc64(the_crc.c_str(), static_cast<uint32_t>(the_crc.size()));
+        Req[CCOS_PACK_HANDLE][CCOS_PACKET_HANDLE_KEY] = crc;
+
+        return true;
+    }
+    catch (...)
+    {
+    }
+
+    return false;
+}
+
+bool PacketAnalizer::UpdateHandleId(ResDataObject* Obj, uint64_t id)
+{
+    (*Obj)[CCOS_PACK_HANDLE][CCOS_PACKET_HANDLE_KEY] = id;
+    return true;
+}
+
+bool PacketAnalizer::GetHandleId(ResDataObject* Obj, uint64_t& Id)
+{
+    bool ret = true;
+    try {
+        Id = static_cast<uint64_t>((*Obj)[CCOS_PACK_HANDLE][CCOS_PACKET_HANDLE_KEY]);
+    }
+    catch (...)
+    {
+        Id = 0;
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::UpdateDeviceNotifyResponse(ResDataObject& Notify, ResDataObject& MachineId, ResDataObject& busId, uint64_t ProcId, uint64_t Addr)
+{
+    try {
+        CcosDevFileHandle handle;
+        handle.GetTarget(false)[CCOS_PACK_TARGET_MACHINEID] = static_cast<const char*>(MachineId);
+        handle.GetTarget(false)[CCOS_PACK_TARGET_BUSID] = static_cast<const char*>(busId);
+        handle.GetTarget(false)[CCOS_PACK_TARGET_PROCID] = ProcId;
+        handle.GetTarget(false)[CCOS_PACK_TARGET_ADDR] = Addr;
+
+        ResDataObject handleObj;
+        handle.GetResDataObject(handleObj);
+        Notify.update(CCOS_PACK_HANDLE, handleObj);
+
+        return true;
+    }
+    catch (...)
+    {
+    }
+
+    return false;
+}
+
+bool PacketAnalizer::UpdatePacketContext(ResDataObject& packet, ResDataObject& Context)
+{
+    try {
+        packet[CCOS_PACK_CONTEXT] = Context;
+        return true;
+    }
+    catch (...)
+    {
+    }
+
+    return false;
+}
+
+bool PacketAnalizer::UpdatePacketTransaction(ResDataObject& packet, string strTransaction)
+{
+    try {
+        packet.update(CCOS_TRANSACTION, strTransaction.c_str());
+        return true;
+    }
+    catch (...)
+    {
+    }
+
+    return false;
+}
+
+bool  PacketAnalizer::MakeOpenResponse(ResDataObject& Req, ResDataObject& Res, ResDataObject& DevResource)
+{
+    PacketAnalizer::CloneResponse(Res, &Req);
+    try {
+        Res.update(CCOS_PACK_CONTEXT, DevResource);
+        PacketAnalizer::MakeRetCode(RET_SUCCEED, &Res);
+        return true;
+    }
+    catch (...)
+    {
+    }
+
+    return false;
+}
+
+void  PacketAnalizer::MakeNotifyP2P(ResDataObject& Obj, PACKET_CMD cmd, ResDataObject* pReq, const char* pKey, const char* pContext)
+{
+    Obj.clear();
+    Obj.update(CCOS_PACK_IDX, PacketAnalizer::MakePacketIdx());
+    Obj.update(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_NOTIFY));
+    Obj.update(CCOS_PACK_CMD, static_cast<int>(cmd));
+    Obj.update(CCOS_PACK_HANDLE, (*pReq)[CCOS_PACK_HANDLE]);
+    Obj.update(CCOS_PACK_KEY, pKey);
+    Obj.update(CCOS_PACK_CONTEXT, pContext);
+    Obj.update(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
+}
+
+bool PacketAnalizer::UpdatePacketRoute(ResDataObject& Obj, CCOS_PACKET_ROUTE Route)
+{
+    Obj[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_ROUTE] = static_cast<int>(Route);
+    return true;
+}
+
+bool PacketAnalizer::UpdateNotifyHandle(ResDataObject& Obj, CcosDevFileHandle& handle)
+{
+    ResDataObject handleObj;
+    handle.GetResDataObject(handleObj);
+    Obj.update(CCOS_PACK_HANDLE, handleObj);
+    return true;
+}
+
+void  PacketAnalizer::MakeNotify(ResDataObject& Obj, PACKET_CMD cmd, const char* pKey, const char* pContext)
+{
+    Obj.clear();
+    Obj.update(CCOS_PACK_IDX, PacketAnalizer::MakePacketIdx());
+    Obj.update(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_NOTIFY));
+    Obj.update(CCOS_PACK_CMD, static_cast<int>(cmd));
+    Obj.update(CCOS_PACK_KEY, pKey);
+    Obj.update(CCOS_PACK_CONTEXT, pContext);
+    Obj.update(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
+}
+
+void  PacketAnalizer::MakeNotify(ResDataObject& Obj, PACKET_CMD cmd, ResDataObject& Key, const ResDataObject& Context)
+{
+    Obj.clear();
+    Obj.add(CCOS_PACK_IDX, PacketAnalizer::MakePacketIdx());
+    Obj.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_NOTIFY));
+    Obj.add(CCOS_PACK_CMD, static_cast<int>(cmd));
+    Obj.add(CCOS_PACK_KEY, Key);
+    Obj.add(CCOS_PACK_CONTEXT, const_cast<ResDataObject&>(Context));
+    Obj.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
+}
+
+void  PacketAnalizer::MakeNotify(ResDataObject& Obj, PACKET_CMD cmd, const char* pKey, const ResDataObject& Context)
+{
+    Obj.clear();
+    Obj.add(CCOS_PACK_IDX, PacketAnalizer::MakePacketIdx());
+    Obj.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_NOTIFY));
+    Obj.add(CCOS_PACK_CMD, static_cast<int>(cmd));
+    Obj.add(CCOS_PACK_KEY, pKey);
+    Obj.add(CCOS_PACK_CONTEXT, const_cast<ResDataObject&>(Context));
+    Obj.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
+}
+
+uint32_t  PacketAnalizer::MakeActionRequest(ResDataObject& Obj, CcosDevFileHandle& handle, const char* pActionName, ResDataObject& ReqParams, ACTION_SYNC_MODE mode)
+{
+    uint32_t tick = PacketAnalizer::MakePacketIdx();
+    Obj.clear();
+    Obj.add(CCOS_PACK_IDX, tick);
+    Obj.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_REQ));
+    Obj.add(CCOS_PACK_CMD, static_cast<int>(PACKET_CMD_EXE));
+    Obj.add(CCOS_PACKET_SYNC, static_cast<int>(mode));
+    Obj.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
+
+    ResDataObject handleObj;
+    handle.GetResDataObject(handleObj);
+    Obj.add(CCOS_PACK_HANDLE, handleObj);
+
+    Obj.add(CCOS_PACK_KEY, pActionName);
+    Obj.add(CCOS_PACK_CONTEXT, ReqParams);
+
+    return tick;
+}
+
+uint32_t PacketAnalizer::MakeRequest(ResDataObject& Obj, const char* pszReqName, PACKET_CMD cmd, ResDataObject* reqParams)
+{
+    DWORD tick = PacketAnalizer::MakePacketIdx();
+    Obj.clear();
+    Obj.add(CCOS_PACK_IDX, tick);
+    Obj.add(CCOS_PACK_TYPE, (int)PACKET_TYPE_REQ);
+    Obj.add(CCOS_PACK_CMD, (int)cmd);
+    Obj.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
+
+    Obj.add(CCOS_PACK_KEY, pszReqName);
+    Obj.add(CCOS_PACK_CONTEXT, *reqParams);
+
+    return tick;
+}
+uint32_t PacketAnalizer::MakeOpenRequest(ResDataObject& Obj, CcosDevFileHandle& handle, const char* pFilePath)
+{
+    uint32_t tick = PacketAnalizer::MakePacketIdx();
+    Obj.clear();
+    Obj.add(CCOS_PACK_IDX, tick);
+    Obj.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_REQ));
+    Obj.add(CCOS_PACK_CMD, static_cast<int>(PACKET_CMD_OPEN));
+    Obj.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
+
+    ResDataObject handleObj;
+    handle.GetResDataObject(handleObj);
+    Obj.add(CCOS_PACK_HANDLE, handleObj);
+
+    Obj.add(CCOS_PACK_KEY, pFilePath);
+
+    ResDataObject context;
+    context.add(CCOS_RESP_TOPIC, "");
+    Obj.add(CCOS_PACK_CONTEXT, context);
+
+    return tick;
+}
+
+bool PacketAnalizer::MakeResponseByReq(ResDataObject& Response, ResDataObject& Req, RET_STATUS ret, const char* pInfo)
+{
+    PacketAnalizer::CloneResponse(Response, &Req);
+    PacketAnalizer::MakeRetCode(ret, &Response, pInfo);
+    return true;
+}
+
+bool PacketAnalizer::MakeCloseNotifyByRes(ResDataObject& Response, ResDataObject& Req)
+{
+    uint32_t tick = PacketAnalizer::MakePacketIdx();
+    Req.clear();
+    Req.add(CCOS_PACK_IDX, tick);
+    Req.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_NOTIFY));
+    Req.add(CCOS_PACK_CMD, static_cast<int>(PACKET_CMD_CLOSE));
+    Req.add(CCOS_PACK_HANDLE, Response[CCOS_PACK_HANDLE]);
+    Req.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
+
+    return true;
+}
+
+bool PacketAnalizer::MakeCloseRequestByRes(ResDataObject& Response, ResDataObject& Req)
+{
+    uint32_t tick = PacketAnalizer::MakePacketIdx();
+    Req.clear();
+    Req.add(CCOS_PACK_IDX, tick);
+    Req.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_REQ));
+    Req.add(CCOS_PACK_CMD, static_cast<int>(PACKET_CMD_CLOSE));
+    Req.add(CCOS_PACK_HANDLE, Response[CCOS_PACK_HANDLE]);
+
+    return true;
+}
+
+bool PacketAnalizer::MakeCloseRequest(ResDataObject& Obj, CcosDevFileHandle& handle, PACKET_TYPE Type)
+{
+    uint32_t tick = PacketAnalizer::MakePacketIdx();
+    Obj.clear();
+    Obj.add(CCOS_PACK_IDX, tick);
+    Obj.add(CCOS_PACK_TYPE, static_cast<int>(Type));
+    Obj.add(CCOS_PACK_CMD, static_cast<int>(PACKET_CMD_CLOSE));
+    Obj.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
+    ResDataObject handleObj;
+    handle.GetResDataObject(handleObj);
+    Obj.add(CCOS_PACK_HANDLE, handleObj);
+
+    return true;
+}
+
+bool PacketAnalizer::MakeCloseResponse(ResDataObject& Req, ResDataObject& Res)
+{
+    PacketAnalizer::CloneResponse(Res, &Req);
+    PacketAnalizer::MakeRetCode(RET_SUCCEED, &Res);
+    return true;
+}
+
+bool  PacketAnalizer::GetParam(ResDataObject* pReq, unsigned int ParamIdx, ResDataObject& value)
+{
+    bool ret = false;
+    string parami = "P" + to_string(ParamIdx); // 使用标准库函数生成参数名
+
+    try {
+        if ((*pReq)[CCOS_PACK_CONTEXT].GetFirstOf(parami.c_str()) >= 0)
+        {
+            value = (*pReq)[CCOS_PACK_CONTEXT][parami.c_str()];
+            return true;
+        }
+    }
+    catch (...)
+    {
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool  PacketAnalizer::AddParam(ResDataObject* pRes, unsigned int ParamIdx, ResDataObject& value)
+{
+    bool ret = true;
+    string parami = "P" + to_string(ParamIdx); // 使用标准库函数生成参数名
+
+    try {
+        ret = (*pRes)[CCOS_PACK_CONTEXT].add(parami.c_str(), value);
+    }
+    catch (...)
+    {
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool  PacketAnalizer::UpdateParam(ResDataObject* pRes, unsigned int ParamIdx, ResDataObject& value)
+{
+    bool ret = true;
+    string parami = "P" + to_string(ParamIdx); // 使用标准库函数生成参数名
+
+    try {
+        ret = (*pRes)[CCOS_PACK_CONTEXT].update(parami.c_str(), value);
+    }
+    catch (...)
+    {
+        ret = false;
+    }
+
+    return ret;
+}
+
+bool PacketAnalizer::UpdatePacketTopic(ResDataObject* Obj, const char* pszTopic, const char* pszClientID)
+{
+    Obj->update(CCOS_TOPIC, pszTopic);
+    Obj->update(CCOS_PUBLISH, pszClientID);
+    return true;
+}
+
+bool PacketAnalizer::UpdatePacketKey(ResDataObject* Obj, const char* keystr)
+{
+    Obj->update(CCOS_PACK_KEY, keystr);
+    return true;
+}
+
+bool PacketAnalizer::UpdateContextTopic(ResDataObject* Obj, const char* pszRespTopic)
+{
+    (*Obj)[CCOS_PACK_CONTEXT].update(CCOS_RESP_TOPIC, pszRespTopic);
+    return true;
+}
+
+bool PacketAnalizer::GetContextTopic(ResDataObject* Obj, ResDataObject& topic)
+{
+    if ((*Obj).GetFirstOf("ResponseTopic") > 0)
+        topic = (*Obj)["ResponseTopic"];
+    else
+        topic = (*Obj)[CCOS_PACK_CONTEXT][CCOS_RESP_TOPIC];
+    return true;
+}
+
+bool PacketAnalizer::GetPacketTopic(ResDataObject* Obj, ResDataObject& topic)
+{
+    if ((*Obj).GetFirstOf(CCOS_TOPIC) > 0)
+        topic = (*Obj)[CCOS_TOPIC];
+    else
+        topic = (*Obj)[CCOS_PACK_CONTEXT][CCOS_RESP_TOPIC];
+    return true;
+}
+
+bool PacketAnalizer::CloneTransaction(ResDataObject* req, ResDataObject* res)
+{
+    if ((*req).GetFirstOf("Transaction") > 0)
+        res->update("Transaction", (*req)["Transaction"]);
+    return true;
+}
+
+string  PacketAnalizer::GetActionTopic(const char* szDevicePath, const char* szAction)
+{
+    const char* pPath = szDevicePath;
+    if (szDevicePath[0] == '/')
+        pPath++;
+    stringstream strea;
+    strea << pPath << "/Action/" << szAction;
+    return strea.str();
+}

+ 85 - 0
CommonPacket/PacketAnalizer.h

@@ -0,0 +1,85 @@
+#pragma once
+
+#include "CcosFileHandle.h"
+#include <cstdint> // 添加标准整数类型头文件
+
+class PacketAnalizer
+{
+public:
+    PacketAnalizer(void);
+    virtual ~PacketAnalizer(void);
+
+    static uint32_t GetPacketIdx(ResDataObject* pObj);
+    static PACKET_TYPE GetPacketType(ResDataObject* pObj);
+    static PACKET_CMD GetPacketCmd(ResDataObject* pObj);
+    static std::string GetPacketKey(ResDataObject* pObj);
+    static ResDataObject* GetPacketKeysRes(ResDataObject* pObj);
+    static std::string GetPacketPublisher(ResDataObject* pObj);
+
+    static bool GetPacketHandleExistance(ResDataObject* pPacket);
+    static bool GetPacketHandle(ResDataObject* pPacket, ResDataObject& Handle);
+    static bool GetPacketHandleBusId(ResDataObject* pPacket, std::string& BusId, bool dev);
+    static bool GetPacketHandleMachineId(ResDataObject* pPacket, std::string& MachineId, bool dev);
+    static bool GetPacketHandleProcId(ResDataObject* pPacket, uint64_t& ProcId, bool dev);
+    static bool GetPacketHandleAddr(ResDataObject* pPacket, uint64_t& Addr, bool dev);
+
+    static bool GetDestinationMachineId(ResDataObject& packet, std::string& machineId);
+    static bool GetDestinationBusId(ResDataObject& packet, std::string& busId);
+    static bool GetDestinationProcId(ResDataObject& packet, uint64_t& procId);
+
+    static bool GetPacketHandleCrc(ResDataObject* pPacket, uint64_t& Crc);
+
+    static bool MakePacketContextExistance(ResDataObject* pPacket);
+
+    static bool GetPacketRoute(ResDataObject* pPacket, CCOS_PACKET_ROUTE& Route);
+
+    static bool GetPacketContext(ResDataObject* pPacket, ResDataObject& Context);
+    static bool GetPacketRetCode(ResDataObject* pPacket, RET_STATUS& retcode);
+    static bool GetPacketMsgInfo(ResDataObject* pPacket, std::string& Info);
+    static bool GetPacketTransaction(ResDataObject* pPacket, std::string& transaction);
+
+    static bool CloneResponse(ResDataObject& Obj, ResDataObject* pReq);
+
+    static uint32_t MakePacketIdx();
+    static ACTION_SYNC_MODE GetPacketSyncMode(ResDataObject* pObj);
+    static void MakeRetCode(RET_STATUS retcode, ResDataObject* pObj, const char* pMsg = NULL);
+
+    static bool MakeResponseByReq(ResDataObject& Response, ResDataObject& Req, RET_STATUS ret, const char* pInfo = NULL);
+
+    static void MakeNotify(ResDataObject& Obj, PACKET_CMD cmd, ResDataObject& Key, const ResDataObject& Context);
+    static void MakeNotify(ResDataObject& Obj, PACKET_CMD cmd, const char* pKey, const ResDataObject& Context);
+    static void MakeNotify(ResDataObject& Obj, PACKET_CMD cmd, const char* pKey, const char* pContext);
+    static void MakeNotifyP2P(ResDataObject& Obj, PACKET_CMD cmd, ResDataObject* pReq, const char* pKey, const char* pContext);
+
+    static uint32_t MakeActionRequest(ResDataObject& Obj, CcosDevFileHandle& handle, const char* pActionName, ResDataObject& ReqParams, ACTION_SYNC_MODE mode = ACTION_SYNC);
+    static uint32_t MakeRequest(ResDataObject& Obj, const char* pszReqName, PACKET_CMD cmd, ResDataObject* reqParams);
+    static uint32_t MakeOpenRequest(ResDataObject& Obj, CcosDevFileHandle& handle, const char* pFilePath);
+    static bool MakeOpenResponse(ResDataObject& Req, ResDataObject& Res, ResDataObject& DevResource);
+
+    static bool MakeCloseNotifyByRes(ResDataObject& Response, ResDataObject& Req);
+    static bool MakeCloseRequestByRes(ResDataObject& Response, ResDataObject& Req);
+    static bool MakeCloseRequest(ResDataObject& Obj, CcosDevFileHandle& handle, PACKET_TYPE Type = PACKET_TYPE_REQ);
+    static bool MakeCloseResponse(ResDataObject& Req, ResDataObject& Res);
+
+    static bool UpdatePacketRoute(ResDataObject& Obj, CCOS_PACKET_ROUTE Route);
+    static bool UpdateOpenRequest(ResDataObject& Req, ResDataObject& MachineId, ResDataObject& busId, uint64_t ProcId, uint64_t Addr);
+    static bool UpdateNotifyHandle(ResDataObject& Obj, CcosDevFileHandle& handle);
+    static bool UpdateDeviceNotifyResponse(ResDataObject& Req, ResDataObject& MachineId, ResDataObject& busId, uint64_t ProcId, uint64_t Addr);
+    static bool UpdatePacketContext(ResDataObject& packet, ResDataObject& Context);
+    static bool UpdatePacketTransaction(ResDataObject& packet, std::string strTransaction);
+
+    static bool GetParam(ResDataObject* pReq, unsigned int ParamIdx, ResDataObject& value);
+    static bool AddParam(ResDataObject* pRes, unsigned int ParamIdx, ResDataObject& value);
+    static bool UpdateParam(ResDataObject* pRes, unsigned int ParamIdx, ResDataObject& value);
+
+    static bool UpdatePacketTopic(ResDataObject* Obj, const char* pszTopic, const char* pszClientID);
+    static bool UpdatePacketKey(ResDataObject* Obj, const char* keystr);
+    static bool UpdateContextTopic(ResDataObject* Obj, const char* pszRespTopic);
+    static bool GetContextTopic(ResDataObject* Obj, ResDataObject& topic);
+    static bool GetPacketTopic(ResDataObject* Obj, ResDataObject& topic);
+    static bool CloneTransaction(ResDataObject* req, ResDataObject* res);
+
+    static std::string GetActionTopic(const char* szDevicePath, const char* szAction);
+    static bool UpdateHandleId(ResDataObject* Obj, uint64_t id);
+    static bool GetHandleId(ResDataObject* Obj, uint64_t& Id);
+};

+ 15 - 16
DrvProc/CcosChannel/CMakeLists.txt

@@ -35,15 +35,13 @@ include_directories(
     ${DELIVER_INCLUDE_DIR}/Img_header
 )
 
-# 配置源文件
+# 配置源文件(移除PacketAnalizer重复源文件,保留AutoDmp)
 set(SRC_FILES
     ConsoleThread.h
     ConsoleThread.cpp
     CcosChannel.cpp
     ${DELIVER_INCLUDE_DIR}/AutoDmp.h
     ${DELIVER_INCLUDE_DIR}/AutoDmp.cpp
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
 )
 
 # 创建可执行程序目标
@@ -56,30 +54,31 @@ set_target_properties(CcosChannel PROPERTIES
     OUTPUT_NAME "CcosChannel"
 )
 
-# 链接依赖库
+# 链接依赖库(添加CommonPacket)
 if(UNIX AND NOT APPLE)
     # 假设存在这些库,根据实际情况调整
-    set(ADDITIONAL_LIBS 
+    set(ADDITIONAL_LIBS
         uuid
     )
-    
-    target_link_libraries(CcosChannel PRIVATE 
-        CcosThread 
-        LocalConfig 
-        OemBusUnit 
-        CcosFileHandle 
-        LogicClient 
-        LogicDevice 
+
+    target_link_libraries(CcosChannel PRIVATE
+        CcosThread
+        LocalConfig
+        OemBusUnit
+        CcosFileHandle
+        LogicClient
+        LogicDevice
         CcosLock
         Crc64
         ResDataObject
         ContainerDPC
         ${ADDITIONAL_LIBS}
-        CDI 
+        CDI
         common_api
+        CommonPacket
     )
-    
-    message(STATUS "已链接: CcosThread LocalConfig OemBusUnit CcosFileHandle LogicClient LogicDevice CcosLock Crc64 ${ADDITIONAL_LIBS} CDI")
+
+    message(STATUS "已链接: CcosThread LocalConfig OemBusUnit CcosFileHandle LogicClient LogicDevice CcosLock Crc64 ResDataObject ContainerDPC CDI common_api CommonPacket ${ADDITIONAL_LIBS}")
 endif()
 
 # 确保交付目录结构存在

+ 4 - 6
DrvProc/CcosProc/CMakeLists.txt

@@ -35,15 +35,13 @@ include_directories(
     ${DELIVER_INCLUDE_DIR}/Img_header
 )
 
-# 配置源文件
+# 配置源文件(移除PacketAnalizer重复源文件,保留AutoDmp)
 set(SRC_FILES
     ConsoleThread.h
     ConsoleThread.cpp
     CcosProc.cpp
     ${DELIVER_INCLUDE_DIR}/AutoDmp.h
     ${DELIVER_INCLUDE_DIR}/AutoDmp.cpp
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
 	${DELIVER_INCLUDE_DIR}/common_api.h
 )
 
@@ -57,10 +55,10 @@ set_target_properties(CcosProc PROPERTIES
     OUTPUT_NAME "CcosProc"
 )
 
-# 链接依赖库
+# 链接依赖库(添加CommonPacket)
 if(UNIX AND NOT APPLE)
-    target_link_libraries(CcosProc PRIVATE CDI CcosThread LocalConfig OemBusUnit common_api)
-    message(STATUS "已链接: LogicDevice")
+    target_link_libraries(CcosProc PRIVATE CDI CcosThread LocalConfig OemBusUnit common_api CommonPacket)
+    message(STATUS "已链接: CDI CcosThread LocalConfig OemBusUnit common_api CommonPacket")
 endif()
 
 # 确保交付目录结构存在

+ 4 - 6
DrvProc/libCcosProc/CMakeLists.txt

@@ -43,14 +43,12 @@ include_directories(
     ${DELIVER_INCLUDE_DIR}
 )
 
-# 配置源文件
+# 配置源文件(移除PacketAnalizer重复源文件,保留AutoDmp)
 set(SRC_FILES
     DeviceManager.h
     DriverManager.cpp
 	${DELIVER_INCLUDE_DIR}/AutoDmp.h
 	${DELIVER_INCLUDE_DIR}/AutoDmp.cpp
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
 	${DELIVER_INCLUDE_DIR}/common_api.h
 )
 
@@ -64,10 +62,10 @@ set_target_properties(libCcosProc PROPERTIES
     OUTPUT_NAME "libCcosProc"
 )
 
-# 链接依赖库
+# 链接依赖库(添加CommonPacket)
 if(UNIX AND NOT APPLE)
-    target_link_libraries(libCcosProc PRIVATE common_api LocalConfig CDI protobuf grpc++)
-    message(STATUS "已链接: LocalConfig CDI")
+    target_link_libraries(libCcosProc PRIVATE common_api LocalConfig CDI protobuf grpc++ CommonPacket)
+    message(STATUS "已链接: common_api LocalConfig CDI protobuf grpc++ CommonPacket")
 endif()
 
 # 确保交付目录结构存在

+ 16 - 7
LocalConfig/LocalConfig.cpp

@@ -544,26 +544,35 @@ LOCALCONFIG_API bool MakeUniqEbusId(ResDataObject& res) {
  * 获取设备类型字符串
  */
 LOCALCONFIG_API string& GetMajorID() {
-    // 从本地配置获取缺失的ID
+    // 从本地配置获取缺失的ID(添加空指针检查)
     if (GetMajorIDInstance().empty()) {
         ResDataObject val = tryGetLocalOptions("MajorID");
-        GetMajorIDInstance() = (const char*)val;
+        const char* valStr = (const char*)val;
+        GetMajorIDInstance() = valStr ? valStr : ""; // 避免空指针赋值
     }
     if (GetVendorID().empty()) {
         ResDataObject val = tryGetLocalOptions("VendorID");
-        GetVendorID() = (const char*)val;
+        const char* valStr = (const char*)val;
+        GetVendorID() = valStr ? valStr : "";
     }
     if (GetProductID().empty()) {
         ResDataObject val = tryGetLocalOptions("ProductID");
-        GetProductID() = (const char*)val;
+        const char* valStr = (const char*)val;
+        GetProductID() = valStr ? valStr : "";
     }
     if (GetSerialID().empty()) {
         ResDataObject val = tryGetLocalOptions("SerialID");
-        GetSerialID() = (const char*)val;
+        const char* valStr = (const char*)val;
+        GetSerialID() = valStr ? valStr : "";
     }
 
-    // 构建设备类型字符串
-    GetDeviceType() = GetMajorIDInstance() + "_" + GetVendorID() + "_" + GetProductID() + "_" + GetSerialID();
+    // 构建设备类型字符串(确保所有组件非空,避免无效拼接)
+    std::string deviceType = GetMajorIDInstance();
+    if (!GetVendorID().empty()) deviceType += "_" + GetVendorID();
+    if (!GetProductID().empty()) deviceType += "_" + GetProductID();
+    if (!GetSerialID().empty()) deviceType += "_" + GetSerialID();
+    GetDeviceType() = deviceType;
+
     return GetDeviceType();
 }
 

+ 11 - 3
Log4cpp/Log4CPP.cpp

@@ -144,10 +144,18 @@ void LogInstance::getCurrentTimeWithMs(std::string& timeStr) {
     auto now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
         now.time_since_epoch()) % 1000;
 
-    tm* now_tm = localtime(&now_time_t);
+    // 使用线程安全的 localtime_r 替代 localtime
+    struct tm now_tm_storage;
+    struct tm* now_tm = localtime_r(&now_time_t, &now_tm_storage);
 
     char buffer[80];
-    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", now_tm);
+    if (now_tm != nullptr) {
+        strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", now_tm);
+    } else {
+        // 如果 localtime_r 失败,使用默认值
+        strncpy(buffer, "1970-01-01 00:00:00", sizeof(buffer));
+        buffer[sizeof(buffer) - 1] = '\0';
+    }
 
     std::ostringstream oss;
     oss << buffer << "." << std::setfill('0') << std::setw(3) << now_ms.count();
@@ -308,7 +316,7 @@ bool LogInstance::init(const std::string& logHostName, const std::string& module
 
         // 控制台Appender
         if (outToScreen) {
-            // logScreen = new log4cpp::OstreamAppender("console_" + moduleName, &std::cout);
+            logScreen = new log4cpp::OstreamAppender("console_" + moduleName, &std::cout);
             logScreen->setLayout(screenLayout);
         }
 

+ 4 - 6
LogicClient/CMakeLists.txt

@@ -45,10 +45,8 @@ include_directories(
 )
 message(STATUS "包含交付头文件目录: ${DELIVER_INCLUDE_DIR}")
 
-# 配置源文件
+# 配置源文件(移除PacketAnalizer重复源文件)
 set(SRC_FILES
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
 	${DELIVER_INCLUDE_DIR}/common_api.h
     LogicClient.cpp
     LogicClient.h
@@ -66,10 +64,10 @@ set_target_properties(LogicClient PROPERTIES
     OUTPUT_NAME "LogicClient"
 )
 
-# 链接依赖库
+# 链接依赖库(添加CommonPacket)
 if(UNIX AND NOT APPLE)
-    target_link_libraries(LogicClient PRIVATE common_api LogicDevice)
-    message(STATUS "已链接: ResDataObject ")
+    target_link_libraries(LogicClient PRIVATE common_api LogicDevice CommonPacket)
+    message(STATUS "已链接: common_api LogicDevice CommonPacket")
 endif()
 
 # 确保交付目录结构存在

+ 12 - 6
LogicDevice--mqtt/CMakeLists.txt

@@ -49,10 +49,8 @@ include_directories(
 )
 message(STATUS "包含交付头文件目录: ${DELIVER_INCLUDE_DIR}")
 
-# 配置源文件
+# 配置源文件(仅移除PacketAnalizer,保留其他源文件)
 set(SRC_FILES
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
 	${DELIVER_INCLUDE_DIR}/Base64.cpp
 	${DELIVER_INCLUDE_DIR}/Base64.h
 	${DELIVER_INCLUDE_DIR}/common_api.h
@@ -78,10 +76,18 @@ set_target_properties(LogicDevice PROPERTIES
     OUTPUT_NAME "LogicDevice"
 )
 
-# 链接依赖库
+# 链接依赖库(添加CommonPacket库)
 if(UNIX AND NOT APPLE)
-    target_link_libraries(LogicDevice PRIVATE uuid Crc64 common_api CcosLock LocalConfig mqttclient)
-    message(STATUS "已链接: ResDataObject ")
+    target_link_libraries(LogicDevice PRIVATE
+        uuid
+        Crc64
+        common_api
+        CcosLock
+        LocalConfig
+        mqttclient
+        CommonPacket
+    )
+    message(STATUS "已链接: uuid Crc64 common_api CcosLock LocalConfig mqttclient CommonPacket")
 endif()
 
 # 确保交付目录结构存在

+ 55 - 27
LogicDevice--mqtt/LogicDevice.cpp

@@ -577,7 +577,8 @@ DWORD  LogicDevice::Thread_Publish_Thread(void* pPara)
 			FINFO(" [{$}] Publish key [{$}] type [{$}] cmd [{$}] ", handle->m_strClientID, PacketAnalizer::GetPacketKey(&resSend), (int)type, (int)cmd);
 			if (PACKET_CMD_NONE == cmd)
 			{
-				FDEBUG(" [{$}] Publish what packet {$} ", handle->m_strClientID, resSend.encode());
+				// 移除 encode() 调用避免内存问题
+				FDEBUG(" [{$}] Publish what packet (packet details not logged)", handle->m_strClientID);
 			}
 			if (type == PACKET_TYPE_NOTIFY)
 			{
@@ -587,7 +588,8 @@ DWORD  LogicDevice::Thread_Publish_Thread(void* pPara)
 				PacketAnalizer::UpdatePacketTransaction(resSend, handle->m_strCurTransaction);
 
 				PacketAnalizer::UpdateDeviceNotifyResponse(resSend, getLocalMachineId(), getLocalEbusId(), (UINT64)pthread_self(), (UINT64)handle->m_pMqttConntion);
-				FDEBUG("Notify: {$}", resSend.encode());
+				// 移除 encode() 调用避免内存问题
+				FDEBUG("Notify key: {$}", PacketAnalizer::GetPacketKey(&resSend));
 				//printf("-->  %s \n", pCmd->encode());
 				PublishAction(&resSend, (handle->m_strEBusRoot + "/Notify").c_str(), handle->m_pMqttConntion);
 				PublishAction(&resSend, (handle->m_strCCOSRoot + "/Notify/" + PacketAnalizer::GetPacketKey(&resSend)).c_str(), handle->m_pMqttConntion);
@@ -1081,14 +1083,18 @@ RET_STATUS LogicDevice::GetDeviceResource(ResDataObject PARAM_OUT *pDeviceResour
 //notify from lower layer
 RET_STATUS LogicDevice::CmdFromLogicDev(ResDataObject *pCmd)
 {
+	// 移除 encode() 调用以避免内存问题
 	PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(pCmd);
 	PACKET_TYPE type = PacketAnalizer::GetPacketType(pCmd);
+	FDEBUG("[{$}] CmdFromLogicDev: type={$} cmd={$}", m_strClientID, (int)type, (int)cmd);
 	if (type == PACKET_TYPE_NOTIFY)
 	{
+		FDEBUG("[{$}] Processing NOTIFY", m_strClientID);
 		CcosDevFileHandle* pHandle = new CcosDevFileHandle;
 		PacketAnalizer::UpdateNotifyHandle(*pCmd, *pHandle);
 		FDEBUG("Notify Transaction: {$}", m_strCurTransaction);
 		PacketAnalizer::UpdatePacketTransaction(*pCmd, m_strCurTransaction);
+		// 已删除导致内存错误的调试代码
 		;
 		//if (m_strEBusRoot.length() <= 0)
 		//{
@@ -1101,10 +1107,11 @@ RET_STATUS LogicDevice::CmdFromLogicDev(ResDataObject *pCmd)
 			static_cast<uint64_t>(getpid()),  // Linux 上获取进程 ID
 			reinterpret_cast<uint64_t>(m_pMqttConntion)  // 假设 m_pMqttConntion 在 Linux 上是指针类型
 		);
-
-		FDEBUG("[{$}] Notify: {$}", m_strClientID, pCmd->encode());
+		// 已移除 pCmd->encode() 调用,避免潜在的内存问题
+		FDEBUG("[{$}] Notify: key={$}", m_strClientID, PacketAnalizer::GetPacketKey(pCmd));
 		//printf("-->  %s \n", pCmd->encode());
 		PacketAnalizer::UpdatePacketTopic(pCmd, (m_strEBusRoot + "/Notify").c_str(), m_strClientID.c_str());
+		FDEBUG("[{$}] Notify updated topic", m_strClientID);
 		PublishAction(pCmd, (m_strEBusRoot + "/Notify").c_str(), m_pMqttConntion);
 
 		string strNotifyPath = "/Notify/" + PacketAnalizer::GetPacketKey(pCmd);
@@ -1266,7 +1273,8 @@ RET_STATUS LogicDevice::AddErrorMessageBase(const char* DevInstance, const char*
 
 		PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_ADD, "ErrorList", ResNotify);
 
-		FWARN( "preposterror ErrorType:{$} {$}", nMessageType,NotifyData.encode());
+		// 移除 encode() 调用避免内存问题
+		FWARN( "preposterror ErrorType:{$}", nMessageType);
 
 		CmdFromLogicDev(&NotifyData);
 		//PublishAction(&NotifyData, (m_strEBusRoot + "/Notify").c_str(), m_pMqttConntion);
@@ -1381,7 +1389,8 @@ RET_STATUS LogicDevice::DelErrorMessage(const char* DevInstance, const char* Cod
 	{
 		ResNotify.add(strDevInstanceCode.c_str(), ErrorInfo);
 		PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_DEL, "ErrorList", ResNotify);
-		FWARN( "pre Del error ErrorCode:{$} {$}", Code ,NotifyData.encode());
+		// 移除 encode() 调用避免内存问题
+		FWARN( "pre Del error ErrorCode:{$}", Code);
 		CmdFromLogicDev(&NotifyData);
 		//PublishAction(&NotifyData, (m_strEBusRoot + "/Notify").c_str(), m_pMqttConntion);
 	}
@@ -1505,29 +1514,35 @@ RET_STATUS LogicDevice::IoSystemLog(int Level, const char* pCode, const char* pC
 	{
 	case Syslog_Debug:
 		//RES_PRINTA_DEBUG(m_pLogger, SysLogNode, "SysLog");
-		FDEBUG("SysLog {$} ", SysLogNode.encode());
+		// 移除 encode() 调用避免内存问题
+		FDEBUG("SysLog");
 		break;
 	case Syslog_Information:
 		///RES_PRINTA_INFO(m_pLogger, SysLogNode, "SysLog");
-		FINFO("SysLog {$} ", SysLogNode.encode());
+		// 移除 encode() 调用避免内存问题
+		FINFO("SysLog");
 		break;
 	case Syslog_Warning:
 		//RES_PRINTA_WARN(m_pLogger, SysLogNode, "SysLog");
-		FWARN("SysLog {$} ", SysLogNode.encode());
+		// 移除 encode() 调用避免内存问题
+		FWARN("SysLog");
 
 		break;
 	case Syslog_Error:
 		//RES_PRINTA_ERROR(m_pLogger, SysLogNode, "SysLog");
-		FERROR("SysLog {$} ", SysLogNode.encode());
+		// 移除 encode() 调用避免内存问题
+		FERROR("SysLog");
 
 		break;
 	case Syslog_Fatal:
 		//RES_PRINTA_FATAL(m_pLogger, SysLogNode, "SysLog");
-		FINFO("SysLog {$} ", SysLogNode.encode());
+		// 移除 encode() 调用避免内存问题
+		FINFO("SysLog");
 
 		break;
 	default:
-		FINFO("SysLog {$} " ,SysLogNode.encode() );
+		// 移除 encode() 调用避免内存问题
+		FINFO("SysLog");
 		break;
 	}
 
@@ -1648,29 +1663,35 @@ RET_STATUS LogicDevice::SystemLog(SYSLOGLEVEL Level,const char *pCode, const cha
 	{
 	case Syslog_Debug:
 		//RES_PRINTA_DEBUG(m_pLogger, SysLogNode, "SysLog");
-		FDEBUG("SysLog {$}", SysLogNode.encode());
+		// 移除 encode() 调用避免内存问题
+		FDEBUG("SysLog");
 		break;
 	case Syslog_Information:
 		//RES_PRINTA_INFO(m_pLogger, SysLogNode, "SysLog");
-		FINFO("SysLog {$}", SysLogNode.encode());
+		// 移除 encode() 调用避免内存问题
+		FINFO("SysLog");
 		break;
 	case Syslog_Warning:
 		//RES_PRINTA_WARN(m_pLogger, SysLogNode, "SysLog");
-		FWARN("SysLog {$}", SysLogNode.encode());
+		// 移除 encode() 调用避免内存问题
+		FWARN("SysLog");
 
 		break;
 	case Syslog_Error:
 		//RES_PRINTA_ERROR(m_pLogger, SysLogNode, "SysLog");
-		FERROR("SysLog {$}", SysLogNode.encode());
+		// 移除 encode() 调用避免内存问题
+		FERROR("SysLog");
 
 		break;
 	case Syslog_Fatal:
 		//RES_PRINTA_FATAL(m_pLogger, SysLogNode, "SysLog");
-		FINFO("SysLog {$}", SysLogNode.encode());
+		// 移除 encode() 调用避免内存问题
+		FINFO("SysLog");
 
 		break;
 	default:
-		FINFO( "SysLog {$}", SysLogNode.encode());
+		// 移除 encode() 调用避免内存问题
+		FINFO("SysLog");
 		break;
 	}
 
@@ -3163,8 +3184,8 @@ LOGICDEVICE_API int  PublishAction(ResDataObject* pAction, const char* pszTopic,
 {
 	if (hConnection == nullptr)
 	{
-		FDEBUG("Who ????? Publish to {$} Action Body: {$}", pszTopic, pAction->encode());
-		// std::cout << CurrentDateTime() << "Who ????? " << "Publish to [" << pszTopic << "] Action Body: "<< pAction->encode() << endl; //<< pAction->encode() 
+		// 移除 encode() 调用避免内存问题
+		FDEBUG("Who ????? Publish to {$} Action Body: (not logged to avoid memory issues)", pszTopic);
 		return 0;
 	}
 	// std::cout << CurrentDateTime()<<" " << std::get<CLINET_ID_ID>(*hConnection) << " Publish Action to  [" << pszTopic << "] Action Body: " << endl; //<< pAction->encode() 
@@ -3172,7 +3193,8 @@ LOGICDEVICE_API int  PublishAction(ResDataObject* pAction, const char* pszTopic,
 	string topic = pszTopic;
 	if (topic.length() <= 0)
 	{
-		FWARN("ignore empty topic packet {$}", pAction->encode());
+		// 移除 encode() 调用避免内存问题
+		FWARN("ignore empty topic packet");
 		return 2;
 	}
 
@@ -3184,7 +3206,8 @@ LOGICDEVICE_API int  PublishAction(ResDataObject* pAction, const char* pszTopic,
 	std::string client_id = std::get<CLINET_ID_ID>(*hConnection);
 	CcosLock* pLock = std::get<CONN_SEND_LOCK_ID>(*hConnection);
 	pLock->Thread_Lock();
-	FDEBUG("{$} Publish Action to {$} Action Body: {$}", std::get<CLINET_ID_ID>(*hConnection), pszTopic, pAction->encode());
+	// 移除 encode() 调用避免内存问题
+	FDEBUG("{$} Publish Action to {$}", std::get<CLINET_ID_ID>(*hConnection), pszTopic);
 
 	//string org_publisher = PacketAnalizer::GetPacketPublisher(pAction);
 	//if(org_publisher.length() <= 0)
@@ -3497,19 +3520,22 @@ LOGICDEVICE_API int  ActionAndRespWithConnDefalt(ccos_mqtt_connection* hConnecti
 		{
 			if (GetTickCount() - dwTick < dwWaitTime)
 			{
-				FDEBUG("ActionAndRespWithConnDefalt Packet Content {$} content {$}", PacketAnalizer::GetPacketKey(rsp), rsp->encode());
+				// 移除 encode() 调用避免内存问题
+				FDEBUG("ActionAndRespWithConnDefalt Packet Content {$}", PacketAnalizer::GetPacketKey(rsp));
 				resObj = *rsp;
 				return true;
 			}
 			else
 			{
-				FWARN("ActionAndRespWithConnDefalt Packet Content {$} Timeout content {$}", PacketAnalizer::GetPacketKey(rsp), rsp->encode());
+				// 移除 encode() 调用避免内存问题
+				FWARN("ActionAndRespWithConnDefalt Packet Content {$} Timeout", PacketAnalizer::GetPacketKey(rsp));
 				return false;
 			}
 
 			// std::cout << "  : " << PacketAnalizer::GetPacketKey(rsp) << " content " << rsp->encode() << endl;
 		}
-		FDEBUG("ActionAndRespWithConnDefalt what ?  {$} content {$}", PacketAnalizer::GetPacketKey(rsp), rsp->encode());
+		// 移除 encode() 调用避免内存问题
+		FDEBUG("ActionAndRespWithConnDefalt what ?  {$}", PacketAnalizer::GetPacketKey(rsp));
 		// std::cout << "ActionAndRespWithConnDefalt  what ?  " << PacketAnalizer::GetPacketKey(rsp) << endl;
 		return false;
 	};
@@ -3517,7 +3543,8 @@ LOGICDEVICE_API int  ActionAndRespWithConnDefalt(ccos_mqtt_connection* hConnecti
 	CcosLock* pLock = std::get<CONN_SEND_LOCK_ID>(*hConnection);
 	pLock->Thread_Lock();
 
-	FDEBUG("{$} ActionAndRespWithConnDefalt {$} to Topic {$} body {$} ", std::get<CLINET_ID_ID>(*hConnection), pAction, pszTopic, pContext->encode());
+	// 移除 encode() 调用避免内存问题
+	FDEBUG("{$} ActionAndRespWithConnDefalt {$} to Topic {$}", std::get<CLINET_ID_ID>(*hConnection), pAction, pszTopic);
 
 
 	ccos_mqtt_msg_filter* pfilter = (ccos_mqtt_msg_filter*)std::get<MSG_HOOK_ID>(*hConnection);
@@ -3535,7 +3562,8 @@ LOGICDEVICE_API int  ActionAndRespWithConnDefalt(ccos_mqtt_connection* hConnecti
 	ResDataObject* pPacket = new ResDataObject();
 	mqtt_msg_list* pList = std::get<MSG_LIST_ID>(*hConnection);
 	pPacket->add(pszTopic, pLoad);
-	FDEBUG(" {$} Try push packet to Send list: {$}", client_id, pPacket->encode());
+	// 移除 encode() 调用避免内存问题
+	FDEBUG(" {$} Try push packet to Send list", client_id);
 	pList->push_back(pPacket);
 	sem_post(std::get<SEMAPHORE_HANDLE_ID>(*hConnection));
 	/*

+ 4 - 6
LogicDevice/CMakeLists.txt

@@ -36,10 +36,8 @@ include_directories(
 )
 message(STATUS "包含交付头文件目录: ${DELIVER_INCLUDE_DIR}")
 
-# 配置源文件
+# 配置源文件(移除PacketAnalizer重复源文件,保留Base64和common_api)
 set(SRC_FILES
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
 	${DELIVER_INCLUDE_DIR}/Base64.cpp
 	${DELIVER_INCLUDE_DIR}/Base64.h
 	${DELIVER_INCLUDE_DIR}/common_api.cpp
@@ -60,10 +58,10 @@ set_target_properties(LogicDevice PROPERTIES
     OUTPUT_NAME "LogicDevice"
 )
 
-# 链接依赖库
+# 链接依赖库(添加CommonPacket)
 if(UNIX AND NOT APPLE)
-    target_link_libraries(LogicDevice PRIVATE Crc64 CcosLock LocalConfig)
-    message(STATUS "已链接: ResDataObject ")
+    target_link_libraries(LogicDevice PRIVATE Crc64 CcosLock LocalConfig CommonPacket)
+    message(STATUS "已链接: Crc64 CcosLock LocalConfig CommonPacket")
 endif()
 
 # 确保交付目录结构存在

+ 4 - 6
LogicDriver/CMakeLists.txt

@@ -43,12 +43,10 @@ include_directories(
     ${DELIVER_INCLUDE_DIR}
 )
 
-# 配置源文件
+# 配置源文件(移除PacketAnalizer重复源文件)
 set(SRC_FILES
     LogicDriver.h
     LogicDriver.cpp
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
 )
 
 # 创建库目标
@@ -61,10 +59,10 @@ set_target_properties(LogicDriver PROPERTIES
     OUTPUT_NAME "LogicDriver"
 )
 
-# 链接依赖库
+# 链接依赖库(添加CommonPacket)
 if(UNIX AND NOT APPLE)
-    target_link_libraries(LogicDriver PRIVATE DPC LogicDevice)
-    message(STATUS "已链接: DPC LogicDevice")
+    target_link_libraries(LogicDriver PRIVATE DPC LogicDevice CommonPacket)
+    message(STATUS "已链接: DPC LogicDevice CommonPacket")
 endif()
 
 # 确保交付目录结构存在

+ 8 - 9
OemLayer/ContainerDPC/CMakeLists.txt

@@ -43,7 +43,7 @@ include_directories(
     ${DELIVER_INCLUDE_DIR}
 )
 
-# 配置源文件
+# 配置源文件(移除CommonPacket重复源文件)
 set(SRC_FILES
     ContainerDevice.h
     ContainerDevice.cpp
@@ -64,11 +64,6 @@ set(SRC_FILES
     VirtualDevice.cpp
     LogLocalHelper.cpp
     LogLocalHelper.h
-	${DELIVER_INCLUDE_DIR}/CCOS.Dev.IODevice.hpp
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
-	${DELIVER_INCLUDE_DIR}/common_api.h
-	${DELIVER_INCLUDE_DIR}/Base64.cpp
 )
 
 # 创建库目标
@@ -81,10 +76,14 @@ set_target_properties(ContainerDPC PROPERTIES
     OUTPUT_NAME "ContainerDPC"
 )
 
-# 链接依赖库
+# 链接依赖库(添加CommonPacket)
 if(UNIX AND NOT APPLE)
-    target_link_libraries(ContainerDPC PRIVATE common_api LogicDevice)
-    message(STATUS "已链接: LogicDevice")
+    target_link_libraries(ContainerDPC PRIVATE
+        common_api
+        LogicDevice
+        CommonPacket
+    )
+    message(STATUS "已链接: common_api LogicDevice CommonPacket")
 endif()
 
 # 确保交付目录结构存在

+ 12 - 8
OemLayer/NewModelDPC/CMakeLists.txt

@@ -43,7 +43,7 @@ include_directories(
     ${DELIVER_INCLUDE_DIR}
 )
 
-# 配置源文件
+# 配置源文件(移除CommonPacket重复源文件)
 set(SRC_FILES
     NewModelDPC.h
     NewModelDPC.cpp
@@ -53,10 +53,6 @@ set(SRC_FILES
     LogLocalHelper.h
    # ImagePool.h
    # ImagePool.cpp
-	${DELIVER_INCLUDE_DIR}/CCOS.Dev.IODevice.hpp
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
-	${DELIVER_INCLUDE_DIR}/common_api.h
 )
 
 # 创建库目标
@@ -69,10 +65,18 @@ set_target_properties(NewModelDPC PROPERTIES
     OUTPUT_NAME "NewModelDPC"
 )
 
-# 链接依赖库
+# 链接依赖库(添加CommonPacket)
 if(UNIX AND NOT APPLE)
-    target_link_libraries(NewModelDPC PRIVATE common_api ContainerDPC CCOS.Dev.IODevice LogicClient LogicDevice LogicDriver)
-    message(STATUS "已链接: LogicDevice")
+    target_link_libraries(NewModelDPC PRIVATE
+        common_api
+        ContainerDPC
+        CCOS.Dev.IODevice
+        LogicClient
+        LogicDevice
+        LogicDriver
+        CommonPacket
+    )
+    message(STATUS "已链接: common_api ContainerDPC CCOS.Dev.IODevice LogicClient LogicDevice LogicDriver CommonPacket")
 endif()
 
 # 确保交付目录结构存在

+ 10 - 7
OemLayer/OemBusUnit/CMakeLists.txt

@@ -43,7 +43,7 @@ include_directories(
     ${DELIVER_INCLUDE_DIR}
 )
 
-# 配置源文件
+# 配置源文件(移除CommonPacket重复源文件)
 set(SRC_FILES
     BusUnitClient.h
     BusUnitClient.cpp
@@ -57,9 +57,6 @@ set(SRC_FILES
     OemBusUnitDevice.cpp
     LogLocalHelper.cpp
     LogLocalHelper.h
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.h
-	${DELIVER_INCLUDE_DIR}/PacketAnalizer.cpp
-	${DELIVER_INCLUDE_DIR}/common_api.h
 )
 
 # 创建库目标
@@ -72,10 +69,16 @@ set_target_properties(OemBusUnit PROPERTIES
     OUTPUT_NAME "OemBusUnit"
 )
 
-# 链接依赖库
+# 链接依赖库(添加CommonPacket)
 if(UNIX AND NOT APPLE)
-    target_link_libraries(OemBusUnit PRIVATE common_api LogicDevice LogicClient LogicDriver)
-    message(STATUS "已链接: LogicDevice LogicClient LogicDriver")
+    target_link_libraries(OemBusUnit PRIVATE
+        common_api
+        LogicDevice
+        LogicClient
+        LogicDriver
+        CommonPacket
+    )
+    message(STATUS "已链接: common_api LogicDevice LogicClient LogicDriver CommonPacket")
 endif()
 
 # 确保交付目录结构存在

+ 30 - 28
ResDataObject/ResDataObject.cpp

@@ -32,14 +32,14 @@ using namespace boost::property_tree;
 std::string wc2mb( const wchar_t* wcstr)
 {
 	std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
-	std::string strVal = conv.to_bytes(wcstr);  // 将宽字符字符串转换为UTF-8编码的多字节字符串
+	std::string strVal = conv.to_bytes(wcstr);  // 灏嗗�瀛楃�瀛楃�涓茶浆鎹�负UTF-8缂栫爜鐨勫�瀛楄妭瀛楃�涓�
 	return strVal;
 }
 
 std::wstring mb2wc(const char* mbstr)
 {
 	std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
-	std::wstring strVal = conv.from_bytes(mbstr);  // 将多字节字符串转换为宽字符字符串
+	std::wstring strVal = conv.from_bytes(mbstr);  // 灏嗗�瀛楄妭瀛楃�涓茶浆鎹�负瀹藉瓧绗﹀瓧绗︿覆
 	return strVal;
 }
 //
@@ -228,19 +228,19 @@ bool ParsePtToDataObject(ResDataObject &obj,ptree &pt)
 
 bool ParseDataObjectToPt(ptree& pt, ResDataObject& obj) {
 	auto recursive_parse = [&](auto& self, ptree& current_pt, ResDataObject& current_obj, int depth) -> bool {
-		// 增强的空对象检查
+		// 澧炲己鐨勭┖瀵硅薄妫€鏌�
 		if (!current_obj.IsObject() || current_obj.size() == 0) {
 			return true;
 		}
 
-		if (depth > 100) { // 降低深度限制到更安全的100层
+		if (depth > 100) { // 闄嶄綆娣卞害闄愬埗鍒版洿瀹夊叏鐨�100灞�
 			std::cerr << "Recursion depth limit exceeded (100)" << std::endl;
 			return false;
 		}
 
 		const size_t objSize = current_obj.size();
 		for (size_t i = 0; i < objSize; ++i) {
-			// 双重索引验证
+			// 鍙岄噸绱㈠紩楠岃瘉
 			if (i >= objSize || i >= current_obj.size()) {
 				std::cerr << "Index " << i << " out of range (size: "
 					<< current_obj.size() << ")" << std::endl;
@@ -253,13 +253,13 @@ bool ParseDataObjectToPt(ptree& pt, ResDataObject& obj) {
 					std::cerr << "Depth " << depth << ": Invalid key at index " << i
 						<< " (size: " << current_obj.size() << ")" << std::endl;
 
-					// 跳过无效键而不是中止整个解析
+					// 璺宠繃鏃犳晥閿�€屼笉鏄�腑姝㈡暣涓�В鏋�
 					continue;
 				}
 
 				ResDataObject& child = current_obj[i];
 
-				// 更健壮的类型检查
+				// 鏇村仴澹�殑绫诲瀷妫€鏌�
 				if (child.IsObject() && child.size() > 0) {
 					ptree subpt;
 					if (!self(self, subpt, child, depth + 1)) {
@@ -271,7 +271,7 @@ bool ParseDataObjectToPt(ptree& pt, ResDataObject& obj) {
 				}
 				else {
 					try {
-						// 安全的类型转换
+						// 瀹夊叏鐨勭被鍨嬭浆鎹�
 						const char* value = static_cast<const char*>(child);
 						current_pt.put(key, value ? value : "");
 					}
@@ -298,7 +298,7 @@ bool ParseDataObjectToPt(ptree& pt, ResDataObject& obj) {
 		return true;
 		};
 
-	// 初始调用添加保护
+	// 鍒濆�璋冪敤娣诲姞淇濇姢
 	try {
 		return recursive_parse(recursive_parse, pt, obj, 0);
 	}
@@ -406,7 +406,9 @@ const char *ResDataObject::encode()
 	{
 		std::stringstream strm;
 		json_parser::write_json(strm, pt, false);
-		(*m_encode) = strm.str();
+		// 浣跨敤涓存椂鍙橀噺纭�繚瀛楃�涓茶�姝g‘澶嶅埗锛岄伩鍏嶄笌stringstream鍐呴儴缂撳啿鍖轰骇鐢熸剰澶栫殑鍐呭瓨鍏变韩
+		std::string temp_str = strm.str();
+		(*m_encode) = std::move(temp_str);
 		return m_encode->c_str();
 	}
 
@@ -536,7 +538,7 @@ bool ResDataObject::loadFile( const char *pfileName )
 	namespace fs = std::filesystem;
 	const fs::path filePath(pfileName);
 
-	// 验证文件存在且可读
+	// 楠岃瘉鏂囦欢瀛樺湪涓斿彲璇�
 	if (!fs::exists(filePath)) {
 		throw ResDataObjectExption(("File does not exist: " + filePath.string()).c_str());
 	}
@@ -572,31 +574,31 @@ bool ResDataObject::loadFile( const char *pfileName )
 
 		if (foundxml != npos && ((foundxml + 4) == filenameLow.size()))
 		{
-			// XML 文件处理 - 修正了标志问题
+			// XML 鏂囦欢澶勭悊 - 淇��浜嗘爣蹇楅棶棰�
 			const int flags =
 				boost::property_tree::xml_parser::no_comments |
 				boost::property_tree::xml_parser::trim_whitespace;
 
-			// 使用文件流代替直接路径
+			// 浣跨敤鏂囦欢娴佷唬鏇跨洿鎺ヨ矾寰�
 			std::ifstream ifs(fileName, std::ios::binary);
 			if (!ifs) {
 				throwError("Cannot open file: " + fileName);
 			}
 
-			// 读取文件内容
+			// 璇诲彇鏂囦欢鍐呭�
 			std::vector<char> buffer;
-			buffer.reserve(fileSize + 1); // 预分配空间
+			buffer.reserve(fileSize + 1); // 棰勫垎閰嶇┖闂�
 			buffer.assign(std::istreambuf_iterator<char>(ifs),
 				std::istreambuf_iterator<char>());
 			buffer.push_back('\0');
 
-			// 使用字符串流解析
+			// 浣跨敤瀛楃�涓叉祦瑙f瀽
 			std::istringstream iss(buffer.data());
 			boost::property_tree::read_xml(iss, *ptPtr, flags);
 		}
 		else if(foundjson != npos && ((foundjson+strlen(".json")) == filenameLow.size()))
 		{
-			// JSON 文件处理
+			// JSON 鏂囦欢澶勭悊
 			std::ifstream ifs(fileName, std::ios::binary);
 			if (!ifs) {
 				throwError("Cannot open file: " + fileName);
@@ -623,7 +625,7 @@ bool ResDataObject::loadFile( const char *pfileName )
 		}
 		else if(foundini != npos && ((foundini+strlen(".ini")) == filenameLow.size()))
 		{
-			// INI 文件处理
+			// INI 鏂囦欢澶勭悊
 			std::ifstream ifs(fileName, std::ios::binary);
 			if (!ifs) {
 				throwError("Cannot open file: " + fileName);
@@ -758,11 +760,11 @@ void ResDataObject::MakeKeyLower()
 ResDataObject& ResDataObject::operator = (const char* pVal)
 {
 	clear();
-	if (!pVal || reinterpret_cast<uintptr_t>(pVal) < 0x1000) {  // 0x1000是常见的用户态有效内存起始阈值
-		*m_value = "";  // 用空字符串替代无效指针
+	if (!pVal || reinterpret_cast<uintptr_t>(pVal) < 0x1000) {  // 0x1000鏄�父瑙佺殑鐢ㄦ埛鎬佹湁鏁堝唴瀛樿捣濮嬮槇鍊�
+		*m_value = "";  // 鐢ㄧ┖瀛楃�涓叉浛浠f棤鏁堟寚閽�
 	}
 	else {
-		*m_value = pVal;  // 仅在指针有效时赋值
+		*m_value = pVal;  // 浠呭湪鎸囬拡鏈夋晥鏃惰祴鍊�
 	}
 	return (*this);
 };
@@ -808,7 +810,7 @@ ResDataObject &ResDataObject::operator [](const char *pKey)
 			return *pair.second;
 		}
 	}
-	// 添加新元素而不是返回静态对象
+	// 娣诲姞鏂板厓绱犺€屼笉鏄�繑鍥為潤鎬佸�璞�
 	m_vec->emplace_back();
 	auto& newPair = m_vec->back();
 	*newPair.first = keyname;
@@ -1085,7 +1087,7 @@ ResDataObject::operator const char*()
 {
 	if (!m_value) {
 		std::cerr << "[ResDataObject] operator const char*: m_value is null" << std::endl;
-		return "";  // 返回空字符串避免崩溃
+		return "";  // 杩斿洖绌哄瓧绗︿覆閬垮厤宕╂簝
 	}
 	return (*m_value).c_str();
 };
@@ -1252,7 +1254,7 @@ ResDataObject& ResDataObject::operator=(const ResDataObject& tValue) {
 		return *this;
 	}
 
-	// 安全地处理字符串赋值
+	// 瀹夊叏鍦板�鐞嗗瓧绗︿覆璧嬪€�
 	if (m_encode) {
 		*m_encode = tValue.m_encode ? *tValue.m_encode : "";
 	}
@@ -1267,7 +1269,7 @@ ResDataObject& ResDataObject::operator=(const ResDataObject& tValue) {
 		m_value = std::make_unique<std::string>(*tValue.m_value);
 	}
 
-	// 处理向量数据
+	// 澶勭悊鍚戦噺鏁版嵁
 	if (!tValue.m_vec) {
 		m_vec.reset();
 	}
@@ -1417,7 +1419,7 @@ ResDataObject& ResDataObject::operator = (const double tValue)
 	std::stringstream strm;
 	//strm.precision(numeric_limits<double>::digits10);
 
-	//新方案(丢精度)
+	//鏂版柟妗�(涓㈢簿搴�)
 	char szStr[64];
 	snprintf(szStr, sizeof(szStr), "%.17g", tValue); 
 
@@ -1427,7 +1429,7 @@ ResDataObject& ResDataObject::operator = (const double tValue)
 
 
 
-	//旧方案(保持精度)
+	//鏃ф柟妗�(淇濇寔绮惧害)
 	//assert(sizeof(double) == sizeof(unsigned long long));
 
 	//pF = (unsigned long long*)&tValue;
@@ -1536,7 +1538,7 @@ bool ResDataObject::add(const char* pKey,const char* pValue)
 {
 	ResDataObject obj;
 	if (!pValue || reinterpret_cast<uintptr_t>(pValue) < 0x1000) {
-		obj = "";  // 无效值用空字符串替代
+		obj = "";  // 鏃犳晥鍊肩敤绌哄瓧绗︿覆鏇夸唬
 	}
 	else {
 		obj = pValue;