文件8: CMakeLists.txt - 跨平台构建配置

#=============================================================================
# @file CMakeLists.txt
# @brief IoT平台CMake构建配置文件
# @author IoT Platform Team
# @version 1.0
# @date 2024
# 
# 支持Linux/Windows/macOS多平台构建
# 使用现代CMake实践,支持多种编译选项
#=============================================================================
​
# CMake最低版本要求(使用现代特性)
cmake_minimum_required(VERSION 3.16)
​
# 项目基本信息
project(iot_platform
    VERSION 1.0.0          # 项目版本号
    DESCRIPTION "IoT物联网平台服务器"
    LANGUAGES CXX          # 使用C++语言
)
​
# 设置C++标准为C++17(支持现代特性)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)  # 禁用编译器扩展,确保可移植性
​
# 项目配置选项
option(BUILD_SHARED_LIBS "构建共享库" OFF)               # 默认构建静态库
option(WITH_SSL "启用SSL/TLS支持" ON)                    # 默认启用SSL
option(WITH_TESTS "构建测试" OFF)                        # 默认不构建测试
option(WITH_BENCHMARKS "构建性能基准测试" OFF)           # 默认不构建基准测试
option(WITH_DOCS "构建文档" OFF)                         # 默认不构建文档
option(WITH_EXAMPLES "构建示例" OFF)                     # 默认不构建示例
option(ENABLE_LTO "启用链接时优化" OFF)                  # 默认不启用LTO
option(ENABLE_ASAN "启用地址消毒器" OFF)                 # 默认不启用ASAN
option(ENABLE_UBSAN "启用未定义行为消毒器" OFF)          # 默认不启用UBSAN
​
# 平台检测和设置
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
    set(LINUX TRUE)
    message(STATUS "平台: Linux")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
    set(WINDOWS TRUE)
    message(STATUS "平台: Windows")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
    set(MACOS TRUE)
    message(STATUS "平台: macOS")
else()
    message(WARNING "未知平台: ${CMAKE_SYSTEM_NAME}")
endif()
​
# 编译器检测和设置
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    set(GCC TRUE)
    message(STATUS "编译器: GNU GCC ${CMAKE_CXX_COMPILER_VERSION}")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
    set(CLANG TRUE)
    message(STATUS "编译器: Clang ${CMAKE_CXX_COMPILER_VERSION}")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
    set(MSVC TRUE)
    message(STATUS "编译器: Microsoft Visual C++")
else()
    message(WARNING "未知编译器: ${CMAKE_CXX_COMPILER_ID}")
endif()
​
# 输出构建类型
message(STATUS "构建类型: ${CMAKE_BUILD_TYPE}")
message(STATUS "安装前缀: ${CMAKE_INSTALL_PREFIX}")
​
# 根据平台设置默认安装路径
if(UNIX AND NOT APPLE)
    # Linux系统
    set(CMAKE_INSTALL_BINDIR "bin")
    set(CMAKE_INSTALL_LIBDIR "lib")
    set(CMAKE_INSTALL_INCLUDEDIR "include")
    set(CMAKE_INSTALL_DATADIR "share/iot_platform")
elseif(APPLE)
    # macOS系统
    set(CMAKE_INSTALL_BINDIR "bin")
    set(CMAKE_INSTALL_LIBDIR "lib")
    set(CMAKE_INSTALL_INCLUDEDIR "include")
    set(CMAKE_INSTALL_DATADIR "share/iot_platform")
elseif(WINDOWS)
    # Windows系统
    set(CMAKE_INSTALL_BINDIR "bin")
    set(CMAKE_INSTALL_LIBDIR "lib")
    set(CMAKE_INSTALL_INCLUDEDIR "include")
    set(CMAKE_INSTALL_DATADIR "share")
endif()
​
# 编译器优化选项
if(CMAKE_BUILD_TYPE STREQUAL "Release")
    # Release模式优化
    add_compile_options(-O3 -DNDEBUG)
    message(STATUS "优化级别: O3 (Release)")
    
    if(ENABLE_LTO)
        add_compile_options(-flto)
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto")
        message(STATUS "链接时优化: 启用")
    endif()
    
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
    # Debug模式调试信息
    add_compile_options(-O0 -g3 -DDEBUG)
    message(STATUS "优化级别: O0 (Debug)")
    
    # 调试符号
    if(GCC OR CLANG)
        add_compile_options(-ggdb)
    endif()
    
elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
    # 带调试信息的Release
    add_compile_options(-O2 -g -DNDEBUG)
    message(STATUS "优化级别: O2 with debug info")
    
elseif(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
    # 最小尺寸优化
    add_compile_options(-Os -DNDEBUG)
    message(STATUS "优化级别: Os (最小尺寸)")
endif()
​
# 编译器特定选项
if(GCC)
    # GCC编译器选项
    add_compile_options(
        -Wall                      # 启用所有警告
        -Wextra                    # 启用额外警告
        -Wpedantic                 # 启用严格ISO C++警告
        -Wshadow                   # 警告变量遮蔽
        -Wformat=2                 # 格式化字符串检查
        -Wconversion               # 类型转换警告
        -Wsign-conversion          # 有符号/无符号转换警告
        -Wnull-dereference         # 空指针解引用警告
        -Wduplicated-cond          # 重复条件警告
        -Wduplicated-branches      # 重复分支警告
        -Wlogical-op               # 逻辑操作警告
        -Wuseless-cast             # 无用类型转换警告
        -Werror                    # 将警告视为错误
    )
    
    # 架构优化
    if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
        add_compile_options(-march=native)  # 针对本地CPU优化
    endif()
    
elseif(CLANG)
    # Clang编译器选项
    add_compile_options(
        -Wall                      # 启用所有警告
        -Wextra                    # 启用额外警告
        -Wpedantic                 # 启用严格ISO C++警告
        -Wshadow                   # 警告变量遮蔽
        -Wformat=2                 # 格式化字符串检查
        -Wconversion               # 类型转换警告
        -Wnull-dereference         # 空指针解引用警告
        -Werror                    # 将警告视为错误
    )
    
elseif(MSVC)
    # MSVC编译器选项
    add_compile_options(
        /W4        # 警告等级4(最高)
        /WX        # 将警告视为错误
        /EHsc      # C++异常处理
        /utf-8     # 使用UTF-8编码
    )
endif()
​
# 消毒器选项(用于调试)
if(ENABLE_ASAN)
    if(GCC OR CLANG)
        add_compile_options(-fsanitize=address -fno-omit-frame-pointer)
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
        message(STATUS "地址消毒器: 启用")
    else()
        message(WARNING "地址消毒器只支持GCC/Clang编译器")
    endif()
endif()
​
if(ENABLE_UBSAN)
    if(GCC OR CLANG)
        add_compile_options(-fsanitize=undefined)
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined")
        message(STATUS "未定义行为消毒器: 启用")
    else()
        message(WARNING "未定义行为消毒器只支持GCC/Clang编译器")
    endif()
endif()
​
# 查找依赖库
message(STATUS "查找依赖库...")
​
# OpenSSL库(用于WebSocket TLS)
if(WITH_SSL)
    find_package(OpenSSL REQUIRED)
    if(OPENSSL_FOUND)
        message(STATUS "OpenSSL 版本: ${OPENSSL_VERSION}")
        include_directories(${OPENSSL_INCLUDE_DIR})
        set(SSL_LIBRARIES ${OPENSSL_LIBRARIES})
    else()
        message(FATAL_ERROR "找不到OpenSSL库,请安装OpenSSL开发包")
    endif()
else()
    message(STATUS "SSL支持: 禁用")
    set(SSL_LIBRARIES "")
endif()
​
# 线程库(必需)
find_package(Threads REQUIRED)
if(CMAKE_USE_PTHREADS_INIT)
    message(STATUS "线程库: pthread")
else()
    message(STATUS "线程库: 系统线程")
endif()
​
# 可选:jsoncpp库(用于配置解析)
# find_package(jsoncpp QUIET)
# if(jsoncpp_FOUND)
#     message(STATUS "jsoncpp: 找到")
#     set(HAVE_JSONCPP 1)
# else()
#     message(STATUS "jsoncpp: 未找到,使用内置简单JSON解析")
#     set(HAVE_JSONCPP 0)
# endif()
​
# 可选:libwebsockets库(备用WebSocket实现)
# find_package(LibWebSockets QUIET)
# if(LibWebSockets_FOUND)
#     message(STATUS "libwebsockets: 找到")
#     set(HAVE_LIBWEBSOCKETS 1)
# else()
#     message(STATUS "libwebsockets: 未找到,使用内置WebSocket实现")
#     set(HAVE_LIBWEBSOCKETS 0)
# endif()
​
# 包含目录设置
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}    # 当前源码目录
    ${CMAKE_CURRENT_BINARY_DIR}    # 当前构建目录
)
​
# 添加子目录(如果有)
# add_subdirectory(lib)     # 库目录
# add_subdirectory(src)     # 源码目录
# add_subdirectory(test)    # 测试目录
​
# 源码文件列表
set(IOT_SERVER_SOURCES
    # 核心源文件
    ${CMAKE_CURRENT_SOURCE_DIR}/iot_server.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/websocket_handler.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/device_manager.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/message_router.cpp
    
    # 头文件
    ${CMAKE_CURRENT_SOURCE_DIR}/config.h
)
​
# 可执行目标
add_executable(iot_server ${IOT_SERVER_SOURCES})
​
# 设置可执行文件属性
set_target_properties(iot_server PROPERTIES
    OUTPUT_NAME "iot_server"                    # 输出文件名
    VERSION ${PROJECT_VERSION}                  # 版本号
    SOVERSION ${PROJECT_VERSION_MAJOR}          # 主版本号
    # POSITION_INDEPENDENT_CODE ON              # 启用PIC(如果需要)
)
​
# 链接库
target_link_libraries(iot_server
    ${SSL_LIBRARIES}        # OpenSSL库
    Threads::Threads        # 线程库
    # ${JSONCPP_LIBRARIES}  # jsoncpp库
    # ${LIBWEBSOCKETS_LIBRARIES}  # libwebsockets库
)
​
# 特定平台链接选项
if(LINUX)
    # Linux特定库
    target_link_libraries(iot_server
        rt          # 实时扩展库
        dl          # 动态加载库
        pthread     # pthread库
    )
    
    # 设置rpath
    set_target_properties(iot_server PROPERTIES
        INSTALL_RPATH "$ORIGIN/../lib"
        BUILD_WITH_INSTALL_RPATH TRUE
    )
    
