当前位置: 首页 > 编程日记 > 正文

thttpd服务器

1 引言

随着微处理器技术、计算机网络技术的进步,基于嵌入式WEB的网络数字视频监控系统逐渐得到了人们的广泛关注。把图像采集、视频压缩和WEB功能集中到一个体积很小的设备内,可以直接连入局域网和Internet,达到即插即用,省掉多种复杂的电缆,安装方便,用户也无须安装任何硬件设备即可观看,这使得由嵌入式网络视频监控服务器组成的监控网络组网和扩展都极为灵活方便。

 2  WEB服务器所在系统工作原理

如图1所示,系统有两种网络接入方式:通过PPPOE自动拨号,动态获取IP联入Internet;自定义静态IP连入局域网。

    之后,系统的整个工作流程包括两条主线:1.通过HTTP/TCP/IP方式,解析来自监控端的网页请求,包括:摄像机控制(云台上下左右、镜头光圈、缩放等等),数据库读写(视频参数如分辨率、亮色度、码流,画质),视频调度与传输(多个用户之间视频数据的发送停止及其相互协调,系统参数也放在这里)。

2.通过RTP/UDP/IP方式,为监控端提供所需的实时视频信息。RTP/UDP/IP的方式兼顾了视频传输的实时性与QoS保证。

3  WEB服务器的选择

根据工作原理的描述,WEB服务器处于整个系统核心的位置,需要解决的几个难点包括:

1.安全性。只有授权登陆用户才能进行系统配置(网络参数、视频特性等等)。普通用户只能简单监控。

2.流量控制。视频数据连续且大量,服务器应该具备一定的协调各路监控数据的能力。

3.实时性。对于监控端的web请求指令响应速度,特别是在高负荷的情况下。

4.性能。在多路监控请求同时存在的情况下,系统的响应速度。

5.支持串口命令。云台控制指令需要串口支持。

6.数据库交互。包括用户数据库,系统配置参数等等,都需要实现脱机保存。

uCLinux下,主要有3个Web Server:Httpd、Thttpd和BOA.Httpd是最简单的一个Web Server,它的功能最弱,不支持认证,不支持CGI(Common Gateway Interface,通用网关接口)。Thttpd和BOA都支持认证、CGI等,功能都比较全。BOA源代码开放、性能可靠、稳定性好,但是是一个单任务的Web服务器。所以,我们选择简单、小巧、易移植、快速和安全的Thttpd. Thttpd在默认的状况下,仅运行于普通用户模式下,从而能够有效地杜绝非授权的系统资源和数据的访问,同时Thttpd全面支持HTTP基本验证(RFC2617),可有效解决安全性的问题。

另外,Thttpd对于并发请求不使用fork()来派生子进程处理,而是采用多路复用(Multiplex)技术来实现,因此效能很高,可以有效提高系统的性能。

最后,Thttpd基于URL的文件流量限制,对于连续的视频流量控制而言是非常方便的,象Apache就必须使用插件实现,效率较Thttpd低。在Thttpd的官方网站上有一个与其他web server的对比图Benchmark.

综上所述,Thttpd在安全性、性能、流量控制等方面有效的满足系统需要,当然,实时性也得到很好的保证。下面,结合源码,首先实现Thttpd的基本功能,然后将视频数据转发、安全性、支持串口命令、数据库交互的实现完善起来。

4  Thttpd基本功能的实现

首先,确保在编译uCLinux内核的make menuconfig这一步,选中busybox中的Thttpd.

然后,根据需要,修改源码/user/thttpd下的config.h:#define DEFAULT_PORT   80 //服务器监听端口#define DEFAULT_DIR   /home/httpd //设定服务器根目录#define INDEX_NAME   index.html //设定访问服务器时的默认主页#define AUTH_FILE     passwd //授权用户数据库文件#define CGI_PATTERN   /cgi-bin/*.cgi //CGI的文件名格式#define CGI_PATH       /home/httpd/cgi-bin //CGI的所在目录

接下来,建立服务器根目录和文件目录:

由于uCLinux的根文件系统为ROM FS, 只读, 因此要在生成文件系统映像之前建立好其中的目录和文件。首先是Web服务器根目录, 再是根目录下的子目录:文件根目录和CGI程序目录。修改/vendor/Samsung/4510B/makefile文件, 在ROMFS_DIRS 列出的目录中增加home/httpd ( 服务器根目录和文件根目录),home/httpd/cgi-bin(CGI程序目录) .

