diff --git a/.gitignore b/.gitignore index 55b9b93..85bb7c9 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,7 @@ build/ build_gyk/ +build-gyk/ # Ignore Mosquitto runtime data and logs mosquitto/data/ mosquitto/log/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index be4b47f..e0c4be6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,6 +61,9 @@ add_library(edge_proxy_lib STATIC #web src/web/web_server.cc + + #SQL + src/dataStorage/data_storage.cc ) target_include_directories(edge_proxy_lib PUBLIC @@ -94,14 +97,14 @@ target_link_libraries(edge_proxy PRIVATE # =================#================================================ # 测试目标 # ================================================================= -add_executable(test - src/test.cc - src/piper_tts_interface.cc +# add_executable(test +# src/test.cc +# src/piper_tts_interface.cc -) +# ) -target_link_libraries(test PRIVATE - edge_proxy_lib -) +# target_link_libraries(test PRIVATE +# edge_proxy_lib +# ) diff --git a/docker-compose.yml b/docker-compose.yml index c251350..5c2333c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,9 +11,18 @@ services: - /dev/ttyS7:/dev/ttyS7 - /dev/ttyS9:/dev/ttyS9 + # --- VPU/NPU/RGA/GPU 硬件访问 --- + - /dev/mpp_service:/dev/mpp_service + - /dev/vpu_service:/dev/vpu_service + - /dev/rga:/dev/rga + - /dev/dri:/dev/dri + # --- NPU --- + - /dev/rknn_service:/dev/rknn_service + group_add: - "20" - + - "44" + - "110" volumes: - .:/app diff --git a/docker/Dockerfile b/docker/Dockerfile index 20beb8e..4811f45 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -34,24 +34,20 @@ RUN apt-get update && \ \ # --- 用户和组创建 --- groupadd -r developers && \ - # 创建 'dev' 用户,将其主组设置为 'developers',并添加到 'sudo' 组 useradd -ms /bin/bash -g developers -G sudo dev && \ - # 添加用户到 'dialout' 组 (GID 20) 以便访问串口设备 - # `|| true` 用于防止在 GID 已存在时出错 groupadd -g 20 dialout || true && \ + groupadd -g 44 video || true && \ + groupadd -g 110 render || true && \ usermod -a -G dialout dev && \ - # 为 'dev' 用户设置无密码 sudo + usermod -a -G video dev && \ + usermod -a -G render dev && \ echo "dev ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/dev-nopasswd -# 3. 权限和协作设置 # ================================= # 为所有用户设置 umask 为 0002,这样新创建的文件权限默认为 664 (rw-rw-r--) RUN echo "umask 0002" > /etc/profile.d/99-shared-umask.sh && \ chmod +x /etc/profile.d/99-shared-umask.sh - -# 4. 编译并安装第三方库 # ================================= -# [cite_start]将整个项目复制到临时目录,用于编译 paho 等库 [cite: 4] COPY . /tmp/build-context RUN cd /tmp/build-context/external/paho.mqtt.c && \ @@ -77,13 +73,11 @@ COPY piper_models/ /app/piper_models/ USER dev -RUN pip install --no-cache-dir --user piper-tts +RUN pip install --no-cache-dir --user -i https://mirrors.aliyun.com/pypi/simple/ piper-tts # 将 ~/.local/bin (包含 piper 二进制文件) 添加到 PATH RUN echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bash_profile # 现在,dev 用户可以使用 `piper` 命令了,只要 shell 环境被正确加载。 # 我们可以将最终的 CMD 设置为加载环境然后执行一个命令,或者留空让用户交互。 -# 5. 设置默认用户 -# ================================= -# 容器的默认用户将是 'dev' + USER dev CMD ["/bin/bash"] diff --git a/src/dataStorage/data_storage.cc b/src/dataStorage/data_storage.cc index 18e395f..02d80b1 100644 --- a/src/dataStorage/data_storage.cc +++ b/src/dataStorage/data_storage.cc @@ -108,9 +108,6 @@ bool DataStorage::storeRawData(const std::string& device_id, const std::string& return false; } - // **重要**:这里的 stmt_guard 也需要修正 - // 你之前的代码里是 std::unique_ptr,这也是错误的 - // 应该是 sqlite3_stmt* std::unique_ptr stmt_guard(stmt, sqlite3_finalize); sqlite3_bind_text(stmt, 1, device_id.c_str(), -1, SQLITE_STATIC); sqlite3_bind_int64(stmt, 2, std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); @@ -137,7 +134,6 @@ bool DataStorage::storeProcessedData(const UnifiedData& data) { std::cerr << "Failed to prepare statement for processed_data: " << sqlite3_errmsg(db_->db_handle) << std::endl; return false; } - // **重要**:这里的 stmt_guard 也需要修正 std::unique_ptr stmt_guard(stmt, sqlite3_finalize); sqlite3_bind_text(stmt, 1, data.device_id.c_str(), -1, SQLITE_STATIC); sqlite3_bind_int64(stmt, 2, data.timestamp_ms); diff --git a/src/main.cpp b/src/main.cpp index 08bcc14..0a46d63 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,6 +10,7 @@ #include "dataCache/cache_uploader.h" #include "web/web_server.h" #include "dataCache/live_data_cache.h" +#include "dataStorage/data_storage.h" #include #include @@ -52,12 +53,25 @@ int main(int argc, char* argv[]) { std::cerr << "Log initialization failed: " << ex.what() << std::endl; return 1; } - + // --- 数据库初始化代码 --- + spdlog::info("Initializing Data Storage..."); + if (!DataStorage::getInstance().initialize("edge_proxy_data.db")) { + spdlog::critical("Failed to initialize DataStorage. Exiting."); + return 1; + } + try { DataCache data_cache; LiveDataCache live_data_cache; MqttClient mqtt_client("tcp://mqtt-broker:1883", "edge-proxy-main-client"); auto report_to_mqtt = [&](const UnifiedData& data) { + // 使用 DataStorage 单例存储处理后的 UnifiedData 对象 + if (DataStorage::getInstance().storeProcessedData(data)) { + spdlog::debug("Successfully stored PROCESSED data for device '{}'", data.device_id); + } else { + spdlog::error("Failed to store PROCESSED data for device '{}'", data.device_id); + } + // live_data_cache.update_data(data.device_id, data.data_json); if (mqtt_client.is_connected()) { // 网络正常,直接上报