elseif(WINDOWS)
    # Windows特定库
    target_link_libraries(iot_server
        ws2_32      # Winsock2库
        crypt32     # 加密API库
    )
    
elseif(MACOS)
    # macOS特定设置
    target_link_libraries(iot_server
        "-framework CoreFoundation"
        "-framework Security"
    )
endif()
​
# 安装目标
install(TARGETS iot_server
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}     # 可执行文件
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}     # 库文件(如果构建共享库)
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}     # 静态库
)
​
# 安装配置文件
install(FILES
    ${CMAKE_CURRENT_SOURCE_DIR}/config/iot_server.conf
    DESTINATION ${CMAKE_INSTALL_DATADIR}/config
    PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
)
​
# 安装前端文件
install(DIRECTORY
    ${CMAKE_CURRENT_SOURCE_DIR}/frontend/
    DESTINATION ${CMAKE_INSTALL_DATADIR}/web
    PATTERN "*.html"
    PATTERN "*.js"
    PATTERN "*.css"
    PATTERN "*.ico"
    PATTERN ".gitkeep" EXCLUDE
)
​
# 安装文档(如果构建)
if(WITH_DOCS)
    install(FILES
        ${CMAKE_CURRENT_BINARY_DIR}/docs/html/*
        DESTINATION ${CMAKE_INSTALL_DATADIR}/docs
    )
endif()
​
# 安装启动脚本
if(UNIX AND NOT APPLE)
    # Linux启动脚本
    configure_file(
        ${CMAKE_CURRENT_SOURCE_DIR}/scripts/iot_server.service.in
        ${CMAKE_CURRENT_BINARY_DIR}/iot_server.service
        @ONLY
    )
    
    install(FILES
        ${CMAKE_CURRENT_BINARY_DIR}/iot_server.service
        DESTINATION /lib/systemd/system
        PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
    )
    
    # systemd配置文件
    install(FILES
        ${CMAKE_CURRENT_SOURCE_DIR}/scripts/iot_server.sysconfig
        DESTINATION /etc/sysconfig
        RENAME iot_server
        PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
    )
    
elseif(WINDOWS)
    # Windows服务安装脚本
    install(FILES
        ${CMAKE_CURRENT_SOURCE_DIR}/scripts/install_windows_service.bat
        ${CMAKE_CURRENT_SOURCE_DIR}/scripts/uninstall_windows_service.bat
        DESTINATION ${CMAKE_INSTALL_BINDIR}
    )
endif()
​
# 创建包配置(用于find_package)
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
    ${CMAKE_CURRENT_BINARY_DIR}/iot_platformConfigVersion.cmake
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY SameMajorVersion
)
​
configure_package_config_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/cmake/iot_platformConfig.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/iot_platformConfig.cmake
    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/iot_platform
)
​
install(FILES
    ${CMAKE_CURRENT_BINARY_DIR}/iot_platformConfig.cmake
    ${CMAKE_CURRENT_BINARY_DIR}/iot_platformConfigVersion.cmake
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/iot_platform
)
​
# 导出目标(用于find_package)
install(EXPORT iot_platformTargets
    FILE iot_platformTargets.cmake
    NAMESPACE iot_platform::
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/iot_platform
)
​
# 测试目标(如果启用)
if(WITH_TESTS)
    enable_testing()
    
    # 添加测试子目录
    add_subdirectory(tests)
    
    # 添加单元测试
    add_executable(test_websocket tests/test_websocket.cpp)
    target_link_libraries(test_websocket iot_server)
    add_test(NAME test_websocket COMMAND test_websocket)
    
    add_executable(test_device_manager tests/test_device_manager.cpp)
    target_link_libraries(test_device_manager iot_server)
    add_test(NAME test_device_manager COMMAND test_device_manager)
    
    # 添加集成测试
    add_executable(test_integration tests/test_integration.cpp)
    target_link_libraries(test_integration iot_server)
    add_test(NAME test_integration COMMAND test_integration)
endif()
​
# 性能基准测试(如果启用)
if(WITH_BENCHMARKS)
    # 查找Google Benchmark库
    find_package(benchmark QUIET)
    if(benchmark_FOUND)
        add_executable(benchmark_websocket benchmarks/benchmark_websocket.cpp)
        target_link_libraries(benchmark_websocket iot_server benchmark::benchmark)
        
        add_executable(benchmark_message_router benchmarks/benchmark_message_router.cpp)
        target_link_libraries(benchmark_message_router iot_server benchmark::benchmark)
    else()
        message(WARNING "Google Benchmark库未找到,跳过基准测试")
    endif()
endif()
​
# 文档生成(如果启用)
if(WITH_DOCS)
    # 查找Doxygen
    find_package(Doxygen REQUIRED)
    
    if(DOXYGEN_FOUND)
        # 配置Doxygen
        set(DOXYGEN_PROJECT_NAME "IoT物联网平台")
        set(DOXYGEN_PROJECT_NUMBER "${PROJECT_VERSION}")
        set(DOXYGEN_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/docs")
        set(DOXYGEN_USE_MDFILE_AS_MAINPAGE "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
        
        # 添加文档生成目标
        doxygen_add_docs(docs
            ${IOT_SERVER_SOURCES}
            COMMENT "生成API文档"
        )
    else()
        message(WARNING "Doxygen未找到,跳过文档生成")
    endif()
endif()
​
# 打包目标
include(InstallRequiredSystemLibraries)
​
set(CPACK_PACKAGE_NAME "iot_platform")
set(CPACK_PACKAGE_VENDOR "IoT Platform Team")
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "高性能IoT物联网平台服务器")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
​
# 平台特定打包设置
if(LINUX)
    set(CPACK_GENERATOR "DEB;RPM;TGZ")
    set(CPACK_DEBIAN_PACKAGE_MAINTAINER "IoT Platform Team <iot-platform@example.com>")
    set(CPACK_DEBIAN_PACKAGE_DEPENDS "libssl-dev, libc6")
    set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
    
    set(CPACK_RPM_PACKAGE_RELEASE 1)
    set(CPACK_RPM_PACKAGE_LICENSE "MIT")
    set(CPACK_RPM_PACKAGE_REQUIRES "openssl-devel")
    
elseif(WINDOWS)
    set(CPACK_GENERATOR "NSIS;ZIP")
    set(CPACK_NSIS_MODIFY_PATH ON)
    set(CPACK_NSIS_DISPLAY_NAME "IoT物联网平台")
    set(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\iot_server.exe")
    
elseif(MACOS)
    set(CPACK_GENERATOR "DragNDrop;PackageMaker")
endif()
​
include(CPack)
​
# 自定义目标
# 代码格式化目标
find_program(CLANG_FORMAT "clang-format")
if(CLANG_FORMAT)
    add_custom_target(format
        COMMAND ${CLANG_FORMAT}
        -i
        --style=file
        ${IOT_SERVER_SOURCES}
        COMMENT "格式化源代码"
    )
endif()
​
# 代码分析目标
find_program(CPPCHECK "cppcheck")
if(CPPCHECK)
    add_custom_target(analyze
        COMMAND ${CPPCHECK}
        --enable=all
        --std=c++17
        --verbose
        --error-exitcode=1
        ${CMAKE_CURRENT_SOURCE_DIR}
        COMMENT "静态代码分析"
    )
endif()
​
# 清理构建目标
add_custom_target(clean-all
    COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target clean
    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}
    COMMENT "完全清理构建目录"
)
​
# 显示构建摘要
message(STATUS "")
message(STATUS "===========================================")
message(STATUS "IoT物联网平台构建配置完成")
message(STATUS "===========================================")
message(STATUS "项目版本:      ${PROJECT_VERSION}")
message(STATUS "构建类型:      ${CMAKE_BUILD_TYPE}")
message(STATUS "安装前缀:      ${CMAKE_INSTALL_PREFIX}")
message(STATUS "SSL支持:       ${WITH_SSL}")
message(STATUS "编译器:        ${CMAKE_CXX_COMPILER_ID}")
message(STATUS "C++标准:       ${CMAKE_CXX_STANDARD}")
message(STATUS "平台:          ${CMAKE_SYSTEM_NAME}")
message(STATUS "")
message(STATUS "可用目标:")
message(STATUS "  iot_server   - 构建主服务器")
if(TARGET docs)
    message(STATUS "  docs         - 生成文档")
endif()
if(TARGET tests)
    message(STATUS "  tests        - 构建测试")
endif()
if(TARGET format)
    message(STATUS "  format       - 格式化代码")
endif()
if(TARGET analyze)
    message(STATUS "  analyze      - 代码分析")
endif()
message(STATUS "")
message(STATUS "构建命令:")
message(STATUS "  mkdir build && cd build")
message(STATUS "  cmake .. -DCMAKE_BUILD_TYPE=Release")
message(STATUS "  make -j$(nproc)")
message(STATUS "")
message(STATUS "安装命令:")
message(STATUS "  sudo make install")
message(STATUS "===========================================")

文件9: README.md - 项目说明文档

<!--
 * @file README.md
 * @brief IoT物联网平台项目说明文档
 * @author IoT Platform Team
 * @version 1.0
 * @date 2024
 *
 * 项目概述、构建指南和部署说明
-->
​
# IoT物联网平台
​
## 项目概述
​
### 简介
IoT物联网平台是一个高性能、可扩展的物联网设备管理和数据监控平台。平台支持大规模设备连接、实时数据采集、设备控制、消息路由和Web可视化。
​
### 主要特性
- 🚀 **高性能**: 基于反应器模式,支持10K+并发连接
- 🔧 **模块化设计**: 使用多种设计模式,易于扩展和维护
- 📊 **实时监控**: WebSocket实时数据推送,图表可视化
- 🔒 **安全可靠**: SSL/TLS加密,认证授权机制
- 🌐 **跨平台**: 支持Linux、Windows、macOS
- 📱 **响应式界面**: 适配桌面和移动设备
- 🔌 **多协议支持**: WebSocket为主,预留其他协议扩展
​
### 技术栈
- **后端**: C++17, CMake, OpenSSL, pthread
- **前端**: HTML5, CSS3, JavaScript, Chart.js, Bootstrap 5
- **网络**: WebSocket (RFC 6455), TCP/IP
- **构建**: CMake, Make, GCC/Clang/MSVC
​
## 目录结构
​
iot_platform/
├── backend/                     # C++后端代码
│   ├── iot_server.cpp          # 主服务器
│   ├── websocket_handler.cpp   # WebSocket处理器
│   ├── device_manager.cpp      # 设备管理器
│   ├── message_router.cpp      # 消息路由器
│   └── config.h                # 配置和协议定义
├── frontend/                   # Web前端代码
│   ├── index.html              # 主页面
│   ├── dashboard.js            # 仪表板控制
│   └── device_monitor.js       # 设备监控
├── scripts/                    # 部署脚本
│   ├── iot_server.service.in   # systemd服务模板
│   ├── install_service.sh      # 服务安装脚本
│   └── config_gen.py           # 配置生成脚本
├── config/                     # 配置文件
│   ├── iot_server.conf         # 服务器配置示例
│   └── nginx.conf              # Nginx代理配置
├── tests/                      # 测试代码
│   ├── test_websocket.cpp      # WebSocket测试
│   └── test_integration.cpp    # 集成测试
├── docs/                       # 文档
│   ├── API.md                  # API文档
│   └── deployment_guide.md     # 部署指南
├── CMakeLists.txt              # CMake构建配置
├── README.md                   # 本文档
└── LICENSE                     # 许可证文件

​
## 快速开始
​
### 环境要求
​
#### 系统要求
- **操作系统**: Linux (Ubuntu 20.04+, CentOS 7+), Windows 10+, macOS 10.15+
- **内存**: 至少 512MB RAM
- **磁盘空间**: 至少 100MB 可用空间
​
#### 开发工具
- **C++编译器**: GCC 9+ 或 Clang 10+ 或 MSVC 2019+
- **CMake**: 3.16+
- **OpenSSL**: 1.1.1+
- **Git**: 版本控制
​
#### 前端依赖
- **现代浏览器**: Chrome 90+, Firefox 88+, Edge 90+
- **Node.js**: 14+ (仅用于开发构建)
​
### 安装依赖
​
#### Ubuntu/Debian
```bash
# 更新包管理器
sudo apt update
​
# 安装编译工具
sudo apt install -y build-essential cmake git
​
# 安装OpenSSL开发包
sudo apt install -y libssl-dev
​
# 安装其他可选依赖
sudo apt install -y libjsoncpp-dev doxygen graphviz
CentOS/RHEL
# 安装EPEL仓库
sudo yum install -y epel-release
​
# 安装编译工具
sudo yum install -y gcc-c++ cmake3 make git
​
# 安装OpenSSL开发包
sudo yum install -y openssl-devel
​
# 创建cmake符号链接(如果需要)
sudo ln -s /usr/bin/cmake3 /usr/bin/cmake
macOS
# 安装Homebrew(如果未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
​
# 安装依赖
brew install cmake openssl
Windows
  1. 安装 Visual Studio 2019+(包含C++开发工具)

  2. 安装 CMake

  3. 安装 OpenSSL

  4. 安装 Git for Windows

构建项目

Linux/macOS
# 克隆代码库
git clone https://github.com/your-org/iot_platform.git
cd iot_platform
​
# 创建构建目录
mkdir build
cd build
​
# 配置项目(Debug模式)
cmake .. -DCMAKE_BUILD_TYPE=Debug
​
# 或者配置为Release模式(生产环境)
cmake .. -DCMAKE_BUILD_TYPE=Release
​
# 编译项目
make -j$(nproc)  # Linux使用所有CPU核心
# 或者 make -j4    # 指定4个并行任务
​
# 运行单元测试(如果启用)
make test
​
# 查看构建的可执行文件
ls -lh iot_server
Windows (命令行)
# 使用PowerShell或CMD
git clone https://github.com/your-org/iot_platform.git
cd iot_platform
​
# 创建构建目录
mkdir build
cd build
​
# 配置项目
cmake .. -G "Visual Studio 16 2019" -A x64
​
# 编译项目
cmake --build . --config Release
​
# 或者使用Visual Studio打开生成的sln文件
Windows (Visual Studio GUI)
  1. 打开Visual Studio

  2. 选择"克隆存储库"

  3. 输入仓库URL: https://github.com/your-org/iot_platform.git

  4. 打开CMakeLists.txt文件

  5. Visual Studio会自动配置和构建

配置服务器

生成配置文件
cd build
cp ../config/iot_server.conf.example iot_server.conf
编辑配置文件
# iot_server.conf - IoT服务器配置文件
[server]
# 服务器监听的IP地址
bind_address = 0.0.0.0
​
# WebSocket服务端口
websocket_port = 8080
​
# HTTPS服务端口(如果启用SSL)
https_port = 8443
​
# 最大连接数
max_connections = 10000
​
# 工作线程数
worker_threads = 4
​
[database]
# 数据库类型:memory(内存)或 mysql(MySQL数据库)
type = memory
​
# MySQL连接信息(如果使用MySQL)
mysql_host = localhost
mysql_port = 3306
mysql_user = iot_user
mysql_password = your_password
mysql_database = iot_platform
​
[security]
# 启用SSL/TLS
enable_ssl = false
​
# SSL证书文件路径
ssl_cert_file = /path/to/cert.pem
​
# SSL私钥文件路径
ssl_key_file = /path/to/key.pem
​
# 客户端认证要求
require_client_auth = false
​
[logging]
# 日志级别:debug, info, warning, error
log_level = info
​
# 日志文件路径
log_file = /var/log/iot_server.log
​
# 日志轮转:最大文件大小(MB)
max_log_size = 100
​
# 保留的日志文件数量
max_log_files = 10

运行服务器

开发环境运行
# 进入构建目录
cd build

# 直接运行服务器
./iot_server

# 或者指定配置文件
./iot_server --config ../config/iot_server.conf

# 或者指定端口
./iot_server --port 8888

# 查看帮助
./iot_server --help
命令行参数
# 完整参数列表
./iot_server --help

# 输出:
# 用法: iot_server [选项]
# 选项:
#   -c, --config FILE    从FILE加载配置
#   -p, --port PORT      使用PORT进行WebSocket连接
#   -h, --help           显示此帮助信息
#   -v, --version        显示版本信息
#   -d, --daemon         以守护进程模式运行
#   -l, --log FILE       指定日志文件
#   --pid-file FILE      指定PID文件路径
验证运行状态
# 检查进程
ps aux | grep iot_server

# 检查端口监听
netstat -tlnp | grep 8080

# 查看日志
tail -f /var/log/iot_server.log

访问Web界面

  1. 打开浏览器,访问 http://localhost:8080

  2. 或者访问 http://服务器IP:8080

  3. 如果启用SSL,访问 https://服务器IP:8443

部署指南

生产环境部署

1. 安装到系统目录
cd build
sudo make install

# 默认安装路径:
# 可执行文件: /usr/local/bin/iot_server
# 配置文件: /usr/local/share/iot_platform/config/
# Web文件: /usr/local/share/iot_platform/web/
2. 创建系统用户
# 创建专用系统用户
sudo useradd -r -s /bin/false iot_server

# 创建数据目录
sudo mkdir -p /var/lib/iot_platform
sudo mkdir -p /var/log/iot_platform
sudo mkdir -p /etc/iot_platform

# 设置权限
sudo chown -R iot_server:iot_server /var/lib/iot_platform
sudo chown -R iot_server:iot_server /var/log/iot_platform
sudo chown -R iot_server:iot_server /etc/iot_platform
3. 配置systemd服务(Linux)
# 复制systemd服务文件
sudo cp scripts/iot_server.service /etc/systemd/system/

# 编辑服务配置
sudo nano /etc/systemd/system/iot_server.service

# 重新加载systemd
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start iot_server

# 设置开机启动
sudo systemctl enable iot_server

# 查看服务状态
sudo systemctl status iot_server

# 查看服务日志
sudo journalctl -u iot_server -f
4. 配置Nginx反向代理(推荐)
# /etc/nginx/sites-available/iot_platform
server {
    listen 80;
    server_name iot.example.com;
    
    # 重定向到HTTPS
    return 301 https://$server_name$request_uri;
}
​
server {
    listen 443 ssl http2;
    server_name iot.example.com;
    
    # SSL证书配置
    ssl_certificate /etc/ssl/certs/iot.example.com.crt;
    ssl_certificate_key /etc/ssl/private/iot.example.com.key;
    
    # SSL优化设置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    
    # WebSocket代理
    location /ws {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 超时设置
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }
    
    # 静态文件服务
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    
    # 访问日志
    access_log /var/log/nginx/iot_platform.access.log;
    error_log /var/log/nginx/iot_platform.error.log;
}
5. 配置防火墙
# 允许Web端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080/tcp
​
# 或者使用firewalld(CentOS/RHEL)
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

Docker部署

1. 构建Docker镜像
# Dockerfile
FROM ubuntu:20.04 AS builder
​
# 安装构建依赖
RUN apt-get update && apt-get install -y \
    build-essential \
    cmake \
    libssl-dev \
    && rm -rf /var/lib/apt/lists/*
​
# 复制源代码
COPY . /app
WORKDIR /app
​
# 构建
RUN mkdir build && cd build \
    && cmake .. -DCMAKE_BUILD_TYPE=Release \
    && make -j$(nproc)
​
# 运行阶段
FROM ubuntu:20.04
​
# 安装运行时依赖
RUN apt-get update && apt-get install -y \
    libssl1.1 \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*
​
# 创建非root用户
RUN useradd -r -s /bin/false iot_server
​
# 复制构建产物
COPY --from=builder /app/build/iot_server /usr/local/bin/
COPY --from=builder /app/frontend /usr/local/share/iot_platform/web/
COPY --from=builder /app/config/iot_server.conf.example /etc/iot_platform/iot_server.conf
​
# 创建数据目录
RUN mkdir -p /var/lib/iot_platform \
    && chown -R iot_server:iot_server /var/lib/iot_platform \
    && chown -R iot_server:iot_server /etc/iot_platform
​
# 切换用户
USER iot_server
​
# 暴露端口
EXPOSE 8080
​
# 运行命令
CMD ["/usr/local/bin/iot_server", "--config", "/etc/iot_platform/iot_server.conf"]
2. 使用docker-compose
# docker-compose.yml
version: '3.8'

services:
  iot_server:
    build: .
    container_name: iot_server
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./config:/etc/iot_platform:ro
      - ./data:/var/lib/iot_platform
      - ./logs:/var/log/iot_platform
    environment:
      - TZ=Asia/Shanghai
      - LOG_LEVEL=info
    networks:
      - iot_network

  nginx:
    image: nginx:alpine
    container_name: iot_nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./ssl:/etc/ssl:ro
      - ./logs/nginx:/var/log/nginx
    depends_on:
      - iot_server
    networks:
      - iot_network

networks:
  iot_network:
    driver: bridge
3. 运行Docker容器
# 构建和运行
docker-compose up -d

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down

# 清理所有容器
docker system prune -af

Kubernetes部署

1. 创建Kubernetes部署文件
# kubernetes/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: iot-server
  namespace: iot-platform
spec:
  replicas: 3
  selector:
    matchLabels:
      app: iot-server
  template:
    metadata:
      labels:
        app: iot-server
    spec:
      containers:
      - name: iot-server
        image: iot-platform:latest
        ports:
        - containerPort: 8080
        env:
        - name: LOG_LEVEL
          value: "info"
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        volumeMounts:
        - name: config-volume
          mountPath: /etc/iot_platform
        - name: data-volume
          mountPath: /var/lib/iot_platform
      volumes:
      - name: config-volume
        configMap:
          name: iot-server-config
      - name: data-volume
        emptyDir: {}
2. 创建服务
# kubernetes/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: iot-server
  namespace: iot-platform
spec:
  selector:
    app: iot-server
  ports:
  - port: 8080
    targetPort: 8080
  type: LoadBalancer

配置说明

环境变量配置

# 服务器配置
export IOT_WEBSOCKET_PORT=8080
export IOT_WORKER_THREADS=4
export IOT_MAX_CONNECTIONS=10000

# 数据库配置
export IOT_DB_TYPE=memory
export IOT_DB_HOST=localhost
export IOT_DB_PORT=3306

# 日志配置
export IOT_LOG_LEVEL=info
export IOT_LOG_FILE=/var/log/iot_server.log

# 启动服务器(自动读取环境变量)
./iot_server

配置文件格式

支持多种配置文件格式:

  • INI格式(默认)

  • JSON格式

  • YAML格式(需要yaml-cpp库)

示例JSON配置:

{
    "server": {
        "bind_address": "0.0.0.0",
        "websocket_port": 8080,
        "worker_threads": 4
    },
    "database": {
        "type": "memory"
    },
    "logging": {
        "level": "info",
        "file": "/var/log/iot_server.log"
    }
}

性能调优

系统级调优

# 增加文件描述符限制
echo "iot_server soft nofile 65535" >> /etc/security/limits.conf
echo "iot_server hard nofile 65535" >> /etc/security/limits.conf

# 增加epoll最大连接数
echo "fs.epoll.max_user_watches = 524288" >> /etc/sysctl.conf
sysctl -p

# 优化TCP参数
echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 65535" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
sysctl -p

服务器调优参数

[performance]
# 调整工作线程数(建议为CPU核心数)
worker_threads = 8

# 调整epoll事件大小
epoll_max_events = 1024

# 调整缓冲区大小
read_buffer_size = 8192
write_buffer_size = 8192

# 连接超时设置
connection_timeout = 300

# 心跳间隔
heartbeat_interval = 30

# 启用连接复用
enable_keepalive = true
keepalive_time = 600
keepalive_probes = 3
keepalive_interval = 60

内存优化

[memory]
# 对象池大小
connection_pool_size = 1000
message_pool_size = 5000

# 缓存大小
device_cache_size = 10000
message_cache_size = 1000

# 内存分配器(Linux)
use_jemalloc = true

监控和日志

日志配置

[logging]
# 日志级别
level = info

# 日志输出
console_output = true
file_output = true
syslog_output = false

# 日志文件
log_file = /var/log/iot_server.log
max_file_size = 104857600  # 100MB
max_files = 10

# 访问日志
access_log = /var/log/iot_server_access.log
log_format = "%t %a %r %s %b %D"

# 慢请求日志
slow_request_threshold = 5000  # 5秒

监控指标

平台提供以下监控指标:

  • 连接数统计

  • 消息吞吐量

  • 内存使用情况

  • CPU使用率

  • 请求延迟分布

  • 错误率统计

Prometheus监控

# prometheus配置
scrape_configs:
  - job_name: 'iot_platform'
    static_configs:
      - targets: ['iot-server:9090']
    metrics_path: '/metrics'

健康检查

# HTTP健康检查端点
curl http://localhost:8080/health

# 返回:
# {
#   "status": "healthy",
#   "timestamp": "2024-01-01T00:00:00Z",
#   "uptime": 3600,
#   "connections": 150,
#   "memory_usage": "45.2MB"
# }

# WebSocket连接测试
wscat -c ws://localhost:8080/ws

故障排除

常见问题

1. 编译错误
错误:找不到OpenSSL库
解决:安装libssl-dev包
sudo apt install libssl-dev
2. 运行错误
错误:端口已被占用
解决:更改端口或停止占用进程
./iot_server --port 8888
3. 连接问题
错误:WebSocket连接失败
解决:检查防火墙和网络配置
sudo ufw allow 8080/tcp
4. 性能问题
问题:高并发下连接断开
解决:调整系统限制
ulimit -n 65535

调试模式

# 启用调试日志
./iot_server --log-level debug
​
# 启用详细日志
export IOT_DEBUG=1
./iot_server
​
# 使用GDB调试
gdb --args ./iot_server --port 8080

日志分析

# 查看错误日志
grep ERROR /var/log/iot_server.log

# 查看慢请求
grep "slow request" /var/log/iot_server.log

# 实时监控日志
tail -f /var/log/iot_server.log | grep -E "(ERROR|WARNING|slow)"

开发指南

代码结构

src/
├── core/           # 核心模块
│   ├── server.cpp
│   └── config.cpp
├── network/        # 网络模块
│   ├── websocket.cpp
│   └── tcp_server.cpp
├── device/         # 设备管理
│   ├── manager.cpp
│   └── registry.cpp
├── message/        # 消息处理
│   ├── router.cpp
│   └── handler.cpp
├── utils/          # 工具类
│   ├── logger.cpp
│   └── crypto.cpp
└── web/           # Web接口
    ├── api.cpp
    └── static_handler.cpp

添加新功能

  1. 创建新的源文件和头文件

  2. 在CMakeLists.txt中添加文件

  3. 实现业务逻辑

  4. 添加单元测试

  5. 更新文档

代码规范

  • 使用C++17特性

  • 遵循Google C++风格指南

  • 使用Doxygen注释

  • 编写单元测试

  • 保持向后兼容

测试

# 运行所有测试
cd build && ctest --output-on-failure

# 运行特定测试
./test_websocket
./test_device_manager

# 覆盖率测试
mkdir coverage && cd coverage
cmake .. -DCMAKE_BUILD_TYPE=Debug -DWITH_COVERAGE=ON
make
lcov --capture --directory . --output-file coverage.info
genhtml coverage.info --output-directory out

安全建议

生产环境安全

  1. 启用SSL/TLS: 所有通信使用加密

  2. 防火墙配置: 只开放必要端口

  3. 定期更新: 及时更新系统和依赖

  4. 访问控制: 实现身份验证和授权

  5. 日志审计: 记录所有重要操作

数据安全

  1. 加密存储: 敏感数据加密存储

  2. 备份策略: 定期备份配置和数据

  3. 密钥管理: 安全存储SSL证书和密钥

  4. 输入验证: 验证所有输入数据

许可证

本项目采用MIT许可证。详见LICENSE文件。

贡献指南

  1. Fork本仓库

  2. 创建特性分支

  3. 提交更改

  4. 推送到分支

  5. 创建Pull Request

支持

更新日志

v1.0.0 (2024-01-01)

  • 初始版本发布

  • 支持WebSocket设备连接

  • 设备管理和监控

  • Web仪表板界面

  • 基础消息路由


注意: 本文档会随着项目发展而更新,请定期查看最新版本。

​
## 文件10: scripts/deploy.sh - 自动化部署脚本
​
```bash
#!/bin/bash
#=============================================================================
# @file deploy.sh
# @brief IoT平台自动化部署脚本
# @author IoT Platform Team
# @version 1.0
# @date 2024
# 
# 支持一键部署到开发、测试和生产环境
# 包含依赖安装、编译、配置和服务部署
#=============================================================================
​
# 设置严格模式:遇到错误退出,使用未定义变量报错
set -euo pipefail
​
# 颜色定义用于输出
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly NC='\033[0m' # No Color
​
# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}
​
log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}
​
log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}
​
log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}
​
# 显示使用说明
show_usage() {
    cat << EOF
用法: $0 [选项]
​
IoT平台部署脚本
​
选项:
  -h, --help              显示此帮助信息
  -e, --env ENV           部署环境 (dev|test|prod) [默认: dev]
  -c, --clean             清理构建目录
  -i, --install           安装到系统目录
  -s, --start             启动服务
  -r, --restart           重启服务
  -d, --stop              停止服务
  -u, --uninstall         卸载服务
  --no-deps               跳过依赖安装
  --build-only            仅构建不部署
  --with-docker           使用Docker部署
  --with-kubernetes       使用Kubernetes部署
​
示例:
  $0 -e dev -c            # 清理并部署到开发环境
  $0 -e prod --install    # 部署到生产环境并安装服务
  $0 --with-docker        # 使用Docker部署
EOF
}
​
# 检查命令是否存在
check_command() {
    if ! command -v "$1" &> /dev/null; then
        log_error "命令 '$1' 未找到,请先安装"
        return 1
    fi
    return 0
}
​
# 检查操作系统
detect_os() {
    if [[ -f /etc/os-release ]]; then
        # 读取/etc/os-release文件
        . /etc/os-release
        OS_NAME="$ID"
        OS_VERSION="$VERSION_ID"
    elif [[ "$(uname)" == "Darwin" ]]; then
        OS_NAME="macos"
        OS_VERSION="$(sw_vers -productVersion)"
    elif [[ "$(uname)" == "MINGW"* ]] || [[ "$(uname)" == "MSYS"* ]]; then
        OS_NAME="windows"
        OS_VERSION="$(cmd.exe /c ver 2>/dev/null | grep -o '[0-9]\+\.[0-9]\+')"
    else
        OS_NAME="unknown"
        OS_VERSION="unknown"
    fi
    
    log_info "操作系统: $OS_NAME $OS_VERSION"
}
​
# 安装系统依赖
install_dependencies() {
    local env="$1"
    
    log_info "开始安装系统依赖..."
    
    case "$OS_NAME" in
        ubuntu|debian)
            # Ubuntu/Debian系统
            sudo apt-get update
            
            # 基础编译工具
            sudo apt-get install -y \
                build-essential \
                cmake \
                git \
                pkg-config
                
            # OpenSSL开发库
            sudo apt-get install -y \
                libssl-dev
                
            # 可选:数据库客户端库
            if [[ "$env" == "prod" ]]; then
                sudo apt-get install -y \
                    libmysqlclient-dev \
                    libpq-dev
            fi
            
            # 可选:监控工具
            if [[ "$env" == "prod" ]]; then
                sudo apt-get install -y \
                    htop \
                    nmon \
                    sysstat
            fi
            ;;
            
        centos|rhel|fedora)
            # CentOS/RHEL/Fedora系统
            if [[ "$OS_NAME" == "centos" ]] || [[ "$OS_NAME" == "rhel" ]]; then
                sudo yum install -y epel-release
            fi
            
            # 基础编译工具
            sudo yum install -y \
                gcc-c++ \
                cmake3 \
                make \
                git \
                pkgconfig
                
            # 创建cmake符号链接
            sudo ln -sf /usr/bin/cmake3 /usr/bin/cmake
            
            # OpenSSL开发库
            sudo yum install -y \
                openssl-devel
                
            # 可选:数据库客户端库
            if [[ "$env" == "prod" ]]; then
                sudo yum install -y \
                    mysql-devel \
                    postgresql-devel
            fi
            ;;
            
        macos)
            # macOS系统(使用Homebrew)
            if ! check_command brew; then
                log_error "Homebrew未安装,请先安装Homebrew"
                return 1
            fi
            
            brew update
            
            # 基础编译工具
            brew install \
                cmake \
                pkg-config
                
            # OpenSSL
            brew install openssl
            
            # 设置OpenSSL路径
            export LDFLAGS="-L/usr/local/opt/openssl/lib"
            export CPPFLAGS="-I/usr/local/opt/openssl/include"
            ;;
            
        windows)
            # Windows系统(使用Chocolatey或手动安装)
            log_warning "Windows系统请手动安装以下依赖:"
            log_warning "1. Visual Studio 2019+ with C++ tools"
            log_warning "2. CMake"
            log_warning "3. OpenSSL"
            log_warning "4. Git for Windows"
            return 0
            ;;
            
        *)
            log_error "不支持的操作系统: $OS_NAME"
            return 1
            ;;
    esac
    
    log_success "系统依赖安装完成"
}
​
# 清理构建目录
clean_build() {
    log_info "清理构建目录..."
    
    if [[ -d "build" ]]; then
        rm -rf build
        log_success "构建目录已清理"
    else
        log_info "构建目录不存在,跳过清理"
    fi
}
​
# 配置项目
configure_project() {
    local env="$1"
    local build_type="Debug"
    
    # 根据环境设置构建类型
    case "$env" in
        dev) build_type="Debug" ;;
        test) build_type="RelWithDebInfo" ;;
        prod) build_type="Release" ;;
    esac
    
    log_info "配置项目 (环境: $env, 构建类型: $build_type)..."
    
    # 创建构建目录
    mkdir -p build
    cd build
    
    # CMake配置选项
    local cmake_options="-DCMAKE_BUILD_TYPE=$build_type"
    
    # 生产环境启用优化选项
    if [[ "$env" == "prod" ]]; then
        cmake_options="$cmake_options -DENABLE_LTO=ON"
    fi
    
    # 运行CMake配置
    cmake .. $cmake_options
    
    cd ..
    
    log_success "项目配置完成"
}
​
# 编译项目
build_project() {
    log_info "开始编译项目..."
    
    cd build
    
    # 获取CPU核心数(用于并行编译)
    local num_cores
    if [[ "$OS_NAME" == "macos" ]]; then
        num_cores=$(sysctl -n hw.ncpu)
    elif [[ "$OS_NAME" == "windows" ]]; then
        num_cores=$NUMBER_OF_PROCESSORS
    else
        num_cores=$(nproc)
    fi
    
    # 构建项目
    log_info "使用 $num_cores 个并行任务编译..."
    make -j"$num_cores"
    
    cd ..
    
    log_success "项目编译完成"
}
​
# 运行测试
run_tests() {
    local env="$1"
    
    # 开发环境运行测试
    if [[ "$env" == "dev" ]] || [[ "$env" == "test" ]]; then
        log_info "运行单元测试..."
        
        cd build
        
        if ctest --output-on-failure; then
            log_success "所有测试通过"
        else
            log_error "测试失败"
            cd ..
            return 1
        fi
        
        cd ..
    fi
}
​
# 创建配置文件
create_config() {
    local env="$1"
    
    log_info "创建 $env 环境配置文件..."
    
    # 配置文件模板
    local config_template="config/iot_server.conf.example"
    local config_file="config/iot_server.$env.conf"
    
    if [[ ! -f "$config_template" ]]; then
        log_error "配置文件模板不存在: $config_template"
        return 1
    fi
    
    # 复制模板文件
    cp "$config_template" "$config_file"
    
    # 根据环境修改配置
    case "$env" in
        dev)
            # 开发环境配置
            sed -i.bak \
                -e "s/^log_level = .*/log_level = debug/" \
                -e "s/^max_connections = .*/max_connections = 100/" \
                -e "s/^worker_threads = .*/worker_threads = 2/" \
                "$config_file"
            ;;
            
        test)
            # 测试环境配置
            sed -i.bak \
                -e "s/^log_level = .*/log_level = info/" \
                -e "s/^max_connections = .*/max_connections = 1000/" \
                -e "s/^worker_threads = .*/worker_threads = 4/" \
                "$config_file"
            ;;
            
        prod)
            # 生产环境配置
            sed -i.bak \
                -e "s/^log_level = .*/log_level = warning/" \
                -e "s/^max_connections = .*/max_connections = 10000/" \
                -e "s/^worker_threads = .*/worker_threads = 8/" \
                -e "s/^enable_ssl = .*/enable_ssl = true/" \
                "$config_file"
            ;;
    esac
    
    # 清理备份文件
    rm -f "$config_file.bak"
    
    log_success "配置文件已创建: $config_file"
}
​
# 安装到系统目录
install_service() {
    local env="$1"
    
    log_info "安装服务到系统目录..."
    
    # 检查是否为root用户
    if [[ "$(id -u)" -ne 0 ]]; then
        log_error "需要root权限安装服务"
        log_info "请使用: sudo $0 -e $env --install"
        return 1
    fi
    
    cd build
    
    # 运行make install
    make install
    
    cd ..
    
    # 创建数据目录
    local data_dir="/var/lib/iot_platform"
    local log_dir="/var/log/iot_platform"
    local config_dir="/etc/iot_platform"
    
    mkdir -p "$data_dir" "$log_dir" "$config_dir"
    
    # 设置权限
    chown -R iot_server:iot_server "$data_dir" "$log_dir"
    chmod 755 "$data_dir" "$log_dir"
    
    # 复制配置文件
    cp "config/iot_server.$env.conf" "$config_dir/iot_server.conf"
    chmod 644 "$config_dir/iot_server.conf"
    
    # 安装systemd服务文件
    if [[ "$OS_NAME" == "ubuntu" ]] || [[ "$OS_NAME" == "debian" ]] || 
       [[ "$OS_NAME" == "centos" ]] || [[ "$OS_NAME" == "rhel" ]]; then
        install_systemd_service
    elif [[ "$OS_NAME" == "macos" ]]; then
        install_launchd_service
    elif [[ "$OS_NAME" == "windows" ]]; then
        install_windows_service
    fi
    
    log_success "服务安装完成"
}
​
# 安装systemd服务
install_systemd_service() {
    log_info "安装systemd服务..."
    
    # 服务文件模板
    local service_template="scripts/iot_server.service.in"
    local service_file="/etc/systemd/system/iot_server.service"
    
    # 生成服务文件
    sed \
        -e "s|@BINDIR@|/usr/local/bin|g" \
        -e "s|@CONFDIR@|/etc/iot_platform|g" \
        -e "s|@DATADIR@|/var/lib/iot_platform|g" \
        -e "s|@LOGDIR@|/var/log/iot_platform|g" \
        -e "s|@USER@|iot_server|g" \
        -e "s|@GROUP@|iot_server|g" \
        "$service_template" > "$service_file"
    
    # 重新加载systemd
    systemctl daemon-reload
    
    # 启用服务
    systemctl enable iot_server
    
    log_success "systemd服务安装完成"
}
​
# 安装launchd服务(macOS)
install_launchd_service() {
    log_info "安装launchd服务..."
    
    local plist_file="/Library/LaunchDaemons/com.iot.platform.plist"
    
    cat > "$plist_file" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.iot.platform</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/iot_server</string>
        <string>--config</string>
        <string>/etc/iot_platform/iot_server.conf</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/var/log/iot_platform/stdout.log</string>
    <key>StandardErrorPath</key>
    <string>/var/log/iot_platform/stderr.log</string>
    <key>UserName</key>
    <string>iot_server</string>
    <key>GroupName</key>
    <string>staff</string>
</dict>
</plist>
EOF
    
    # 设置权限
    chmod 644 "$plist_file"
    
    # 加载服务
    launchctl load "$plist_file"
    
    log_success "launchd服务安装完成"
}
​
# 安装Windows服务
install_windows_service() {
    log_warning "Windows服务安装需要手动配置"
    log_info "请参考 scripts/install_windows_service.bat"
}
​
# 启动服务
start_service() {
    log_info "启动IoT平台服务..."
    
    case "$OS_NAME" in
        ubuntu|debian|centos|rhel)
            systemctl start iot_server
            systemctl status iot_server
            ;;
        macos)
            launchctl start com.iot.platform
            ;;
        windows)
            net start iot_server
            ;;
        *)
            log_error "不支持的操作系统"
            return 1
            ;;
    esac
    
    log_success "服务启动完成"
}
​
# 停止服务
stop_service() {
    log_info "停止IoT平台服务..."
    
    case "$OS_NAME" in
        ubuntu|debian|centos|rhel)
            systemctl stop iot_server
            ;;
        macos)
            launchctl stop com.iot.platform
            ;;
        windows)
            net stop iot_server
            ;;
        *)
            log_error "不支持的操作系统"
            return 1
            ;;
    esac
    
    log_success "服务停止完成"
}
​
# 重启服务
restart_service() {
    log_info "重启IoT平台服务..."
    
    case "$OS_NAME" in
        ubuntu|debian|centos|rhel)
            systemctl restart iot_server
            systemctl status iot_server
            ;;
        macos)
            launchctl stop com.iot.platform
            sleep 2
            launchctl start com.iot.platform
            ;;
        windows)
            net stop iot_server
            sleep 5
            net start iot_server
            ;;
        *)
            log_error "不支持的操作系统"
            return 1
            ;;
    esac
    
    log_success "服务重启完成"
}
​
# 卸载服务
uninstall_service() {
    log_info "卸载IoT平台服务..."
    
    # 检查是否为root用户
    if [[ "$(id -u)" -ne 0 ]]; then
        log_error "需要root权限卸载服务"
        log_info "请使用: sudo $0 -e $env --uninstall"
        return 1
    fi
    
    # 停止服务
    stop_service
    
    case "$OS_NAME" in
        ubuntu|debian|centos|rhel)
            # 禁用并删除systemd服务
            systemctl disable iot_server
            rm -f /etc/systemd/system/iot_server.service
            systemctl daemon-reload
            ;;
        macos)
            # 删除launchd服务
            launchctl unload /Library/LaunchDaemons/com.iot.platform.plist
            rm -f /Library/LaunchDaemons/com.iot.platform.plist
            ;;
        windows)
            # Windows服务卸载
            log_info "请运行 scripts/uninstall_windows_service.bat"
            ;;
    esac
    
    # 删除安装的文件
    rm -f /usr/local/bin/iot_server
    rm -rf /usr/local/share/iot_platform
    rm -rf /etc/iot_platform
    rm -rf /var/lib/iot_platform
    rm -rf /var/log/iot_platform
    
    log_success "服务卸载完成"
}
​
# Docker部署
deploy_with_docker() {
    local env="$1"
    
    log_info "使用Docker部署 (环境: $env)..."
    
    # 检查Docker是否安装
    if ! check_command docker; then
        log_error "Docker未安装,请先安装Docker"
        return 1
    fi
    
    # 检查Docker Compose是否安装
    if ! check_command docker-compose; then
        log_error "Docker Compose未安装,请先安装Docker Compose"
        return 1
    fi
    
    # 创建Docker网络
    docker network create iot_network 2>/dev/null || true
    
    # 构建Docker镜像
    log_info "构建Docker镜像..."
    docker build -t iot_platform:"$env" .
    
    # 创建Docker Compose配置文件
    create_docker_compose_config "$env"
    
    # 启动服务
    log_info "启动Docker容器..."
    docker-compose up -d
    
    # 等待服务启动
    sleep 10
    
    # 检查容器状态
    docker-compose ps
    
    log_success "Docker部署完成"
}
​
# 创建Docker Compose配置
create_docker_compose_config() {
    local env="$1"
    
    cat > docker-compose.yml << EOF
version: '3.8'
​
services:
  iot_server:
    image: iot_platform:$env
    container_name: iot_server_$env
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      - ENV=$env
      - LOG_LEVEL=${LOG_LEVEL:-info}
    volumes:
      - ./data:/var/lib/iot_platform
      - ./logs:/var/log/iot_platform
      - ./config/iot_server.$env.conf:/etc/iot_platform/iot_server.conf:ro
    networks:
      - iot_network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3
​
networks:
  iot_network:
    external: true
EOF
}
​
# Kubernetes部署
deploy_with_kubernetes() {
    local env="$1"
    
    log_info "使用Kubernetes部署 (环境: $env)..."
    
    # 检查kubectl是否安装
    if ! check_command kubectl; then
        log_error "kubectl未安装,请先安装kubectl"
        return 1
    fi
    
    # 创建命名空间
    kubectl create namespace iot-platform 2>/dev/null || true
    
    # 创建配置映射
    kubectl create configmap iot-server-config \
        --namespace iot-platform \
        --from-file=config/iot_server.$env.conf \
        --dry-run=client -o yaml | kubectl apply -f -
    
    # 创建密钥(如果需要)
    if [[ "$env" == "prod" ]]; then
        kubectl create secret generic iot-server-secrets \
            --namespace iot-platform \
            --from-literal=db_password="${DB_PASSWORD:-}" \
            --dry-run=client -o yaml | kubectl apply -f -
    fi
    
    # 创建部署
    kubectl apply -f kubernetes/deployment.yaml
    kubectl apply -f kubernetes/service.yaml
    
    # 等待部署完成
    kubectl rollout status deployment/iot-server --namespace iot-platform
    
    log_success "Kubernetes部署完成"
}
​
# 主函数
main() {
    # 默认参数
    local env="dev"
    local clean=false
    local install=false
    local start=false
    local stop=false
    local restart=false
    local uninstall=false
    local skip_deps=false
    local build_only=false
    local with_docker=false
    local with_kubernetes=false
    
    # 解析命令行参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_usage
                exit 0
                ;;
            -e|--env)
                env="$2"
                shift 2
                ;;
            -c|--clean)
                clean=true
                shift
                ;;
            -i|--install)
                install=true
                shift
                ;;
            -s|--start)
                start=true
                shift
                ;;
            -r|--restart)
                restart=true
                shift
                ;;
            -d|--stop)
                stop=true
                shift
                ;;
            -u|--uninstall)
                uninstall=true
                shift
                ;;
            --no-deps)
                skip_deps=true
                shift
                ;;
            --build-only)
                build_only=true
                shift
                ;;
            --with-docker)
                with_docker=true
                shift
                ;;
            --with-kubernetes)
                with_kubernetes=true
                shift
                ;;
            *)
                log_error "未知选项: $1"
                show_usage
                exit 1
                ;;
        esac
    done
    
    # 验证环境参数
    case "$env" in
        dev|test|prod)
            ;;
        *)
            log_error "无效的环境: $env,必须是 dev, test 或 prod"
            exit 1
            ;;
    esac
    
    # 显示部署信息
    log_info "=== IoT平台部署开始 ==="
    log_info "部署环境: $env"
    log_info "操作系统: $OS_NAME $OS_VERSION"
    
    # 检测操作系统
    detect_os
    
    # 安装依赖
    if [[ "$skip_deps" == false ]]; then
        install_dependencies "$env"
    fi
    
    # 清理构建目录
    if [[ "$clean" == true ]]; then
        clean_build
    fi
    
    # 配置项目
    configure_project "$env"
    
    # 编译项目
    build_project
    
    # 运行测试
    run_tests "$env"
    
    # 创建配置文件
    create_config "$env"
    
    # 如果指定了仅构建,则退出
    if [[ "$build_only" == true ]]; then
        log_success "构建完成"
        exit 0
    fi
    
    # Docker部署
    if [[ "$with_docker" == true ]]; then
        deploy_with_docker "$env"
        exit 0
    fi
    
    # Kubernetes部署
    if [[ "$with_kubernetes" == true ]]; then
        deploy_with_kubernetes "$env"
        exit 0
    fi
    
    # 安装服务
    if [[ "$install" == true ]]; then
        install_service "$env"
    fi
    
    # 启动服务
    if [[ "$start" == true ]]; then
        start_service
    fi
    
    # 停止服务
    if [[ "$stop" == true ]]; then
        stop_service
    fi
    
    # 重启服务
    if [[ "$restart" == true ]]; then
        restart_service
    fi
    
    # 卸载服务
    if [[ "$uninstall" == true ]]; then
        uninstall_service
    fi
    
    # 显示部署结果
    log_success "=== IoT平台部署完成 ==="
    log_info "访问地址: http://localhost:8080"
    log_info "配置文件: config/iot_server.$env.conf"
    log_info "日志文件: /var/log/iot_platform/iot_server.log"
    
    # 如果已启动服务,显示状态
    if [[ "$start" == true ]] || [[ "$install" == true ]]; then
        echo ""
        log_info "使用以下命令管理服务:"
        log_info "  systemctl status iot_server   # 查看服务状态"
        log_info "  journalctl -u iot_server -f  # 查看服务日志"
        log_info "  sudo $0 -r                  # 重启服务"
    fi
}
​
# 检查必要命令
check_command cmake || exit 1
check_command make || exit 1
check_command git || exit 1
​
# 运行主函数
main "$@"

