移动物体监控系统-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服务器,我们随时随地都可以将自己的信息 上传到服务器端,让其它关注你的用户能在第一时间内了 ...
随机推荐
- Django2.0.6-Xadmin后台源码安装流程(python 3.8+django 2.0)
1. 命令行执行 pip install git+git://github.com/sshwsfc/xadmin.git@django2 2.修改url.py 3.修改setting.py 4.卸载x ...
- Maven 专题(六):Maven核心概念详解(二)
5 仓库 5.1 分类 [1]本地仓库:为当前本机电脑上的所有 Maven 工程服务.[2]远程仓库: (1)私服:架设在当前局域网环境下,为当前局域网范围内的所有 Maven 工程服务 ...
- linux专题(三):常用的基本命令(一)目录管理
http://dwz.date/UDf 绝对路径和相对路径 我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /. 其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们. 在开始 ...
- bzoj3621我想那还真是令人高兴啊
bzoj3621我想那还真是令人高兴啊 题意: T组数据,每组给出两个三角形各点坐标,要求求出一个点使第一个三角形可以绕这个点放缩和旋转得到另一个三角形.T≤10,坐标为≤10000的实数,数据保证三 ...
- Substance Designer学习资料参考及学习入门感受
先奉上大佬写的: 名称:Substance Designer 萌新入门流程 地址:https://zhuanlan.zhihu.com/p/56194917 作者:ShadowjackLeeSD小菜鸡 ...
- Laravel 5.4 使用 Mail 发送邮件获取验证码功能(使用的配置邮箱为126邮箱)
<?php namespace App\Modules\Liveapi\Http\Controllers\Personnel; use App\Modules\Liveapi\Http\Cont ...
- sqlserver安装出现找不到数据库引擎错误
sqlserver安装出现找不到数据库引擎错误 问题的解决 第一次安装SQL server,发现它较于Oracle,都有安装卸载十分麻烦的特点.刚开始安装,就让我频繁遇到这个“找不到数据库引擎”的错误 ...
- 推荐一款技术人必备的接口测试神器:Apifox
1. 背景 作为互联网行业技术从业者,接口调试是必不可少的一项技能,通常我们都会选择使用 Postman 这类工具来进行接口调试,在接口调试方面 Postman 做的确实非常出色.当然除了Postma ...
- 面试题三十:包含min函数的栈
定义一个栈的数据结构,请实现一个每次都能找到栈中的最小元素,要求时间复杂度O(1).意思就是说每次进栈出栈后,min函数总能在时间1的前提下找到.方法一:由于每次循序遍历栈的话时间复杂度为n,所以要想 ...
- Spring Security 实战干货:从零手写一个验证码登录
1. 前言 前面关于Spring Security写了两篇文章,一篇是介绍UsernamePasswordAuthenticationFilter,另一篇是介绍 AuthenticationManag ...