
Sstv backpack
vaugerbird/sstv-backpack
A ESP32-CAM SSTV backpack for the Baofeng UV-5R + others!

AquaSentinel 是面向泳池、游泳馆和水上场馆的实时 AI 安全监控系统。系统围绕“视频采集、AI 检测、告警生成、实时推送、现场处置、记录追踪”构建完整闭环,用于降低水域安全监控中的发现延迟、告警分发延迟和处置追踪成本。
Aquasentinel hardware is an open-source printed circuit board by Adcage, from the Adcage/AquaSentinel repository on GitHub. It is a 2-layer board with 13 parts on 52 nets, routed with 1 track and 0 vias.
It is built around the ESP32-CAM. Its parts include 8 connectors, 2 capacitors, 2 resistors and 1 switch. It belongs with the ESP32, STM32 and RISC-V boards of this library.
AquaSentinel 是面向泳池、游泳馆和水上场馆的实时 AI 安全监控系统。系统围绕“视频采集、AI 检测、告警生成、实时推送、现场处置、记录追踪”构建完整闭环,用于降低水域安全监控中的发现延迟、告警分发延迟和处置追踪成本。
| 亮点 | 说明 |
|---|---|
| 端到端安全监控闭环 | 从摄像头或 ESP32-CAM 视频采集开始,经过 AI 检测、告警落库、Web/Android 实时推送,最终进入确认、派发、处置和记录追踪流程。 |
| 视频网关与业务系统解耦 | video-hub-service 独立承担 RTSP、HTTP-MJPEG、HTTP-FLV、WebRTC、ESP32 WebSocket 推帧等视频接入和分发能力,Backend 聚焦权限、配置和业务编排。 |
| AI 检测与跟踪链路 | yolo-service 基于 YOLOv8 执行人体目标检测,结合 DeepSort 多目标跟踪和溺水规则判定,输出结构化检测事件和风险信息。 |
| 多端实时协同 | Backend 统一接收 AI 推送并进行告警落库、状态管理和权限过滤,再通过 WebSocket 分发给 Web 管理后台与 Android 救生员端。 |
| 软硬件联动 | ESP32-CAM 负责摄像头采集、网络推帧和 HTTP 控制入口,STM32 负责双轴云台、OLED 状态展示、按键交互、电池采样和校准参数保存。 |
| 工程化治理 | 系统包含 JWT 鉴权、注解式权限控制、HMAC AI 回调校验、RabbitMQ 异步告警扩展、Prometheus 指标、OpenAPI 类型生成和统一响应信封。 |


