增加日志存储功能

This commit is contained in:
GuanYuankai 2025-10-17 17:20:45 +08:00
parent f726d015ae
commit 8245ab0773
6 changed files with 42 additions and 25 deletions

1
.gitignore vendored
View File

@ -42,6 +42,7 @@
build/
build_gyk/
build-gyk/
# Ignore Mosquitto runtime data and logs
mosquitto/data/
mosquitto/log/

View File

@ -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
# )

View File

@ -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

View File

@ -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"]

View File

@ -108,9 +108,6 @@ bool DataStorage::storeRawData(const std::string& device_id, const std::string&
return false;
}
// **重要**:这里的 stmt_guard 也需要修正
// 你之前的代码里是 std::unique_ptr<void, ...>,这也是错误的
// 应该是 sqlite3_stmt*
std::unique_ptr<sqlite3_stmt, decltype(&sqlite3_finalize)> 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::milliseconds>(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<sqlite3_stmt, decltype(&sqlite3_finalize)> 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);

View File

@ -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 <boost/asio.hpp>
#include <boost/asio/steady_timer.hpp>
@ -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()) {
// 网络正常,直接上报