最后,将监控系统相关的网页和CGI程序分别放在/vendor/Generic/httpd和/vendor/Generic/httpd/cgi-bin中,就可以随内核编译过程时自动复制到image的相关目录下。在/vendor/Samsung/4510B/rc中添加thttpd实现上电自动执行。

 5  HTTP基本验证(RFC2617)的实现

首先必须生成存放用户及其密码的数据库文件:由于Thttpd 在http验证的实现上基于b64_decode_table解密,因此需要提供相对应b64加密而成的数据库文件。然后,编译/user/ htpasswd.c,切换到相应目录下,执行。/htpasswd -c passwd root Adding password for root. New password:Re-type new password:

其中,-c表示创建一个名字为passwd的新的用户数据加密文件,同时第一个用户名为root.

之后,将passwd文件复制到/vendor/Generic/httpd下面,并且注意在thttpd/config.h中define的AUTH_FILE与passwd同名。至此,thttpd的http验证功能就顺利添加完成。

  6  视频调度与传输

在本系统中,模拟视频数据经过AD,采样等预处理进入支持MPEG4编码的ASIC芯片压缩后,打包发送的任务由Thttpd完成。

在多个监控端请求同时存在的情况下,指令响应本身Thttpd已经完成,所以我们只需要实现数据传输。

在main函数里Main loop开始之前依次执行get_device,driver_init,device_init和alloc_resource,interrupt_enable,device_start,视频流的编码压缩就开始了。添加定时器响应函数,(void) tmr_create((struct timeval*) 0, transfer_bitstream, (ClientData) mpeg4_fd, 0, 1 );其中mpeg4_fd,是编码芯片的设备描述符,transfer_bitstream为响应函数(内容略)。

然后,根据Thttpd连接请求的变化,在handle_read与handle_send中添加简单相应连接有效性判断的代码即可完成数据调度与传输的功能。

7  串口命令支持

云台控制指令的发送需要RS485的支持。

在thttpd.c的main函数里添加设备支持: 打开串口设备。

int com1fd = open(/dev/ttyS1,O_RDWR|O_NOCTTY);传输波特率的设定:tcgetattr(com1fd,&oldtio);cfmakeraw(&oldtio);cfsetispeed(&oldtio,B9600);cfsetospeed(&oldtio,B9600);tcsetattr(com1fd,TCSANOW,&oldtio);在libhttpd.c里包含定义云台信令的头文件后,在httpd_parse_request中添加如下代码,memcpy(cmd,YT_FOCUS_IN,YT_CMD_NUM);将web请求转换为对应的云台信令存储在cmd数组中,最后,由于uclinux把所有设备作为文件操作,所以可以通过write(com1fd,cmd,YT_CMD_NUM);将云台信令正确发出去。

 8  配置信息的保存(MTD驱动的实现)

uCLinux在arm上移植过程中,一般不采用FLASH文件系统,它是在Bootloader初始化系统并重映射内存后,由Bootloader将Kernel和根文件系统的映像从FLASH上直接复制到RAM uCLinux系统起始地址(0x8000),然后通过设定PC值将控制权交给uCLinux.

这种方式采用的是ROMFS文件系统,系统结构简单,实现方便,但ROMFS是只读文件系统。RAM盘虽可写但一旦掉电就会丢失内容。若想长久保存应用程序的配置文件可采用两种方法:一种是将FLASH 上划出几个固定的扇区可读可写,用以专门存放所有要用到的配置文件;另一种是建立可写的JFFS2 文件系统。前一种方法代码简单、灵活, 适用于不太频繁的文件写入。后一种实现起来也比较简单,但时间、空间等方面的代价要高于前一种,适用于非常频繁的文件写入(比如一分钟超过十次)。基于本系统中对配置数据存储的实时性要求不高,而嵌入式资源又十分宝贵,因此考虑采用第一种方法,这就是MTD(memory technology device内存技术设备)。MTD是用于访问memory设备(ROM、flash)的Linux的子系统。其所有源代码在/drivers/mtd子目录下。

由于MTD的主要目的是为了使新的memory设备的驱动更加简单,因为它介于特定的闪存设备和文件系统之间,可以理解为它在硬件和上层之间提供了一个抽象的接口。 所以硬件驱动程序不需要知道象JFFS2和FTL那样的用户模块使用的方法。所有它们真正需要提供的就是一组对底层闪存进行read、write和erase操作的简单例程,即/mtd目录下mtd-utils.c相应函数。将mtd-utils.c继承过来,另外,加上手工添加的flash分区表即可达到配置文件保存的目的。