设计模式分析(第七部分)

1. 构建器模式(Builder Pattern)

  • 应用位置:CMakeLists.txt中的逐步构建配置

  • 处理突发事件

    • 平台差异:不同操作系统使用不同构建配置

    • 编译选项复杂:通过选项逐步配置构建过程

    • 依赖管理:动态查找和链接依赖库

  • 工程作用

    • 分离构建过程与具体实现

    • 支持多种构建配置组合

    • 提供清晰的构建流程

2. 工厂模式(Factory Pattern)

  • 应用位置:deploy.sh中根据环境创建不同配置

  • 处理突发事件

    • 多环境部署:开发、测试、生产环境不同配置

    • 平台适配:不同操作系统使用不同部署策略

    • 部署方式多样:支持直接部署、Docker、Kubernetes

  • 工程作用

    • 封装部署细节

    • 统一部署接口

    • 易于扩展新部署方式

3. 模板方法模式(Template Method Pattern)

  • 应用位置:deploy.sh中的部署流程

  • 处理突发事件

    • 部署流程变化:核心流程固定,具体步骤可调整

    • 错误处理:统一的错误处理机制

    • 流程控制:控制部署步骤的顺序

  • 工程作用

    • 定义部署算法骨架

    • 子步骤可以重写

    • 代码复用

