# 基于gec6818的智能家庭视频监控系统 **Repository Path**: glddy/video_monitor ## Basic Information - **Project Name**: 基于gec6818的智能家庭视频监控系统 - **Description**: 一个基于嵌入式Linux平台的智能家庭视频监控系统。该系统实现了实时视频采集、网络传输和远程监控的完整功能。 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2025-10-19 - **Last Updated**: 2026-01-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于TCP/IP协议族智能家庭监控之视频监控系统 ## 项目概述 本项目是一个完整的智能家庭视频监控系统,基于GEC6818开发板和TCP/IP网络协议实现。系统包含三个核心功能模块: 1. **图片显示程序** - 使用文件IO接口读取BMP图片并显示到LCD屏幕 2. **视频流数据显示程序** - 使用V4L2接口获取摄像头数据并实时显示 3. **网络数据传输程序** - 使用TCP/IP协议实现视频流的网络传输 ## 系统架构 ``` ┌─────────────────────────────────────────────────────────┐ │ GEC6818开发板 (服务器端) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 摄像头 │──>│V4L2采集 │──>│YUYV->RGB │ │ │ │USB Video │ │640x480 │ │颜色转换 │ │ │ └──────────┘ └──────────┘ └────┬─────┘ │ │ │ │ │ ┌───────────────┼──────────────┐ │ │ ▼ ▼ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ │LCD显示 │ │TCP发送 │ │ │ │ │本地监控 │ │网络传输 │ │ │ │ └──────────┘ └────┬─────┘ │ │ │ │ │ │ └───────────────────────────────────┼────────────────┘ │ │ TCP/IP协议 │ 端口:8888 │ 视频流传输 │ ▼ │ ┌─────────────────────────────────────────────────────────┘ │ PC端 (客户端) │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │TCP接收 │──>│帧数据 │──>│保存图像 │ │ │视频流 │ │解析显示 │ │frame.ppm │ │ └──────────┘ └──────────┘ └──────────┘ └───────────────────────────────────────────────────────── ``` ## 技术特点 ### 1. 数据获取 (V4L2视频采集) - 使用Linux V4L2 (Video for Linux 2) 接口 - 支持YUYV格式视频流采集 - 分辨率: 640x480 - 帧率: 30fps - 4缓冲区MMAP内存映射机制 ### 2. 数据显示 (LCD实时显示) - YUYV到RGB888颜色空间转换 - 直接framebuffer显示 - 本地实时预览功能 - 支持任意位置显示 ### 3. 数据打包 (TCP协议封装) ```c 数据包结构: ┌─────────────────────────────────┐ │ 魔数 (0x12345678) - 4字节 │ │ 帧大小 - 4字节 │ │ 图像宽度 - 4字节 │ │ 图像高度 - 4字节 │ │ 图像格式 - 4字节 │ │ 时间戳 - 4字节 │ ├─────────────────────────────────┤ │ YUYV图像数据 (width*height*2) │ └─────────────────────────────────┘ ``` ### 4. 数据传输 (TCP/IP网络通信) - TCP可靠传输保证数据完整性 - 多线程支持多客户端同时连接 - 线程安全的摄像头访问控制 - 自动重连机制 ## 文件结构 ``` src/ ├── camera.h # 摄像头接口头文件 ├── camera.c # V4L2摄像头驱动实现 ├── video_server.c # 服务器端主程序 ├── video_client.c # 客户端主程序 ├── lcd.h / lcd.c # LCD显示接口 ├── bmp.h / bmp.c # BMP图片处理 ├── ts.h / ts.c # 触摸屏接口 ├── Makefile # 编译脚本 └── README.md # 本文档 ``` ## 编译说明 ### 前置要求 **服务器端 (GEC6818开发板):** - arm-linux-gcc 交叉编译工具链 - Linux内核V4L2支持 - pthread线程库 **客户端 (PC端):** - gcc编译器 - Linux/Unix系统 ### 编译步骤 ```bash # 1. 查看编译帮助 make help # 2. 编译服务器端 (ARM) make server # 3. 编译客户端 (x86) make client # 4. 同时编译服务器和客户端 make both # 5. 清理编译文件 make clean ``` ### 部署到开发板 ```bash # 方法1: 使用Makefile自动部署 make deploy BOARD_IP=192.168.1.100 # 方法2: 手动拷贝 scp video_server root@192.168.1.100:/root/ ``` ## 运行说明 ### 1. 启动服务器端 (在GEC6818开发板上) ```bash # 确保摄像头已连接 ls /dev/video* # 运行服务器 ./video_server # 输出示例: # ======================================== # 智能家庭视频监控系统 - 服务器端 # ======================================== # # [1/4] 初始化LCD显示... # [2/4] 初始化摄像头... # Camera: USB Camera # Camera initialized: 640x480 # Camera started # [3/4] 创建TCP服务器 (端口:8888)... # 服务器正在监听端口 8888... # [4/4] 启动本地显示线程... # # ======================================== # 系统运行中... # 按 Ctrl+C 退出 # ======================================== ``` ### 2. 启动客户端 (在PC上) ```bash # 连接到服务器 ./video_client 192.168.1.100 8888 # 输出示例: # ======================================== # 智能家庭视频监控系统 - 客户端 # ======================================== # # 正在连接服务器 192.168.1.100:8888... # 成功连接到服务器! # # ======================================== # 正在接收视频流... # 按 Ctrl+C 退出 # 每5秒保存一帧图像 # ======================================== # # [统计] 帧数: 150 | FPS: 29.85 | 分辨率: 640x480 | 格式: YUYV ``` ### 3. 查看保存的图像 客户端会每5秒保存一帧图像为PPM格式: ```bash # 查看保存的图像 ls frame_*.ppm # 使用图像查看器打开 display frame_0000.ppm # ImageMagick eog frame_0000.ppm # GNOME图像查看器 ``` ## 功能说明 ### 服务器端功能 1. **摄像头采集** - 自动检测 /dev/video0 设备 - 配置为YUYV格式, 640x480分辨率 - 30fps采集帧率 2. **本地显示** - LCD实时显示摄像头画面 - 独立显示线程,约20fps - 线程安全的帧访问 3. **网络传输** - TCP服务器监听8888端口 - 支持最多5个客户端同时连接 - 每个客户端独立传输线程 - 约30fps网络传输帧率 ### 客户端功能 1. **网络接收** - TCP连接服务器 - 可靠的数据包接收 - 自动解析帧头信息 2. **图像保存** - 每5秒保存一帧 - PPM格式(P6) - YUYV自动转换为RGB24 3. **统计信息** - 实时FPS显示 - 总帧数统计 - 分辨率和格式显示 ## 网络协议设计 ### 数据包格式 ```c typedef struct { unsigned int magic; // 魔数: 0x12345678 (用于验证) unsigned int frame_size; // 图像数据大小 (字节) unsigned int width; // 图像宽度 (像素) unsigned int height; // 图像高度 (像素) unsigned int format; // 格式: 0=YUYV unsigned int timestamp; // Unix时间戳 } frame_header_t; ``` ### 传输流程 ``` 客户端 服务器端 │ │ │──── TCP连接请求 ──────────> │ │<─── 连接确认 ─────────────── │ │ │ │ ┌─────────循环─────────┐ │ │ │ │ │ │<─┤ 1. 发送帧头(24字节) │─── │ │ │ │ │ │<─┤ 2. 发送图像数据 │─── │ │ │ (width*height*2) │ │ │ │ │ │ │ │ 3. 客户端处理显示 │ │ │ │ │ │ │ └──────────────────────┘ │ │ │ │──── 断开连接 ──────────────> │ ``` ## 常见问题 ### Q1: 找不到摄像头设备 ```bash # 检查摄像头是否连接 ls /dev/video* # 如果没有video0,检查USB连接 lsusb # 加载v4l2驱动 modprobe v4l2 ``` ### Q2: 编译错误 "linux/videodev2.h: No such file" ```bash # 安装V4L2开发库 sudo apt-get install libv4l-dev ``` ### Q3: 运行时提示 "Permission denied" ```bash # 添加执行权限 chmod +x video_server chmod +x video_client # 或使用root权限 sudo ./video_server ``` ### Q4: 客户端连接失败 - 检查开发板IP地址: `ifconfig` - 检查防火墙设置 - 确认服务器已启动 - 检查端口是否被占用: `netstat -an | grep 8888` ### Q5: 帧率较低 - 降低分辨率 (修改 FRAME_WIDTH 和 FRAME_HEIGHT) - 增加网络带宽 - 关闭本地显示功能 - 优化颜色转换算法 ## 性能参数 | 参数 | 数值 | | ---------- | -------- | | 视频分辨率 | 640x480 | | 视频格式 | YUYV | | 采集帧率 | 30fps | | 显示帧率 | 20fps | | 传输帧率 | 30fps | | 单帧大小 | 约614KB | | 网络带宽 | 约18MB/s | | 支持客户端 | 5个 | ## 扩展功能建议 1. **图像处理** - 添加人脸检测 - 移动检测报警 - 图像增强 2. **网络优化** - H.264视频编码压缩 - UDP实时传输 - P2P穿透 3. **用户界面** - Web界面访问 - 手机APP控制 - 多画面监控 4. **存储功能** - 录像存储 - 云端上传 - 移动侦测录像 ## 技术要点总结 ### 数据获取 (V4L2) - 打开设备: `open("/dev/video0")` - 查询能力: `VIDIOC_QUERYCAP` - 设置格式: `VIDIOC_S_FMT` - 请求缓冲: `VIDIOC_REQBUFS` - 内存映射: `mmap()` - 入队出队: `VIDIOC_QBUF / VIDIOC_DQBUF` ### 数据显示 (Framebuffer) - YUYV → RGB888 颜色转换 - RGB → ARGB8888 (LCD格式) - 直接内存访问显示 ### 数据打包 (协议设计) - 固定长度帧头 - 魔数验证机制 - 大小端处理 - 时间戳同步 ### 数据传输 (TCP/IP) - Socket编程 - 多线程并发 - 互斥锁同步 - 优雅断开 ## 项目总结 本项目完整实现了任务书要求的三大功能: ✅ **图片显示程序** - BMP图片解析与LCD显示 ✅ **视频流数据显示程序** - V4L2摄像头采集与实时显示 ✅ **网络数据传输程序** - TCP/IP视频流网络传输 通过本项目,学生可以掌握: - Linux系统编程 (文件IO、设备驱动) - 视频采集技术 (V4L2接口) - 网络编程 (TCP/IP、Socket) - 多线程编程 (pthread) - 嵌入式开发 (ARM交叉编译) ## 作者信息 - 课程: 网络程序设计实训 - 平台: GEC6818开发板 - 开发环境: VSCode + Linux - 编程语言: C语言 ## 参考资料 - [Linux V4L2 API文档](https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/v4l2.html) - [TCP/IP协议详解](https://www.tcpipguide.com/) - [GEC6818开发板手册](http://www.gec-edu.org/) - [Socket网络编程](https://beej.us/guide/bgnet/) --- **祝学习愉快! 如有问题请联系指导老师或查阅相关文档。**