一、对任务的理解
1、项目概述
本项目需要实现以嵌入式Web服务器为核心的视频监控系统。
摄像头采集的到的图像经过压缩后,传到内置的web服务器中。用户只需要通过浏览器就可以观看摄像头采集到的数据。
2、系统架构
该项目基本可以看作B/S架构,由有三部分组成:
(1)核心服务端:
其实是客户端(严格意义上说,PC上的浏览器才是客户端)一台普通的PC机,需要与前端数据中心在同一局域网中,然后通过浏览器对系统进行监控和设置。
(2)前端数据中心:
FS4412开发平台,可以连接摄像头、GPRS、zigBee、传感器、WIFI等模块。
(3)远程控制终端:
zigBee模块、摄像头等用来进行信息采集的设备。采集到的信息有前端数据中心进行处理。
3、其他注意事项
由于摄像头的问题,未实现使用摄像头监控,也未实现wifi模块,而是采用网线直连。
二、实现的任务
1、任务的划分
(1)环境搭建
(2)编译源码
(3)镜像烧写
(4)WIFI模块
(5)了解Web服务器的搭建与配置
2、个人实现与遇到的问题
(1)环境搭建
仅需在VMware Workstation Pro打开打开虚拟机即可
(2)编译源码
编译源码的环境是在Linux下,首先应先熟悉Linux终端的一些操作。
cd 进入一个目录 如cd /usr/local 或者是cd usr,用cd ..返回上一层。
利用tab来补全命令。
Mkdir 是一个用来在 Linux 系统下创建目录的命令。是一层一层的创建,可以创建后用cd打开然后创建。
cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。如cp/xx/xx ./是将文件拷贝到当前目录下。利用这两条指令以及cd指令拷贝源码。
编译源码需要修改环境变量,BootLoader编译,Linux内核编译,主应用程序编译,根文件系统镜像制作。
①完成bootloader的编译与SD bootloader的编译
②Linux内核的编译
下面是根据指导书进入Linux内核配置图形界面。
下面是用make工具完成zImage内核二进制文件的截图
等待片刻之后,linux内核编译完成
③ 主应用程序编译
直接用make工具即可
④ 根文件系统镜像制作
在制作根文件时需要将之前编译好的应用程序、驱动等项目拷贝到rootfs下。
(3)烧写镜像
①制作SD卡启动盘
用读卡器将SD卡插入电脑,虚拟机识别SD读卡器,将uboot烧写到sd卡,将SD卡插入开发板SD卡槽内,拨码至1000,连接开发板。在win上设置串口调试工具,选择Serial连接方式(如果不选择的话直接open会导致乱码,其中COMX由设备管理器看)。启动开发板,在倒计时5s结束前,按任意键停止。
②安装Fastboot
在安卓手机中fastboot是一种比recovery更底层的刷机模式。就是使用USB数据线连接手机的一种刷机模式。相对于某些系统(如ios)卡刷来说,线刷更可靠,安全。
在计算机属性下的系统属性,查看高级,选择环境变量,编译系统变量的path项,在变量值最后添加D:\Fastboot.使用win+r,输入cmd,输入fastboot测试是否安装成功。
在设备管理器中是否有Android,有则更新驱动,路径选择D:\Fastboot。
由于本机搜索不到Android,使用他人的计算机完成烧写。
③烧写到开发板的Flash
硬件连接后拨动至1000 ,设置串口工具后,启动开发板,按任意键暂停,输入sdfuse flashall。等烧写结束,关闭开发板,拨至0110,启动开发板,暂停。输入fdisk -c 0
对SD卡分区,输入fastboot,再执行flash-all.bat。
在cmd命令行中输入fastboot flash BootLoader u-boot-fs4412.bin完成烧写BootLoader。
在cmd命令行中输入fastboot flash kernel zimage完成烧写内核镜像zimage。
在cmd命令行中输入fastboot flash system system.img完成烧写根文件系统镜像。
(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>
<td width="130"><label>
<input name="username" type="text" id="username" value="user"></label></td>
</tr>
<tr>
</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>
处理。CGI程序和servlet比较接近。写法上与javascript相近。
打开login.cgi的源码
//login.c
cgiFormStringNoNewlines("username", name, N);
cgiFormStringNoNewlines("password", pw, N);
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;
}
user.db,如果打开失败就会看到网页上有Server is busy...字样。
sql中存放了一条select语句,sqlite3_get_table()`函数就是用来查询的,如果数据库出现问题,依然在网页上显示有Server is busy...
0,网页上显示Name or password error。
cgic.h头文件的实现文件cgic.h中找到。
//cgic.c
cgiIn = stdin;
cgiOut = stdout;
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`
网卡依然没有连接到手机热点上。
2、fastboot的驱动安装
安装fastboot驱动时,失败。
禁用驱动的强制签名
四、个人的体会
虽然已经有现成的源码,但是在真正的操作中还是遇到许多问题。
由于以前从未接触过Linux操作系统,首先先熟悉Linux的操作环境。在Linux的操作下,输入代码的时候需要注意是否有空格。例如cp/mnt/hgfs/share/fs4412/u-boot-2010.03-FS4412_V4.tar.xz ./的./其中与前面有空格意为拷贝到当前文件夹。以及sudo的权限问题。
在CGI中应用到许多以前的知识,如JavaScript,数据库,C等。还有许多陌生的知识如线程、锁、同步的概念。这些知识给理解代码上带来了很大的麻烦。