运行部署流程

1. 快速部署(开发环境)

# 克隆代码
git clone https://github.com/your-org/iot_platform.git
cd iot_platform

# 运行部署脚本
chmod +x scripts/deploy.sh
./scripts/deploy.sh -e dev

# 或者分步执行
./scripts/deploy.sh -e dev -c      # 清理并构建
./scripts/deploy.sh -e dev -i      # 安装
./scripts/deploy.sh -e dev -s      # 启动

2. 生产环境部署

# 生产环境部署
sudo ./scripts/deploy.sh -e prod --install

# 或者使用Docker
./scripts/deploy.sh -e prod --with-docker

# 或者使用Kubernetes
./scripts/deploy.sh -e prod --with-kubernetes

3. 手动编译和运行

# 传统CMake构建流程
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)

# 运行服务器
./iot_server --config ../config/iot_server.conf

# 查看帮助
./iot_server --help

部署架构设计

1. 单机部署架构

用户浏览器 → Nginx (80/443) → IoT服务器 (8080)
                   ↓
               静态文件服务

2. Docker部署架构

用户浏览器 → Nginx容器 → IoT服务器容器
       ↓                    ↓
    Docker网络 ← 数据卷共享

3. Kubernetes部署架构

用户 → Ingress → Service → Pod (IoT服务器)
           ↓
      ConfigMap (配置)
           ↓
      Secret (密钥)

