移动物体监控系统-sprint4嵌入式web服务器开发
一、BOA嵌入式服务器的移植
step1:下载BOA服务器并解压,进入boa下面的src目录,执行./configure生成必须的配置文件以及Makefile
step2:修改Makefile文件
cc=arm-linux-gcc
cpp=arm-linux-gcc -E
step3:编译make
编译时出错:util.c:100:1:error:posting "t" and "->" does not give a vaild preprocessing token
将util.c文件中 time-offset=TIMEZONE_OFFSET(t) 注释掉,改为time_offset=0;
step3:将编译生成的boa可执行文件拷贝到根文件系统的/sbin/目录中
step4:配置BOA
将boa.conf拷贝到根文件系统的/etc/boa目录下。改变的配置项:
a.DocumentRoot /web/指明开发板网页路径
b.user Group 注释掉
c.Mime Type 媒体文件 设置为 /dev/null
d.Errorlog 错误日志文件 设置为 /dev/null(设置为/dev/consoce表示错误打印到终端)
e.Access log 访问日志 设置为/dev/null
step5:开发板运行"#boa",浏览器登录开发板IP-192.168.19.127,即可登录嵌入式web服务器的网页设计界面。
二、CGI快速入门-网页控制
控制流程:1、用户浏览器---(请求连接)--->web服务器 (web服务器包括a.供浏览器登录的网页界面程序,b.共服务器调用的CGI程序(扩展服务器功能));
2、浏览器登录的微博服务器指定的网页界面,给予指令-->调用设定CGI程序进行控制;
3、获取的返回结果->web服务器发送到网络中,用户即可通过浏览器远程获取数据信息。
三、CGIC库移植
step1:解压CGIC库
step2:修改Makefile
cc=arm-linux-gcc
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
arm-linux-gcc cgictest.o -o cgictest.cgi ${LIBS}
arm-linux-gcc capture.o -o capture ${LIBS}
step3:拷贝libcgic.a到根文件系统中
step4:BOA配置文件修改(boa.conf)
scriptAlias /cam/ /web/cam/ (指明CGI程序路径)
step5:运行boa程序,在pc的浏览器上输入开发板IP地址 /cam/cgictest.cgi,网页正常打开则表明boa和cgic移植成功。
四、CGI程序设计
其中,网页界面.html、获取监控图片和视频的cgi程序开发
step1:网页界面在原有的indx.html中修改
<a class="menu" href="/cam/image.cgi"> //获取图片的程序,跳转运行/CGI程序
step2:CGI程序:主程序cgiMain()下
1、print_file(cgiOut,"../top.html"); //加头,将top.html内容打印到cgiOut
2、total = list_pic("/mnt/sd","jpg"); //将图片加入显示列表
3、if (cgiFormSubmitClicked("gopage") == cgiFormSuccess) //处理用户的选择请求
4、show_pic(start,end,total); //显示图片
5、print_file(cgiOut,"../bottom.html"); //加尾,将bottom.html内容打印到cgiOut
step3:编译生成.cgi文件 arm-linux-gcc -L ./cgic205/ -lcgi -I ./cgic205/image.c -o image.cgi
step4:获取视频的程序开发
(1)<a class="menu" href="/cam/movie.cgi">
(2)fprintf(cgiOut, "<embed src = \" / sd / % s\" autostart = true loop = true width = \"640\" height =\"480\">< / embed>","01-19700101000405.avi");
在index.html中添加语句(1)
建立movie.c中添加语句(2),编译 arm-linux-gcc -L ./cgic205/ -lcgi -I ./cgic205/movie.c -o movie.cgi
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <cgic.h>
#include <dirent.h>
#include <string.h> struct pic_list
{
char name[];
}g_img[]; //加头,将top.html内容打印到cgiOut
void print_file(FILE *dst_fp,const char *src)
{
FILE* src_fp;
char line[]; src_fp = fopen(src, "r");
while (NULL != fgets(line, , src_fp))
fputs(line, dst_fp);
fclose(src_fp);
} int cmp_sfc(const char* fn,const char *sf)
{
char* tfn = (char*)fn;
for (; *tfn != '.' && *tfn != ; tfn++)
if (*tfn == )
return -;
tfn++; return strcmp(tfn, sf);
} //
int list_pic(const char* path,const char *sfx)
{
//遍历/mnt/sd目录,将所有的图片文件的名字加入列表
DIR* dir;
struct dirent* ptr;
int i = ; //1、打开目录
dir = opendir(path); //2、读取目录中一个文件
while ((ptr = readdir(dir)) != NULL)
{ //3、判断该文件的后缀是否为jpg
if ( == cmp_sfc(ptr->d_name, sfx))
{
//4、如果是图片,将其文件名加入列表
strcpy(g_img[i].name, ptr->d_name);
i++;
}
} return i; } //显示图片
void show_pic(int start, int end, int total)
{
int i,j = ; fprintf(cgiOut, "<tr>");
fprintf(cgiOut, "<td align=center>");
fprintf(cgiOut, "<table border=\"1\">"); for (i = start; i < end + ; i++)
{
if ((j % ) == )
{
fprintf(cgiOut, "<tr>");
fprintf(cgiOut, "<td>");
}
j++; fprintf(cgiOut, "<img src = \"/sd/%s\" width =\"160\" height = \"120\" / >", g_img[i].name); if ((j % ) == )
{
fprintf(cgiOut, "<tr>");
fprintf(cgiOut, "<td>");
}
}
fprintf(cgiOut, "</table>");
fprintf(cgiOut, "<p class=\"little\">-- 第%d页 共%d页 --</p>", start / + , total % ? total / + : total / );
fprintf(cgiOut, "</td>");
fprintf(cgiOut, "</tr>");
} //界面选择
void show_select_form(int total)
{
int i, pgn; pgn = total / ; if (total % )
pgn++; fprintf(cgiOut, "<tr>");
fprintf(cgiOut, "<td align=center>"); fprintf(cgiOut, "<br><form>");
fprintf(cgiOut, "转到第");
fprintf(cgiOut, "<select name=\"selectpage\">");
for (i = ; i < pgn; i++)
fprintf(cgiOut, "<option value=\"opt%d\">%d</option>", i, i + ); fprintf(cgiOut, "</select>");
fprintf(cgiOut, "页 ");
fprintf(cgiOut, "<input type=\"submit\" name=\"gopage\" value=\"go\"/>");
fprintf(cgiOut, "<form>"); fprintf(cgiOut, "</td>");
fprintf(cgiOut, "</tr>");
} int cgiMain()
{
int fd;
int led_control, led_state;
char *data;
int start, end, total;
start = ;
end = ; //3、结果显示信息 //加头
print_file(cgiOut, "../top.html"); //将图片加入显示列表
total=list_pic("/mnt/sd","jpg"); //处理用户的选择请求
if (cgiFormSubmitClicked("gopage") == cgiFormSuccess) { int i, sel;
char** optlist;
char tmp[]; optlist = (char**)malloc(sizeof(char*) * total); for (i = ; i < total; i++)
{
sprintf(tmp, "opt%d", i);
optlist[i] = strdup(tmp);
} cgiFormSelectSingle("selectpage", optlist, total, &sel, ); start = sel * ;
end = start + ;
end = total < end ? total : end;
//fprintf(cgiOut, "<p>s=%d, e=%d</p>", start, end); free(optlist);
} //显示图片
show_pic(start,end,total);
show_select_form(total); //加尾
print_file(cgiOut, "../bottom.html");
return ;
}
移动物体监控系统-sprint4嵌入式web服务器开发的更多相关文章
- 阶段2-新手上路\项目-移动物体监控系统\Sprint1-声音报警子系统开发\第1节-Sprint Backlog规划
根据之前的sprint1-声音报警子系统是相对比较大的一个需求,需要把它进一步细化,然后指定sprint Backlog product Backlog是整个产品的功能列表! sprint Backl ...
- 嵌入式web服务器BOA的移植及应用
嵌入式web服务器子系统 一.嵌入式web服务器的控制流程 如下图所示,嵌入式web服务器可实现通过网络远程控制嵌入式开发板,便捷实用. 控制流程:浏览器 --->>>嵌入式开发板 ...
- 学号20145332 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验
实验目的 掌握在 ARM 开发板实现一个简单 WEB 服务器的过程. 学习在 ARM 开发板上的 SOCKET 网络编程. 学习 Linux 下的 signal()函数的使用. 实验内容 学习使用 s ...
- 三种嵌入式web服务器(Boa / lighttpd / shttpd)的 linux移植笔记
一:移植Boa(web服务器)到嵌入式Linux系统 一.Boa程序的移植 1.下载Boa源码 下载地址: http://www.boa.org/ 目前最新发行版本: 0.94.13 ...
- 20145216 20145330 《信息安全系统设计基础》 实验五 简单嵌入式WEB 服务器实验
20145216 20145330 <信息安全系统设计基础> 实验五 简单嵌入式WEB 服务器实验 实验报告封面 实验步骤 1.阅读理解源码 进入/arm2410cl/exp/basic/ ...
- 20145208《信息安全系统设计基础》实验五 简单嵌入式WEB 服务器实验
20145208<信息安全系统设计基础>实验五 简单嵌入式WEB 服务器实验 20145208<信息安全系统设计基础>实验五 简单嵌入式WEB 服务器实验
- 20145210 20145226 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验
20145210 20145226 <信息安全系统设计基础>实验五 简单嵌入式WEB服务器实验 结对伙伴:20145226 夏艺华 实验报告封面 实验目的与要求 · 掌握在ARM开发板实现 ...
- 20145221 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验
20145221 <信息安全系统设计基础>实验五 简单嵌入式WEB服务器实验 实验报告 队友博客:20145326蔡馨熠 实验博客:<信息安全系统设计基础>实验五 简单嵌入式W ...
- 在Win7系统中搭建Web服务器
局 域网Web服务器的主要功能是实现资源共享,同时借助于局域网服务器访问页面可有效的实现信息的同步.利用Web服务器,我们随时随地都可以将自己的信息 上传到服务器端,让其它关注你的用户能在第一时间内了 ...
随机推荐
- Django setting设置 常用设置
目录 Django配置文件基本设置 前言 setting配置汇总 一.APP路径 二.数据库配置 三.sql语句展示 四.静态文件目录 五.media文件配置 六.数据库中的UserInfo(用户表) ...
- Scala 基础(十二):Scala 函数式编程(四)高级(二)参数(类型)推断、闭包(closure)、函数柯里化(curry)、控制抽象
1 参数(类型)推断 参数推断省去类型信息(在某些情况下[需要有应用场景],参数类型是可以推断出来的,如list=(1,2,3) list.map() map中函数参数类型是可以推断的),同时也可以 ...
- Django框架10 /sweetalert插件、django事务和锁、中间件、django请求生命周期
Django框架10 /sweetalert插件.django事务和锁.中间件.django请求生命周期 目录 Django框架10 /sweetalert插件.django事务和锁.中间件.djan ...
- 02-flask项目创建及debug模式的开启
一.flask文件的创建 打开pycharm,选择flask文件,选择相关配置,需要配置的有虚拟环境,flask文件名.如下图所示: 新建的flask文件如下所示: static:用来存放静态文件,包 ...
- MySQL事物原理及事务隔离级别
mysql事物 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取.事务的正确执行使得数据库从一种状态转换为另一种状态. 事务必须服从ISO/IEC所制定的ACID原则.AC ...
- 实践使用nodejs获取用户真实IP?
先上代码 var http = require('http') var server = http.createServer(function (req,res) { console.log(req. ...
- 洛谷P2365/5785 任务安排 题解 斜率优化DP
任务安排1(小数据):https://www.luogu.com.cn/problem/P2365 任务安排2(大数据):https://www.luogu.com.cn/problem/P5785 ...
- P4017 最大食物链计数 (拓扑排序)
看到拓扑排序感觉非常遥远的复杂,不喜欢图.看了拓扑排序的原理,很像广搜. 以本题样例为例: 了解一下 出度 和 入度 5的出度为3 入度为 0 ,3的出度为2 入度为2…… for循环 找到秃头 5 ...
- P.SDA1.DEV - 一个没有服务器的图床
图床特色 P.SDA1.DEV的愿景是为大家提供一个免费.长期稳定外链分享图片的选择. P.SDA1.DEV的主要特点有: 完全建构在Serverless云服务上,致力于提供(墙外)可用性99.9%的 ...
- 【Nginx】如何使用Nginx实现MySQL数据库的负载均衡?看完我懂了!!
写在前面 Nginx能够实现HTTP.HTTPS协议的负载均衡,也能够实现TCP协议的负载均衡.那么,问题来了,可不可以通过Nginx实现MySQL数据库的负载均衡呢?答案是:可以.接下来,就让我们一 ...