基于IMX6ULL的安防监控项目

项目功能介绍

        该项目是基于NXP的IMX6ULL的安防监控项目。应用http微服务器boa实现网页展示监控信息;利用ov5640摄像头模块采集图像信息,并移植mjpg-streamer库实现在远端网页可以查看实时监控图像;利用cgi与html交互实现控制命令的下发和监控数据上传,用户可以在网页端控制硬件,比如LED灯,蜂鸣器等,同时可以在网页端直观查看ICM20608获取的加速度、角速度和温度数据。

远端网页查看实时监控图像功能

        移植mjpg-streamer库,可以将ov5640摄像头采集的YUV格式视频数据在网页端实时显示:

                                               远端网页查看实时监控图像功能 (图1)

远端网页查看实时采集数据信息

                使用imx6ull的spi控制器驱动icm20608传感器,获取温度数据、三轴加速度和三轴角速度数据,并将信息展示在远端网页:

                                        远端网页查看实时icm20608采集数据信息(图2) 

网页远端控制硬件

        底层驱动实现后,可以从网页端发送命令。cgi与网页端数据交互,消息队列的方式发送命令给命令处理线程。相应的线程在获取命令后控制硬件,达到控制硬件的目的,可以根据需要添加其他功能。

                                                        网页远端控制硬件(图3) 

支持用户名密码登录

        网页端与cgi进行数据交互,cgi可以获取网页端输入的用户名以及密码数据,并与正确的密码数据进行匹配。如果匹配成功则进行网页跳转进行选择,匹配失败则显示密码错误退出。

基于IMX6ULL的安防监控项目_第1张图片

                                                支持用户名密码登录(图4)

项目框架及原理

        项目框架图如下:

基于IMX6ULL的安防监控项目_第2张图片

                                                                         项目框架(图5)

        远端pc浏览器访问固定ip和端口,boa服务器会将index.html网页回发,浏览器会解析html文件显示该登录界面。应用boa服务器,cgi与html进行信息交互。cgi中将获取html命令使用消息队列方式下发命令到接收用户线程,接收用户线程改变共享内存里的flag并用互斥锁以及条件变量的方式通知LED线程处理。数据刷新线程会去获取传感器数据,并刷新到共享内存中。cgi可以从共享内存获取icm20608的温度、三轴加速度数据等,并将数据刷新到网页。mjpeg-streamer进程控制ov5640摄像头传感器采集YUV视频数据,并将数据刷新到网页。

项目网页端实现

        该项目网页端主要是利用boa服务器实现的,一种微型的http服务器,里面可以使用cgi和html进行数据交互,并控制网页的跳转和显示。比如将数据刷新网页部分代码如下。

CGI部分代码

fprintf(cgiOut, " \n ");
fprintf(cgiOut, "

Home1 Real-time Environment Info:

\n "); fprintf(cgiOut, "

\n "); fprintf(cgiOut, "

ICM20608传感器数据显示部分

\n "); fprintf(cgiOut, "

Temperature:\t%0.2f ℃

\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.temperature ); fprintf(cgiOut, "

GYROX:\t%0.2f rad/s

\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.gyrox); fprintf(cgiOut, "

GYROY:\t%0.2f rad/s

\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.gyroy); fprintf(cgiOut, "

GYROZ:\t%0.2f rad/s

\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.gyroz); fprintf(cgiOut, "

AACX :\t%0.2f g

\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.aacx); fprintf(cgiOut, "

AACY :\t%0.2f g

\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.aacy); fprintf(cgiOut, "

AACZ :\t%0.2f g

\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.aacz); fprintf(cgiOut, "

IMX6ULL-RESERVED[0]:\t%d

\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.reserved[0]); fprintf(cgiOut, "

IMX6ULL-RESERVED[1]:\t%d

\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.reserved[1]); fprintf(cgiOut, "

......

\n ");

         比如cgi控制网页跳转,如下:

cgiHeaderContentType("text/html\n\n");
fprintf(cgiOut, "\n");
fprintf(cgiOut, "My CGI\n");
fprintf(cgiOut, "");

fprintf(cgiOut, "

send sucess

"); fprintf(cgiOut, "", sto_no[0]); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n");

 网页端遇到的问题

        这个问题是boa的配置文件boa.conf文件中指定了cgi文件的存放路径,这里是把cgi文件放到了指定文件存放路径之外,这就导致boa服务即使找到该文件也会认为该文件是普通文件,而是去下载该文件,而不是去执行文件。解决方法是把cgi文件移动到bao.conf指定目录下,并在html文件跳转目录也指定到该目录,问题解决。

项目后端数据采集

mjpg-streamer移植过程问题

问题1:

基于IMX6ULL的安防监控项目_第3张图片

        该问题是虽然找到了动态库文件,但动态库格式不对,后面发现这个动态库是X86平台下的。为什么会出现这个低级错误,是因为下载的mjpg-streamer源码不仅在顶层Makefile中指定编译器gcc,在其他目录都指定了一遍,实在无语。以为在顶层目录的改成交叉编译器就可以了,这就拷贝过去存在问题。解决方法是把其他目录的Makefile都改成交叉编译,问题解决。

问题2:

基于IMX6ULL的安防监控项目_第4张图片

         这个问题是这边使用的摄像头是YUV格式的,需要在脚本目录加‘-n -y’,比如

        也可以用-r指定采集分辨率,如果摄像头支持该分辨率。 

问题3:

基于IMX6ULL的安防监控项目_第5张图片

        去掉https的s再去访问固定IP和端口问题解决。 

项目总结与展望

        该项目主要应用的技术是boa服务器的移植及使用,mjpg-streamer库的移植,该库是控制摄像头数据采集的神器,在需要使用使用摄像头的地方可以将部分代码移植过来使用。使用到了多线程技术,还有进程间通信的消息队列,还有进程的同步与互斥机制互斥锁和条件变量的使用。在底层需要LED灯与蜂鸣器的驱动代码,还有ov5640摄像头驱动的移植。当然,在这个项目的基础上可以增加其他功能,比如温湿度,烟雾报警、光传感器等等。就是在该基础上增加传感器的驱动以及处理逻辑,问题不大。

项目代码

        这里提供项目代码以及相关库源码:

通过网盘分享的文件:Security_monitoring.tar.gz
链接: https://pan.baidu.com/s/1HJUq2pgzEhs44SyayU4w2g?pwd=a11n 提取码: a11n 

你可能感兴趣的:(linux)