性能调优参数

编译优化

# GCC优化选项
-O3 -march=native -flto -fno-exceptions
​
# Clang优化选项
-O3 -march=native -flto=thin
​
# MSVC优化选项
/O2 /GL /MP

运行时优化

[performance]
# Linux内核参数
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
fs.file-max = 1000000
​
# 进程限制
ulimit -n 100000
ulimit -u unlimited

监控和维护

健康检查端点

GET /health        # 服务健康状态
GET /metrics       # Prometheus指标
GET /status        # 详细状态信息
GET /version       # 版本信息

日志轮转配置

# logrotate配置
/var/log/iot_platform/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 644 iot_server iot_server
    postrotate
        systemctl reload iot_server
    endscript
}

备份策略

# 每日备份脚本
#!/bin/bash
BACKUP_DIR="/backup/iot_platform"
DATE=$(date +%Y%m%d_%H%M%S)
​
# 备份配置文件
tar -czf $BACKUP_DIR/config_$DATE.tar.gz /etc/iot_platform
​
# 备份数据库(如果使用)
mysqldump -u iot_user -p iot_platform > $BACKUP_DIR/db_$DATE.sql
​
# 保留最近7天备份
find $BACKUP_DIR -type f -mtime +7 -delete

第七部分总结:提供了完整的部署和运行指南,包括:

  1. 跨平台构建配置:使用CMake支持Linux/Windows/macOS

  2. 详细文档:README.md包含完整的使用说明

  3. 自动化部署脚本:支持多种部署方式

  4. 生产环境配置:包含安全、监控、备份等最佳实践

系统现在可以按照以下步骤部署运行:

快速开始

# 1. 克隆代码
git clone https://github.com/your-org/iot_platform.git
cd iot_platform
​
# 2. 一键部署(开发环境)
./scripts/deploy.sh -e dev
​
# 3. 访问Web界面
# 打开浏览器访问 http://localhost:8080

生产部署

# 1. 安装依赖
sudo apt update
sudo apt install build-essential cmake libssl-dev
​
# 2. 生产环境部署
sudo ./scripts/deploy.sh -e prod --install
​
# 3. 配置Nginx和SSL
# 参考 README.md 中的配置示例

现在IoT物联网平台已经完整实现,可以进行编译、部署和运行。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