本系统只有一片FLASH, 大小为2M.拟分区如下:name: bootloader (128KB),

size: 0x20000,

offset: 0x0,

mask_flags: MTD_WRITEABLE   // 只读分区

name: kernel & rootfs (1856KB),

size: 0x1D0000,

offset: 0x20000

name: system config (64KB),

size: 0x10000,

offset: 0x1F0000

将包含本分区表的文件放在drivers/mtd/map下,并修改相应的makefile使之编译时有效。

然后,选择适当的 MTD用户模块,启用对闪存的访问:MTD_CHAR和MTD_BLOCK.MTD_CHAR提供对闪存的原始字符访问,而MTD_BLOCK将闪存设计为可以在上面创建文件系统的常规块设备(象IDE磁盘)。与MTD_CHAR关联的设备是在/vendor/Samsung/4510B/makefile的DEVICES中添加mtd0,c,90,0、mtd1,c,90,2、mtd2,c,90,4,而与 MTD_BLOCK关联的设备是添加mtdblock0,b,30,0、mtdblock1,b,30,1、mtdblock2,b,30,2.

最后,需要将 MTD 子系统编译到内核中,即打开make menuconfig里MTD相关的选项。

因为要使用当中涉及多个配置文件,而读写FLASH 的速度较慢,故每次配置完成后不立即写入flash,而是先把配置文件存在thttpd代码开辟的临时数组里,然后一次性(比如重启前)写入指定的FLASH分区。

  9 配置信息的管理

系统第一次启动会加载一组默认配置,这是通过判断flash最后一个system config (64KB)分区是否未被初始化(全为1或0)来实现的。在thttpd.c的main函数,加入open(/dev/mtd2,O_RDWR)可打开mtdblock2.将drivers/mtd下mtd-utils.c复制到user/thttpd目录下,即可使用其中的一些函数方便的实现flash的read和write操作。

 10 结语

嵌入式系统Web server与CGI 技术结合使得对嵌入式系统的管理和使用更为简便直接。基于Web的视频监控系统是目前监控领域发展的主流和方向。本文根据监控系统对数据吞吐量和安全可靠性等各方面的实际要求,结合相关研究的新进展,深入讨论了web服务器在监控系统设计中的应用技巧,并详细做了实现上的阐述。对所有基于嵌入式web技术的监控系统的设计具有非常实际的指导作用。读者可在本文研究的基础上做进一步的完善。

相关文章:

链接产业 聚变未来 | 移动云区块链开发者论坛来了

有人认为,如果说蒸汽机释放了人们的生产力,电力解决了人们基本的生活需求,互联网改变了信息传递的方式,那么区块链作为构造信任的机器,将可能改变整个人类社会价值传递的方式。区块链已走进大众视野,成为社…

Bzoj4016: [FJOI2014]最短路径树问题

题面 传送门 Sol 先\(SPFA\)求出单源最短路&#xff0c;\(Bfs\)建出树&#xff0c;字典序可以用堆解决 然后就是点分治的一眼题 开桶记录到当前根经过边长度相同的最长路&#xff0c;记录它的长度 自己强行\(yy\)了一个这种类型的点分丑陋写法 # include <bits/stdc.h> #…

libevent源码深度剖析

原文地址&#xff1a;http://blog.csdn.net/sparkliang/article/details/4957667libevent源码深度剖析一——序幕张亮1 前言 Libevent是一个轻量级的开源高性能网络库&#xff0c;使用者众多&#xff0c;研究者更甚&#xff0c;相关文章也不少。写这一系列文章的用意在于&#…

元宇宙中可跨语种交流!Meta 发布新语音模型,支持128种语言无障碍对话

编译 | 禾木木出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;语言交流是人类互动一种自然的方式&#xff0c;随着语音技术的发展&#xff0c;我们可以与设备以及未来的虚拟世界进行互动&#xff0c;由此虚拟体验将于我们的现实世界融为一体。然而&#xff0c;语音技…

前端面试官,我为什么讨厌你。

近两年来&#xff0c;参加过的前端面试不下二十场了&#xff0c;吐槽一下。我所经历的&#xff0c;都是小公司&#xff0c;大公司的同学请无视。 招聘信息能否不要装逼&#xff1f;写一大堆你项目根本用不上的&#xff0c;来给谁看&#xff1f;我曾遇到上面写了一堆对js如何要求…

【ASP.NET Core】解决“The required antiforgery cookie xxx is not present”的错误

