20155114许星霖《远程安防监控系统》课程设计个人报告
一、对任务的理解
1、项目概述
本项目需要实现以嵌入式Web服务器为核心的视频监控系统。
摄像头采集的到的图像经过压缩后,传到内置的web服务器中。用户只需要通过浏览器就可以观看摄像头采集到的数据。
2、系统架构

(1)核心服务端:
其实是客户端(严格意义上说,PC上的浏览器才是客户端)一台普通的PC机,需要与前端数据中心在同一局域网中,然后通过浏览器对系统进行监控和设置。
(2)前端数据中心:
(3)远程控制终端:
3、其他注意事项
二、实现的任务
1、任务的划分
(1)环境搭建
(2)编译源码
(3)镜像烧写
(4)WIFI模块
(5)了解Web服务器的搭建与配置
2、个人实现与遇到的问题
(1)环境搭建
(2)编译源码
①完成bootloader的编译与SD bootloader的编译

②Linux内核的编译



③ 主应用程序编译
直接用make工具即可

④ 根文件系统镜像制作

(3)烧写镜像
①制作SD卡启动盘
②安装Fastboot


③烧写到开发板的Flash


(4)WIFI模块
我们采用网线直连代替WIFI模块。
将win主机下配置网络

(5)了解Web服务器的搭建与配置
①BOA搭建
BOA 服务器是一个小巧高效的web服务器,是一个运行于unix或linux下的,支持CGI的、适合于嵌入式系统的单任务的http服务器,源代码开放、性能高。BOA服务器主要功能是在互联嵌入式设备之间进行信息交互,类似于tomcat对于web编程的作用。
②cgi
CGI是外部应用程序(CGI程序)与WEB服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的过程。
文件系统rootfs的www目录下,存放web服务器html,css,js和cgi程序的地方。先看index.html,即登录的表单部分。
<form name="form1" method="post" action="cgi-bin/login.cgi">
<table width="100%" border="0" cellspacing="9" cellpadding="0">
<tbody>
<tr>
<td width="92">用户帐号:</td>
<td width="130"><label>
<input name="username" type="text" id="username" value="user"></label></td>
</tr>
<tr>
<td>登录密码:</td>
<td>
<label>
<input name="password" type="password" id="password" value="123456">
</label>
</td>
</tr>
<tr>
<td height="25"></td>
<td><input type="image" name="submit" style="width:97px;height:25px;" src="images/login/go.gif"></td>
</tr>
</tbody>
</table>
</form>
这个表单的数据会提交给login.cgi这个程序去处理。CGI程序和servlet比较接近。写法上与javascript相近。
打开login.cgi的源码
//login.c
cgiFormStringNoNewlines("username", name, N);
cgiFormStringNoNewlines("password", pw, N);
这两条语句将username和password分别放到char数组name和pw中,接下来到数据库里查询。
//login.c
if(sqlite3_open("/user.db", &db) != SQLITE_OK)
{
fprintf(cgiOut, "<BODY>");
fprintf(cgiOut, "<H1>%s</H1>", "Server is busy...");
fprintf(cgiOut, "<meta http-equiv=\"refresh\" content=\"1;url=../index.html\">");
return -1;
}
sprintf(sql, "select * from usr where name='%s' and password='%s'", name, pw);
if(sqlite3_get_table(db, sql, &result, &row, &column, NULL) != SQLITE_OK)
{
fprintf(cgiOut, "<BODY>");
fprintf(cgiOut, "<H1>%s</H1>", "Server is busy...");
fprintf(cgiOut, "<meta http-equiv=\"refresh\" content=\"1;url=../index.html\">");
sqlite3_close(db);
return -1;
}
if(row == 0)
{
fprintf(cgiOut, "<BODY>");
fprintf(cgiOut, "<H1>%s</H1>", "Name or password error");
fprintf(cgiOut, "<meta http-equiv=\"refresh\" content=\"1;url=../index.html\">");
sqlite3_close(db);
return 0;
}
sqlite3_open()`函数用来打开数据user.db,如果打开失败就会看到网页上有Server is busy...字样。
char数组sql中存放了一条select语句,sqlite3_get_table()`函数就是用来查询的,如果数据库出现问题,依然在网页上显示有Server is busy...
如果在数据库里找不到对应的用户,变量row的值就是0,网页上显示Name or password error。
代码里的cgiOut可以在cgic.h头文件的实现文件cgic.h中找到。
//cgic.c
cgiIn = stdin;
cgiOut = stdout;
cgiOut就是标准输出。登录成功后,会跳转到主页面main.html。
三、遇到的问题
1、WIFI模块无法使用
原本这个系统是通过WIFI来访问并进行控制的,但是我们的WIFI模块出现了问题,现在只能用网线直连的方式控制系统。
我们将手机热点配置为my\_accent,密码设为012345678,在rootfs/etc中添加配置文件wpa-spk-tkip.conf。
# WPA-PSK/TKIP
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="my_accent"
key_mgmt=WPA-PSK
proto=WPA
pairwise=CCMP
group=CCMP
psk="012345678"
}
更新文件系统以后重新烧写镜像,配置IP和网关后,执行命令`wpa_supplicant -B -i wlan0 -c /etc/wpa-psk-tkip.conf`

wlan网卡依然没有连接到手机热点上。
2、fastboot的驱动安装
安装fastboot驱动时,失败。

禁用驱动的强制签名
四、个人的体会
由于以前从未接触过Linux操作系统,首先先熟悉Linux的操作环境。在Linux的操作下,输入代码的时候需要注意是否有空格。例如cp/mnt/hgfs/share/fs4412/u-boot-2010.03-FS4412_V4.tar.xz ./的./其中与前面有空格意为拷贝到当前文件夹。以及sudo的权限问题。
在CGI中应用到许多以前的知识,如JavaScript,数据库,C等。还有许多陌生的知识如线程、锁、同步的概念。这些知识给理解代码上带来了很大的麻烦。
五、参考资料
《远程安防监控系统项目文档》华清远见教育集团研发中心
https://www.shiyanlou.com/courses/1

浙公网安备 33010602011771号