系统按职责拆分为多个可独立运行的子项目:
| 模块 | 技术栈 | 核心职责 |
|---|---|---|
backend | Java 17 / Spring Boot / MyBatis-Plus / MySQL / Redis / WebSocket | 用户认证、权限控制、设备管理、告警落库、统计聚合、实时推送、业务 API |
frontend | Vue 3 / TypeScript / Vite / Pinia / Element Plus / ECharts | Web 管理后台、设备监控、告警处置、数据看板、地图展示、AI 助手入口 |
yolo-service | Python / Flask / YOLOv8 / DeepSort / OpenCV / PyAV | 视频流推理、目标检测、轨迹跟踪、溺水规则判定、AI 结果推送 |
video-hub-service | Python / Flask / PyAV / aiortc / Redis Pub/Sub | 视频源接入、帧缓存、协议适配、MJPEG/Snapshot/WebRTC 分发 |
android | Kotlin / Jetpack Compose / Retrofit / OkHttp / Media3 | 救生员移动端、实时告警接收、视频预览、现场处置、定位能力 |
firmware | STM32 / ESP32-CAM / PlatformIO | 摄像头采集、云台控制、OLED 显示、设备侧交互和串口协议 |
详细架构说明见 系统架构文档。
摄像头、ESP32-CAM 或 RTSP 源输出视频后,由 video-hub-service 负责统一接入和协议适配。客户端不直接依赖底层视频源地址,而是通过 Backend 编排后的预览入口获取可播放的视频流。
摄像头 / ESP32-CAM / RTSP 源
-> video-hub-service
-> MJPEG / Snapshot / WebRTC / 预览地址
-> Frontend / Androidyolo-service 读取视频帧后执行 YOLOv8 目标检测,通过 DeepSort 为目标分配稳定轨迹,再由规则服务根据持续时间、目标状态和位置变化判断风险。
视频帧
-> YOLOv8 人体检测
-> DeepSort 多目标跟踪
-> 溺水规则判定
-> 检测事件 / 告警候选AI 服务通过 WebSocket 将检测结果推送到 Backend。Backend 统一进行告警记录、状态维护、权限过滤和多端分发,保证 Web 管理后台和 Android 端看到一致的告警状态。
YOLO Service
-> WebSocket
Backend
-> 落库 + 状态管理 + 权限过滤
Frontend 管理后台 / Android 救生员端
-> 确认、派发、处置、追踪视频预览如果直接放在 Backend 中处理,会让业务服务同时承担鉴权、CRUD、告警、转码和媒体分发职责。项目将视频流能力拆分到 video-hub-service,让 Backend 只负责配置、权限、路由和业务编排,视频网关负责拉流、缓存、协议适配和预览分发。
AI 检测不是一次性模型调用,而是持续运行的视频任务。yolo-service 对推理任务进行启动、运行、停止、异常等状态管理,并配套读帧、推理、推帧和状态维护逻辑,以适配长时间监控场景。
告警链路同时涉及 AI 服务、业务后端、Web 管理端和 Android 端。项目将 AI 结果接入与用户端告警分发拆为不同 WebSocket 通道,避免前端直接依赖 AI 服务,也让 Backend 可以统一处理告警状态、权限过滤和多端同步。
后端通过 Knife4j/OpenAPI 暴露接口规范,前端使用 openapi2ts 生成 API 调用代码和类型定义。业务页面通过 services/ 层消费生成接口,减少手写请求造成的字段不一致、路径漂移和响应结构误用。
Web 管理端适合场馆、设备、地图和统计管理,Android 端适合救生员现场接收和处置告警,硬件端负责视频采集与云台动作。系统通过统一 Backend 聚合设备、告警和处置状态,避免各端维护割裂的数据副本。
| 模块 | 功能 |
|---|---|
| 用户与权限 | 登录注册、JWT 鉴权、刷新令牌、角色权限、接口级权限校验 |
| 场馆管理 | 场馆、区域、摄像头、救生员等基础数据维护 |
| 视频监控 | 摄像头列表、实时预览、视频流路由、云台控制入口 |
| AI 检测 | 推理任务管理、检测结果上报、溺水规则判定 |
| 告警中心 | 告警生成、实时推送、确认、派发、处置、记录追踪 |
| 数据看板 | 告警统计、设备状态、场馆态势、图表展示 |
| 移动端 | 救生员登录、告警接收、视频查看、定位与现场处置 |
| 硬件联动 | ESP32-CAM 视频采集、STM32 云台控制、OLED 信息显示、电池状态采样 |
| 层级 | 技术 |
|---|---|
| Backend | Java 17 / Spring Boot 3.2.3 / MyBatis-Plus 3.5.5 / MySQL / Redis / JWT / WebSocket / RabbitMQ / Spring AI / Knife4j |
| Frontend | Vue 3 / TypeScript / Vite 7 / Pinia / Element Plus / ECharts / 高德地图 / openapi2ts |
| YOLO Service | Python / Flask / Flask-Smorest / SQLAlchemy / YOLOv8 / DeepSort / OpenCV / PyAV |
| Video Hub | Python / Flask / PyAV / aiortc / Redis Pub/Sub / MJPEG / Snapshot / WebRTC |
| Android | Kotlin / Jetpack Compose / Retrofit / OkHttp / Media3 ExoPlayer / Paging 3 / 高德 3D Map SDK |
| Firmware | STM32 / ESP32-CAM / PlatformIO / OLED / UART / PWM 云台控制 / KiCad |
完整技术栈说明见 技术栈说明。
docker compose up -dpwsh ./scripts/verify_core_stack.ps1详细启动步骤见 核心服务启动指南。
cd backend
mvn compile
mvn testcd frontend
npm install
npm run dev
npm run buildcd yolo-service
pip install -r requirements.txt
python main.py --dev
pytestcd android
./gradlew assembleDebug
./gradlew testAquaSentinel/
├── backend/ # Spring Boot 业务后端
├── frontend/ # Vue 3 管理后台
├── yolo-service/ # Flask + YOLOv8 AI 推理服务
├── video-hub-service/ # 视频流接入与协议适配服务
├── android/ # Jetpack Compose 移动端
├── firmware/ # STM32 / ESP32-CAM 硬件端代码
├── docs/ # 架构、部署、硬件、排障和归档文档
├── scripts/ # 启动、验证和辅助脚本
└── docker-compose.yml # 核心服务编排| Qty | Value | Footprint | References |
|---|---|---|---|
| 2 | 100k optional | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R1, R2 |
| 1 | 100uF/10V optional | Capacitor_THT:CP_Radial_D6.3mm_P2.50mm | C2 |
| 1 | 1S_LIION_BAT | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J2 |
| 1 | 470uF/10V optional | Capacitor_THT:CP_Radial_D10.0mm_P5.00mm | C1 |
| 1 | 5V_BOOST_OUT | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J1 |
| 1 | BAT_LEVEL_LED | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J3 |
| 1 | ESP32-CAM | AquaSentinelFootprints:ESP32_CAM_AI_Thinker_2x08_P22.86mm_Vertical_Labeled | J4 |
| 1 | SERVO_PAN_SG90 | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J6 |
| 1 | SERVO_TILT_SG90 | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J7 |
| 1 | SSD1306_OLED_I2C | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J8 |
| 1 | STM32F103C8T6_BLUEPILL | AquaSentinelFootprints:STM32_BluePill_2x20_P17.78mm_Vertical_Labeled | J5 |
| 1 | USER_HOME_CALIB | AquaSentinelFootprints:SW_PUSH_6mm_2Pin_LR | SW1 |

vaugerbird/sstv-backpack
A ESP32-CAM SSTV backpack for the Baofeng UV-5R + others!

Circuit-Digest/ESP32-Cam-Surveillance-Car
Watch full video on ESP32 surveillance car

InnoGreenTech/ESP32-CAM-pir-static-relay
ESP32-CAM mounting on a board with pir, photo-resistor sensors, AC/DC power and a static relay.


airsoftak25/Night-Gogle
My small project about creating a Night vision gogle witch cost less than 2000CZK each


dipenac/camara-esp32-espidf
- [x] Y dentro del folder de projects utilizamos una de las funciones que presta idf.py, con la cual creamos un projecto con el nombre que deseemos.

Engr-umer-mohammed/Lynx-30-Camera-Trap
Low-power long-range wireless camera trap designed using KiCad and Simulink.
13 parts, built around the ESP32-CAM. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the Adcage/AquaSentinel repository on GitHub, at the commit this page was made from: the board is firmware/hardware/aquasentinel-hardware.kicad_pcb and its schematic firmware/hardware/aquasentinel-hardware.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask Adcage before reusing the design.