当你在页面上用 form post 内容时&#xff0c;可能会遇到以下异常&#xff1a; The required antiforgery cookie "????????" is not present. 咱们来重现一下错误。新建一个 ASP.NET Core 项目&#xff0c;模板选【空】就行了&#xff0c;这是老周最喜欢的项…

linux系统级别的能够打开的文件句柄的数file-max命令

简单的说, max-file表示系统级别的能够打开的文件句柄的数量, 而ulimit -n控制进程级别能够打开的文件句柄的数量.man 5 proc, 找到file-max的解释&#xff1a;file-max中指定了系统范围内所有进程可打开的文件句柄的数量限制(系统级别, kernel-level). &#xff08;The value …

这封以数字构写的蓝图,正在实现笔尖所触即世界

作者 | 贾凯强出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;一撇一捺&#xff0c;一勾一抹&#xff0c;笔走龙蛇&#xff0c;可见真意。笔者小时候字迹潦草&#xff0c;便总是抱怨为什么一定要写字好看&#xff1f;而如今计算机统治了世界&#xff0c;键盘和鼠标早…

Svn 笔记—— Hooks

pre-commit 钩子功能&#xff1a;[rootDa hooks]# cat /application/svndata/sadoc/hooks/pre-commit#!/bin/bash#Check message lenth ---更新版本时强制输入信息小于5个字符会退出REPOS"$1"TXN"$2"logmsgsvnlook log -t $TXN $REPOS |grep &q…

22.CSS边框与背景【上】

第十七章 CSS边框与背景【上】 一、声明边框 属性 值 说明 CSS版本 1、border-width 长度值 设置边框的宽度&#xff08;可选&#xff09; 1 2、border-style 样式名称 设置边框的样式&#xff08;必选&…

一致性 hash 算法( consistent hashing )

原文地址&#xff1a;http://blog.csdn.net/sparkliang/article/details/5279393consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出&#xff0c;目前在 cache 系统中应用越来越广泛&#xff1b; 1 基本场景 比如你有 N 个 cache 服务…

【json的使用】

1、json格式字符串&#xff1a;Java代码/** 操作成功 200 */ public static final String RESULT_SUCCESS "{\"code\":\"200\",\"message\":\"成功!\"}";复制代码2、解析json字符串&#xff1a;Java代码JSONObject object…

通过 for 循环,比较 Python 与 Ruby 编程思想的差别

作者 | Doug Turnbull译者 | 豌豆花下猫Python猫来源 | Python猫Ruby 与 Python 之间的差异在很大程度上可通过for循环看出本质。Python 拥有for语句。对象告诉for如何进行协作&#xff0c;而for的循环体会处理对象返回的内容。Ruby 则相反。在 Ruby 中&#xff0c;for本身&…

Blippar放大招,要开源其AR和计算机视觉技术

AR公司Blippar将向第三方开发者提供AR和计算机视觉技术API&#xff0c;来推动他们的AR商业应用解决方案的发展。 致力于用AR技术帮助一些大品牌进行品牌故事和消费者营销的AR公司Blippar&#xff0c;最近对外宣布&#xff0c;要将他们的AR和计算机视觉技术API&#xff0c;提供…

Linux CPU数量判断命令

其实只要 #include <unistd.h>long num sysconf(_SC_NPROCESSORS_ONLN); 便可以获得当前CPU的数量。。。 判断依据&#xff1a;1.具有相同core id的cpu是同一个core的超线程。2.具有相同physical id的cpu是同一颗cpu封装的线程或者cores。 英文版&#xff1a;1.Physical…

5月.CN域名注册量持续上涨至1199万个 净增14万

IDC评述网&#xff08;idcps.com&#xff09;06月11日报道&#xff1a;根据中国互联网络信息中心&#xff08;CNNIC&#xff09;最新公布的数据显示&#xff0c;在5月份&#xff0c;.CN域名总量持续增至11,990,264个&#xff0c;环比上月&#xff0c;净增143,346个&#xff0c;…

人工智能/云原生/数据科学/计算等方向内容整理志愿者招募了!

持续招募内容整理志愿者&#xff01;云原生、数据科学、AI、低代码、计算等方向&#xff0c;有意愿的小伙伴&#xff0c;欢迎识别二维码提前报名哦。我们将持续为爱学习、有时间的小伙伴&#xff0c;提供多重福利&#xff01;要求&#xff1a;1. 你需要具备一定学术背景&#x…

