diff --git a/algorithms.py b/algorithms.py index b0ed343..fc70e03 100644 --- a/algorithms.py +++ b/algorithms.py @@ -1,5 +1,7 @@ +import logging import os import sys +import threading import time from collections import deque from datetime import datetime, timedelta @@ -7,6 +9,9 @@ from typing import Any, Dict, List, Optional, Tuple import cv2 import numpy as np +import redis + +logger = logging.getLogger(__name__) sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) diff --git a/config/__pycache__/config_models.cpython-310.pyc b/config/__pycache__/config_models.cpython-310.pyc index 89b46ac..d9ff607 100644 Binary files a/config/__pycache__/config_models.cpython-310.pyc and b/config/__pycache__/config_models.cpython-310.pyc differ diff --git a/config/__pycache__/database.cpython-310.pyc b/config/__pycache__/database.cpython-310.pyc index 5c37c77..2a87775 100644 Binary files a/config/__pycache__/database.cpython-310.pyc and b/config/__pycache__/database.cpython-310.pyc differ diff --git a/config/__pycache__/settings.cpython-310.pyc b/config/__pycache__/settings.cpython-310.pyc index b3f9afd..a68d54e 100644 Binary files a/config/__pycache__/settings.cpython-310.pyc and b/config/__pycache__/settings.cpython-310.pyc differ diff --git a/core/__pycache__/config_sync.cpython-310.pyc b/core/__pycache__/config_sync.cpython-310.pyc index 3e04b1f..70e358d 100644 Binary files a/core/__pycache__/config_sync.cpython-310.pyc and b/core/__pycache__/config_sync.cpython-310.pyc differ diff --git a/core/__pycache__/result_reporter.cpython-310.pyc b/core/__pycache__/result_reporter.cpython-310.pyc index e153957..254402e 100644 Binary files a/core/__pycache__/result_reporter.cpython-310.pyc and b/core/__pycache__/result_reporter.cpython-310.pyc differ diff --git a/core/__pycache__/tensorrt_engine.cpython-310.pyc b/core/__pycache__/tensorrt_engine.cpython-310.pyc index f144f68..800adb3 100644 Binary files a/core/__pycache__/tensorrt_engine.cpython-310.pyc and b/core/__pycache__/tensorrt_engine.cpython-310.pyc differ diff --git a/core/result_reporter.py b/core/result_reporter.py index e2d9ea0..210b7e0 100644 --- a/core/result_reporter.py +++ b/core/result_reporter.py @@ -235,6 +235,33 @@ class ResultReporter: else: raise Exception(f"MQTT 发布失败: {result[0]}") + def report_heartbeat( + self, + device_id: str, + status: Dict[str, Any] + ) -> bool: + """上报心跳""" + try: + heartbeat_data = { + "device_id": device_id, + "status": status, + "timestamp": datetime.now().isoformat(), + } + + topic = f"{self._topic_prefix}/heartbeat/{device_id}" + + if self._client and self._connected: + result = self._client.publish(topic, json.dumps(heartbeat_data, ensure_ascii=False)) + if result[0] == mqtt.MQTT_ERR_SUCCESS: + self._logger.debug(f"心跳上报成功: {device_id}") + return True + + self._logger.warning(f"心跳上报失败(MQTT未连接): {device_id}") + return False + except Exception as e: + self._logger.error(f"心跳上报异常: {e}") + return False + def get_pending_alerts(self) -> List[Dict[str, Any]]: """获取待同步的告警""" if self._local_cache: @@ -301,6 +328,14 @@ class ResultReporter: if self._client: self._client.loop_stop() self._client.disconnect() + + def close(self): + """关闭上报器(别名)""" + self.cleanup() + + if self._client: + self._client.loop_stop() + self._client.disconnect() self._logger.info("ResultReporter 清理完成") diff --git a/logs/main.log b/logs/main.log index 5b1be96..a8d0e1a 100644 --- a/logs/main.log +++ b/logs/main.log @@ -263,3 +263,120 @@ ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无 2026-01-30 09:27:08 | INFO | main | 收到信号 2, 正在停止服务... 2026-01-30 09:27:08 | INFO | main | 已停止所有视频流 2026-01-30 09:27:08 | INFO | main | 已停止所有视频流 +2026-01-30 15:08:51 | INFO | main | Edge_Inference_Service 初始化开始 +2026-01-30 15:08:51 | INFO | main | ================================================== +2026-01-30 15:08:51 | INFO | main | Edge_Inference_Service 启动 +2026-01-30 15:08:51 | INFO | main | ================================================== +2026-01-30 15:08:51 | INFO | main | 数据库初始化成功 +2026-01-30 15:08:55 | INFO | main | 配置管理器初始化成功 +2026-01-30 15:08:55 | INFO | main | 流管理器初始化成功 +2026-01-30 15:08:55 | INFO | main | 图像预处理器初始化完成: 输入尺寸 480x480, Batch大小 1-8, FP16模式 True +2026-01-30 15:08:55 | INFO | main | 预处理器初始化成功 +2026-01-30 15:08:55 | INFO | main | TensorRT引擎初始化配置: 模型=./models/yolo11n.engine, 输入尺寸=480x480, Batch=1, FP16=True +2026-01-30 15:08:56 | INFO | main | 连接事件: load - TensorRT -> ./models/yolo11n.engine +2026-01-30 15:08:56 | INFO | main | TensorRT引擎加载成功: ./models/yolo11n.engine +2026-01-30 15:08:56 | INFO | main | 引擎已加载: default +2026-01-30 15:08:56 | INFO | main | 推理引擎加载成功: ./models/yolo11n.engine +2026-01-30 15:08:56 | INFO | main | 后处理器初始化完成: NMS阈值=0.45, 置信度阈值=0.5 +2026-01-30 15:08:56 | INFO | main | 后处理器初始化成功 +2026-01-30 15:08:56 | INFO | main | 结果上报器初始化成功 +2026-01-30 15:08:56 | ERROR | main | 算法管理器初始化失败: name 'threading' is not defined +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 124, in _init_algorithm_manager + self._algorithm_manager = AlgorithmManager() + File "C:\Users\16337\PycharmProjects\ai_edge\algorithms.py", line 267, in __init__ + self._update_lock = threading.Lock() +NameError: name 'threading' is not defined +2026-01-30 15:08:56 | INFO | main | 所有组件初始化完成 +2026-01-30 15:08:56 | INFO | main | 已启动 0 个视频流 +2026-01-30 15:08:56 | INFO | main | Edge_Inference_Service 已启动 +2026-01-30 15:08:56 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:09:26 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:09:56 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:10:26 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:10:30 | INFO | main | 收到信号 2, 正在停止服务... +2026-01-30 15:10:30 | INFO | main | 已停止所有视频流 +2026-01-30 15:10:30 | INFO | main | 已停止所有视频流 +2026-01-30 15:10:30 | INFO | main | TensorRT引擎资源已释放 +2026-01-30 15:10:30 | INFO | main | 所有引擎已释放 +2026-01-30 15:11:55 | INFO | main | Edge_Inference_Service 初始化开始 +2026-01-30 15:11:55 | INFO | main | ================================================== +2026-01-30 15:11:55 | INFO | main | Edge_Inference_Service 启动 +2026-01-30 15:11:55 | INFO | main | ================================================== +2026-01-30 15:11:55 | INFO | main | 数据库初始化成功 +2026-01-30 15:11:59 | INFO | main | 配置管理器初始化成功 +2026-01-30 15:11:59 | INFO | main | 流管理器初始化成功 +2026-01-30 15:11:59 | INFO | main | 图像预处理器初始化完成: 输入尺寸 480x480, Batch大小 1-8, FP16模式 True +2026-01-30 15:11:59 | INFO | main | 预处理器初始化成功 +2026-01-30 15:11:59 | INFO | main | TensorRT引擎初始化配置: 模型=./models/yolo11n.engine, 输入尺寸=480x480, Batch=1, FP16=True +2026-01-30 15:11:59 | INFO | main | 连接事件: load - TensorRT -> ./models/yolo11n.engine +2026-01-30 15:11:59 | INFO | main | TensorRT引擎加载成功: ./models/yolo11n.engine +2026-01-30 15:11:59 | INFO | main | 引擎已加载: default +2026-01-30 15:11:59 | INFO | main | 推理引擎加载成功: ./models/yolo11n.engine +2026-01-30 15:11:59 | INFO | main | 后处理器初始化完成: NMS阈值=0.45, 置信度阈值=0.5 +2026-01-30 15:11:59 | INFO | main | 后处理器初始化成功 +2026-01-30 15:11:59 | INFO | main | 结果上报器初始化成功 +2026-01-30 15:11:59 | ERROR | main | 算法管理器初始化失败: name 'logger' is not defined +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\algorithms.py", line 293, in start_config_subscription + redis_client = redis.Redis( +NameError: name 'redis' is not defined + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 125, in _init_algorithm_manager + self._algorithm_manager.start_config_subscription() + File "C:\Users\16337\PycharmProjects\ai_edge\algorithms.py", line 313, in start_config_subscription + logger.error(f"启动配置订阅失败: {e}") +NameError: name 'logger' is not defined +2026-01-30 15:11:59 | INFO | main | 所有组件初始化完成 +2026-01-30 15:11:59 | INFO | main | 已启动 0 个视频流 +2026-01-30 15:11:59 | INFO | main | Edge_Inference_Service 已启动 +2026-01-30 15:13:21 | INFO | main | 收到信号 2, 正在停止服务... +2026-01-30 15:13:21 | INFO | main | 已停止所有视频流 +2026-01-30 15:13:21 | INFO | main | 已停止所有视频流 +2026-01-30 15:13:21 | INFO | main | TensorRT引擎资源已释放 +2026-01-30 15:13:21 | INFO | main | 所有引擎已释放 +2026-01-30 15:14:04 | INFO | main | Edge_Inference_Service 初始化开始 +2026-01-30 15:14:04 | INFO | main | ================================================== +2026-01-30 15:14:04 | INFO | main | Edge_Inference_Service 启动 +2026-01-30 15:14:04 | INFO | main | ================================================== +2026-01-30 15:14:04 | INFO | main | 数据库初始化成功 +2026-01-30 15:14:08 | INFO | main | 配置管理器初始化成功 +2026-01-30 15:14:08 | INFO | main | 流管理器初始化成功 +2026-01-30 15:14:08 | INFO | main | 图像预处理器初始化完成: 输入尺寸 480x480, Batch大小 1-8, FP16模式 True +2026-01-30 15:14:08 | INFO | main | 预处理器初始化成功 +2026-01-30 15:14:08 | INFO | main | TensorRT引擎初始化配置: 模型=./models/yolo11n.engine, 输入尺寸=480x480, Batch=1, FP16=True +2026-01-30 15:14:08 | INFO | main | 连接事件: load - TensorRT -> ./models/yolo11n.engine +2026-01-30 15:14:08 | INFO | main | TensorRT引擎加载成功: ./models/yolo11n.engine +2026-01-30 15:14:08 | INFO | main | 引擎已加载: default +2026-01-30 15:14:08 | INFO | main | 推理引擎加载成功: ./models/yolo11n.engine +2026-01-30 15:14:08 | INFO | main | 后处理器初始化完成: NMS阈值=0.45, 置信度阈值=0.5 +2026-01-30 15:14:08 | INFO | main | 后处理器初始化成功 +2026-01-30 15:14:08 | INFO | main | 结果上报器初始化成功 +2026-01-30 15:14:12 | INFO | main | 算法管理器初始化成功 +2026-01-30 15:14:12 | INFO | main | 所有组件初始化完成 +2026-01-30 15:14:12 | INFO | main | 已启动 0 个视频流 +2026-01-30 15:14:12 | INFO | main | Edge_Inference_Service 已启动 +2026-01-30 15:14:21 | INFO | main | 收到信号 2, 正在停止服务... +2026-01-30 15:14:21 | INFO | main | 已停止所有视频流 +2026-01-30 15:14:21 | INFO | main | 已停止所有视频流 +2026-01-30 15:14:21 | INFO | main | TensorRT引擎资源已释放 +2026-01-30 15:14:21 | INFO | main | 所有引擎已释放 diff --git a/logs/main_error.log b/logs/main_error.log index 9b55ad8..bd1ed6c 100644 --- a/logs/main_error.log +++ b/logs/main_error.log @@ -159,3 +159,44 @@ Traceback (most recent call last): File "C:\Users\16337\miniconda3\envs\yolo\lib\socket.py", line 845, in create_connection sock.connect(sa) ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。 +2026-01-30 15:08:56 | ERROR | main | 算法管理器初始化失败: name 'threading' is not defined +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 124, in _init_algorithm_manager + self._algorithm_manager = AlgorithmManager() + File "C:\Users\16337\PycharmProjects\ai_edge\algorithms.py", line 267, in __init__ + self._update_lock = threading.Lock() +NameError: name 'threading' is not defined +2026-01-30 15:08:56 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:09:26 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:09:56 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:10:26 | ERROR | main | 心跳上报失败: 'ResultReporter' object has no attribute 'report_heartbeat' +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 374, in heartbeat + self._reporter.report_heartbeat("edge_inference_device", status) +AttributeError: 'ResultReporter' object has no attribute 'report_heartbeat' +2026-01-30 15:11:59 | ERROR | main | 算法管理器初始化失败: name 'logger' is not defined +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\algorithms.py", line 293, in start_config_subscription + redis_client = redis.Redis( +NameError: name 'redis' is not defined + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "C:\Users\16337\PycharmProjects\ai_edge\main.py", line 125, in _init_algorithm_manager + self._algorithm_manager.start_config_subscription() + File "C:\Users\16337\PycharmProjects\ai_edge\algorithms.py", line 313, in start_config_subscription + logger.error(f"启动配置订阅失败: {e}") +NameError: name 'logger' is not defined