三个轻量级WebServer--lighttpd,thttpd,shttpd介绍

国内绝大部分的web server不是IIS就是Apache&#xff0c;而论市场占有率&#xff0c;我认为Apache是大赢家了&#xff0c;至少是占据了半壁江山。但除了IIS/Apache外&#xff0c;其实我们有很多选择&#xff0c;对于高负载/大并发的网站而言&#xff0c;高性能、轻量级的web se…

实验四 主存空间的分配和回收

实验四 主存空间的分配和回收 一、目的和要求 1.1. 实验目的 用高级语言完成一个主存空间的分配和回收程序&#xff0c;以加深对动态分区分配方式及其算法的理解。 1.2. 实验要求 采用连续分配方式之动态分区分配存储管理&#xff0c;使用首次适应算法、循环首次适应算法、最佳…

技术“摸鱼” 大神,国外小哥 5 年白拿 45 万工资!

整理 | 孙胜出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;自从2017年谷歌旗下的AlphaGo以3比0战胜柯洁后&#xff0c;“人工智能即将取代人类工作”一度成为人们热议的话题。然而最近一位国外小哥用他亲身经历告诉我们&#xff0c;虽然程序终将代替人类执行重复劳…

Python杂篇

一&#xff1a;文件保存 def save_to_file(file_name, contents):fh open(file_name, w)fh.write(contents)fh.close()save_to_file(mobiles.txt, your contents str)结果&#xff1a; 将字符串修改则覆盖原来的字符串 将字符串用变量替代 将 fh open(file_name, w)写的权限去…

整理了 70 个 Python 面向对象编程案例,怎能不收藏?

作者 | 周萝卜来源 | 萝卜大杂烩Python 作为一门面向对象编程语言&#xff0c;常用的面向对象知识怎么能不清楚呢&#xff0c;今天就来分享一波文章很长&#xff0c;高低要忍一下&#xff0c;如果忍不了&#xff0c;那就收藏吧&#xff0c;总会用到的在 Python 中创建一个类及其…

ionic中的ion-option-button

2019独角兽企业重金招聘Python工程师标准>>> 代码 <ion-option-button class"button-assertive" ng-click"df(itemData)">批准 </ion-option-button> 效果图 转载于:https://my.oschina.net/u/1416844/blog/465730

memset函数详细说明

1。void *memset(void *s,int c,size_t n)总的作用&#xff1a;将已开辟内存空间 s 的首 n 个字节的值设为值 c。2。例子#include <stdio.h>#include <string.h>void main(){char s[]"hello";memset(s,*,2);printf("%s",s);} 输出&#xff1a…

CES Asia专题|微鹅展示无线充电,智能手机的无线充电时代何时来临?

无线充电离商业化应用还有多远&#xff1f; 此前一直有传闻苹果在新一代iPhone上会推出无线充电&#xff0c;在CES Asia上&#xff0c;我们也看到了无线充电技术方案解决商微鹅带来的最新产品。 据了解&#xff0c;目前我们所说的无线充电其实是指近场无线充电&#xff0c;让充…

Linux下Socket编程

Linux下Socket编程 网络的Socket数据传输是一种特殊的I/O&#xff0c;Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket()&#xff0c;该函数返回一个整型的Socket描述符&#xff0c;随后的连接建立、数据传输等操作都是通过该Socket实现的。 什么…

看大众点评如何通过实时监控系统CAT打造7*24服务

为什么80%的码农都做不了架构师&#xff1f;>>> 看大众点评如何通过实时监控系统CAT打造7*24服务 2015-06-08 尤勇 高可用架构 https://github.com/dianping/cat 本文根据尤勇在【QCon高可用架构群】中的分享内容整理而成。 尤勇是大众点评网资深工程师&#x…

Python 快速实现分列转到行!

作者 | 黄伟呢来源 | 数据分析与统计学之美之前看到一篇文章&#xff0c;用Excel快速实现分列转到行的操做。数据源大致是这样的&#xff1a;基于此&#xff0c;我动起了一个念头&#xff1a;看看如何用Python快速实现这个操作。数据源已经构造好&#xff0c;咱们开干&#xff…

javabean属性的类型选择包装类还是基本数据类型

学生 参加考试&#xff0c;需要在表中存放分数score字段 &#xff0c;score是采用double 还是Double &#xff1f; 假如有个同学张三 没有参加考试&#xff0c;double 默认值 0 &#xff0c; Double 默认值 null 使用原始类型&#xff0c;无法区分0值没有数据&#xff0c;还是值…