交作业啦 ARM LINUX的网络监控系统 然后闭关4个月--复习
交完作业就去复习考研……从一年级进来就定位毕业了去找工作,现在却决定考研,4个月,但愿还来得及……
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579144.jpg
(原文件名:1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579145.jpg
(原文件名:2.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579146.jpg
(原文件名:3.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579147.jpg
(原文件名:4.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579148.jpg
(原文件名:5.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579149.jpg
(原文件名:6.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579150.jpg
(原文件名:7.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579151.jpg
(原文件名:8.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579152.jpg
(原文件名:9.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579153.jpg
(原文件名:10.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579154.jpg
(原文件名:11.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579155.jpg
(原文件名:12.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579156.jpg
(原文件名:13.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579157.jpg
(原文件名:14.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579158.jpg
(原文件名:15.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579159.jpg
(原文件名:16.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579160.jpg
(原文件名:17.jpg)
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_579161.jpg
(原文件名:18.jpg) 不错 很好! 很好!开源吧!~ 很强大 祝你考研成功! 看到了 阿莫电子邮购部~./emotion/em006.gif 回复【3楼】ljt8015
很好!开源吧!~
-----------------------------------------------------------------------
好像没什么好开的,改天我把那些脚本传上来吧,然后就是移植ffmpeg了 回复【5楼】zhanshenguilai
祝你考研成功!
-----------------------------------------------------------------------
谢谢~~ 初具规模,做的不错. 很好很强大,牛逼! 你的视频播放软件是什么?
希望大侠能开源!呵呵! 祝福考研成功 很好很强大 开源吧,强烈支持!!!!!!!!!!!!!
我对WEB这块比较感兴趣! 很是漂亮 顶。 资料来了!现学的写bash脚本,有bug的地方请指出
---------------------
系统信息
#!/bin/sh
source /etc/net.conf
echo -e "Contenttype:text/html\n\n"
echo "<li>System: "$(uname -a)
echo "<br /><li>Time: "$(date)
echo "<br /><li>IP: "$IPADDR
echo "<br /><li>NETMASK:"$NETMASK
echo "<br /><li>GATEWAY:"$GATEWAY
echo "<br /><li>MAC :"$MAC
echo "<br /><li>PROCESS:<br />"$(ps -e | grep servfox)"<br />"$(ps -e | grep boa)
echo "<br /><li>Sys Run Time:"$(cat /proc/uptime| awk -F. '{run_days=$1/86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 %60;\
printf("%d Day %d Hour %d Minute %d Second",run_days,run_hour,run_minute,run_second)}')
-------------------------
视频播放器是移植的spcaview,里面有个网页内嵌的播放器。其实我是想在板子上建立一个流媒体服务器,通过采集摄像头视频,缓存以后通过网页播放或者比如vlc之类的播放器播放。调查了ffmpeg有这个功能,可是不管在PC上还是在板子上都不能建立流媒体服务器,所以视频的网页播放这块就用servfox+spcaview播放。如果用ffmpeg的话,网页内播放视频就可以用ffserver+VLC播放,VLC这个开源的播放器有自带的SDK可以用,也有内嵌网页的例程,用Darwin Streaming Server+vlc尝试过网页内播放流媒体。
如果有用ffmpeg建立起流媒体服务器的大侠请给予指点……
-----------------
温度监控
温度监控是通过S3C2440驱动外接的一个ds18b20读取温度的,然后通过CGI的方式存在xml文件里,html界面就可以通过JavaScript脚本读取xml文件内容,达到实时更新,下面是温度读取的应用层程序,可以设置温度上限
#include<stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include<math.h>
int hexa(char c);
unsigned int chr2int(unsigned char *p);
int main()
{
int fd;
unsigned int temp = 0;
float data=0.0;
unsigned char maxtemp={0};
unsigned char *p=
printf("Contenttype:text/html\n\n");
printf("<?xml version=\"1.0\" encoding=\"gb2312\"?>\n");
if((fd = open("/dev/gfy-18b20",O_RDWR)) == -1)
return -1;
read:
temp = 0,data=0;
read(fd, &temp, 1);
close(fd);
if (temp& 0xf000)
data = (float)(~temp +1) * 0.0625;
else
data = (float)temp * 0.0625;
if(data > 125.0)
goto read;
if((fd = open("./maxtemp.ini",O_RDWR)) == -1)
return -1;
read(fd,maxtemp,16);
close(fd);
p=strchr(maxtemp,'=');
p++;
printf("<measure>\n");
printf("<ch1_t>%.2f`C</ch1_t>\n",data);
printf("<ch2_t>%.2f`C</ch2_t>\n",data);
printf("<ch3_t>%.2f`C</ch3_t>\n",data);
if(data > (float)chr2int(p) || data <0)
printf("<button>warm</button>\n");
else
printf("<button>ok</button>\n");
printf("<maxt>%d`C</maxt>",chr2int(p));
printf("</measure>\n");
return 0;
}
int hexa(char c)
{
switch(c)
{
case '0' : return 0;
case '1' : return 1;
case '2' : return 2;
case '3' : return 3;
case '4' : return 4;
case '5' : return 5;
case '6' : return 6;
case '7' : return 7;
case '8' : return 8;
case '9' : return 9;
case 'A' : return 10;
case 'B' : return 11;
case 'C' : return 12;
case 'D' : return 13;
case 'E' : return 14;
case 'F' : return 15;
}
return 0;
}
unsigned int chr2int(unsigned char *p)
{
unsigned int data=0;
char n=strlen(p);
char i;
for(i=0;i<n;i++)
{
data +=hexa(p[ i ]) *pow(10,n-i-2);
}
return data;
}
-------------------------
图片采集脚本
思路是:我测试了用自己v4l写的程序采集图片不清晰,可能是没经过处理,截取用ffmpeg采集视频的图片就清晰得多,所以使用了一个笨办法,先采集视频,再提取图像帧^_^ .然后把所有的图片的路径通过cgi+bash+xml的形式传递给html+JavaScript显示给用户
#!/bin/sh
echo -e "Contenttype:text/html\n\n"
echo -e "<?xml version=\"1.0\" encoding=\"gb2312\"?>\n"
echo -e "<measure>\n"
serv=$(pgrep servfox)
if [ -n "$serv" ]
then
echo "Please kill the servfox first!!"
echo "<noimg>no</noimg>"
echo "</measure>"
exit
fi
#echo $(ps | grep servfox)
$(rm -rf /tmp/cap.asf)
$(ffmpeg-f video4linux -s 320*240 -r 10 -i /dev/video0 -t 0.1/tmp/cap.asf) > /dev/s3c-serial
$(ffmpeg -i /tmp/cap.asf -y -f image2 -t 0.01 -s 640x480 /www/view/img/`date +%s`.jpg) > /dev/s3c-serial
for img in ../view/img/*.jpg
do
if [ -e "$img" ]
then
echo "<img>"$img"</img>"
fi
done
echo "<noimg>yes</noimg>"
echo "</measure>"
-----
图像打包下载
这个就没思路了,自己看着办吧。
#!/bin/sh
cd ../view/img
$( tar cvf `date +%s`.tar.gz*.jpg)
echo -e "Contenttype:text/html\n\n"
echo -e "<?xml version=\"1.0\" encoding=\"gb2312\"?>\n"
echo -e "<measure>\n"
for url in *.gz
do
echo "<url>"$url"</url>"
done
echo "</measure>"
---------------
视频采集脚本,思路大致相同
#!/bin/sh
echo -e "Contenttype:text/html\n\n"
echo -e "<?xml version=\"1.0\" encoding=\"gb2312\"?>\n"
echo -e "<measure>\n"
serv=$(pgrep servfox)
if [ -n "$serv" ]
then
echo "Please kill the servfox first!!"
echo "<noimg>no</noimg>"
echo "</measure>"
exit
fi
cd ../video
$(rm -rf cap.asf)
$(ffmpeg-f video4linux -s 320*240 -r 10 -i /dev/video0 -t 10 `date +%s`.asf ) > /dev/s3c-serial
for video in *.asf
do
if [ -e "$video" ]
then
echo "<video>"$video"</video>"
fi
done
echo "<noimg>yes</noimg>"
echo "</measure>"
-------------
视频服务器的管理
做这部分的时候遇到一个非常棘手的问题,通过一个bash开启servfox视频服务器,servfox需要在终端输入回车才进入后台运行,在bash内我就不知道怎么做了,一直是按钮按下去后bash就一直在等待,等待servfox进入后台,通过ps看servfox已经运行了,可是没退出终端,后来观察到servfox运行起来后bash这个进程也一直在等,只要把它结束了就可以退出,html才能接收到数据,然后我就写另一个脚本专门来killall servfox,嘿嘿,还真就可以了
#!/bin/sh
echo -e "Contenttype:text/html\n\n"
echo -e "<?xml version=\"1.0\" encoding=\"gb2312\"?>\n" > ../view/stat.xml
echo -e "<measure>\n" >> ../view/stat.xml
serv=$(pgrep servfox)
if [ -n "$serv" ]
then
echo -e "<state>on</state>\n" >> ../view/stat.xml
echo -e "</measure>" >> ../view/stat.xml
exit
fi
./killservfox.do &
$(/usr/sbin/servfox -g -s 640x480 -d /dev/video0 -w 7070)&
echo -e "<state>on</state>\n" >> ../view/stat.xml
echo -e "</measure>" >> ../view/stat.xml
exit
-------------
led:
driver+app+cgi+xml+JavaScript+html就可以完成
driver.c
#include <linux/module.h> /*EXPORT_SYMBOL_GPL ())*/
#include <linux/init.h> /*module_init(init_function); module_exit(cleanup_function); */
#include <linux/kdev_t.h> /*dev_t*/
#include <linux/fs.h> /* everything... */
#include <linux/cdev.h> /*struct cdev *cdev_alloc(void); */
#include <linux/device.h> /*struct class*/
#include <asm/arch/regs-gpio.h> /*S3C2410_GPB5*/
#include <asm/hardware.h> /* s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)*/
#include<linux/ioctl.h>
#include <asm/uaccess.h> /* copy_*_user access_ok*/
#include "devleds.h"
static int leds_major, leds_minor = 0;
static struct cdev cdev; //字符设备结构
static struct class *leds_class;
dev_t dev;//设备号
static unsigned long leds_table[] = { //led的引脚定义表
S3C2410_GPB5,
S3C2410_GPB6,
S3C2410_GPB7,
S3C2410_GPB8
};
static unsigned int leds_cfg_table[] = { //led引脚功能定义表
S3C2410_GPB5_OUTP,
S3C2410_GPB6_OUTP,
S3C2410_GPB7_OUTP,
S3C2410_GPB8_OUTP,
};
static int leds_open(struct inode *inode, struct file *filp)
{
int i;
for(i = 0; i < 4; i++){ //引脚初始化,由于内核在已经初始化过一次,本处不必在初始化,否则得不到结果
// s3c2410_gpio_cfgpin(leds_table, leds_cfg_table);//arch/arm/plat-s3c24xx/gpio.c:void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
}
return 0;
}
static int leds_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
int err = 0, i;
if (_IOC_TYPE(cmd) != LEDS_IOC_MAGIC)
return -ENOTTY;
if (_IOC_NR(cmd) > LEDS_IOC_MAXNR)
return -ENOTTY;
/*
* the direction is a bitmask, and VERIFY_WRITE catches R/W
* transfers. `Type' is user-oriented, while
* access_ok is kernel-oriented, so the concept of "read" and
* "write" is reversed
*/
if (_IOC_DIR(cmd) & _IOC_READ)
err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
else if (_IOC_DIR(cmd) & _IOC_WRITE)
err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
if (err)
return -EFAULT;
printk(KERN_WARNING"Here\n");
switch(cmd)
{
case LEDS_IOCRESET:
for(i = 0; i < 4; i++){
s3c2410_gpio_setpin(leds_table, 1);
}
printk(KERN_WARNING"Here\n");
return 0;
case LEDS_IOCSON:
s3c2410_gpio_setpin(leds_table, 0);
return 0;
case LEDS_IOCSOFF:
s3c2410_gpio_setpin(leds_table, 1);
return 0;
default:
return -EINVAL;
}
return 0;
}
static struct file_operations leds_fops = {
.owner= THIS_MODULE,
.open = leds_open,
.ioctl = leds_ioctl
};
static int __init leds_init(void) //模块初始化
{
int result;
PDEBUG("Debug Opend!\n"); //我写来测试调试是否打开了的
if (leds_major) {
dev = MKDEV(leds_major, leds_minor);
result = register_chrdev_region(dev, 1, DEV_NAME);//此处为静态分配主设备号
} else {
result = alloc_chrdev_region(&dev, leds_minor, 1, DEV_NAME);//动态分配主设备号,此设备号为0
leds_major = MAJOR(dev);//获取主设备号的宏
}
if (result < 0) {
printk(KERN_WARNING "Leds: can't get major %d\n", leds_major);
return result;
}else {
printk(KERN_WARNING"Registered ok \nLeds_major = %d\n", leds_major);
}
cdev_init(&cdev, &leds_fops) ;//初始化最先定义的字符设备结构
cdev.owner = THIS_MODULE;
cdev.ops = &leds_fops;
result = cdev_add(&cdev, dev, 1);//通知内核有该结构注册,注意考虑失败
if(result < 0){
printk(KERN_WARNING"cdev_add failed!\n");
return result;
}
leds_class = class_create(THIS_MODULE, DEV_NAME);//creat自己的设备节点
if(IS_ERR(leds_class))
{
printk(KERN_ALERT"Err:faile in leds_class!\n");
return -1;
}
/*创建设备节点,名字为DEVICE_NAME ,主设备号用上面动态生成的dev*/
class_device_create(leds_class, NULL, dev, NULL, DEV_NAME);
printk(KERN_WARNING"Leds Module Initialed!\n");
return 0;
}
static void __exit leds_exit(void)
{
int devno = MKDEV(leds_major, leds_minor );
unregister_chrdev_region(devno, 1);//销毁设备号
cdev_del(&cdev);//销毁字符设备结构
class_device_destroy(leds_class, devno); //销毁注册的类
class_destroy(leds_class);
printk(KERN_WARNING"Leds Module exit!\n");
}
module_init(leds_init);
module_exit(leds_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("CHARACTER DEVICE DRVER");
MODULE_AUTHOR("gufeiyang@2010-03-2");
driver.h
#ifndef _LEDS_H_
#define _LEDS_H_
#define DEV_NAME "gfy_leds"
/* Macros to help debugging */
#undef PDEBUG /* undef it, just in case */
#ifdef LEDS_DEBUG
# ifdef __KERNEL__
/* This one if debugging is on, and kernel space */
# define PDEBUG(fmt, args...) printk( KERN_DEBUG "scull: " fmt, ## args)
# else /* This one for user space */
# define PDEBUG(fmt, args...) fprintf(stderr, fmt, ## args)
# endif
#else
# define PDEBUG(fmt, args...) /* not debugging: nothing */
#endif
#undef PDEBUGG
#define PDEBUGG(fmt, args...) /* nothing: it's a placeholder */
#define LEDS_IOC_MAGIC 'k'
#define LEDS_IOCRESET _IO(LEDS_IOC_MAGIC, 0)
#define LEDS_IOCSON _IOW(LEDS_IOC_MAGIC, 1, int)
#define LEDS_IOCSOFF _IOW(LEDS_IOC_MAGIC, 2, int)
#define LEDS_IOC_MAXNR 2
#endif
app.c
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include<linux/ioctl.h>
#include<string.h>
#include"leds.h"
int main()
{
char *method;
char *str,*p;
int fd;
printf("Contenttype:text/html\n\n");
printf("<?xml version=\"1.0\" encoding=\"gb2312\"?>\n");
printf("<measure>\n");
if((fd = open("/dev/gfy_leds",O_WRONLY)) == -1)
{
perror("Open");
return -1;
}
method=getenv("REQUEST_METHOD");
if(strcmp(method,"GET") == 0)
{
str=getenv("QUERY_STRING");
p=strchr(str,'=');
p++;
}
if(strstr(p,"ON") !=NULL)
{
ioctl(fd, LEDS_IOCSON, p-0x30);
}
else if(strstr(p,"OFF") !=NULL)
{
ioctl(fd, LEDS_IOCSOFF, p-0x30);
}
else
{
ioctl(fd, LEDS_IOCRESET);
printf("<num>NULL</num>\n");
printf("<led>NULL</led>\n");
printf("</measure>\n");
return ;
}
printf("<num>%c</num>\n",p);
p++;
printf("<led>%s</led>",p);
printf("</measure>\n");
close(fd);
return 0;
}
--------
资料包
led驱动及cgiourdev_579385.rar(文件大小:50K) (原文件名:led.rar)
www根目录,里面包含了所有的html及JavaScriptourdev_579386.rar(文件大小:760K) (原文件名:www-bak.rar)
点击此处下载 ourdev_579387.rar(文件大小:70K) (原文件名:cgi.rar) mark
楼主考研必胜! 我做了一个差不多的,没使用LINUX,开发难度大多了,而且吃力不讨好。。。 不错 厉害 和楼主差不多,我是准备考研半年多,然后觉得专业(电子科学与技术-微电子方向)没发展,。又准备找工作了。。。 回复【21楼】xlwxdl1 睡着的冰
和楼主差不多,我是准备考研半年多,然后觉得专业(电子科学与技术-微电子方向)没发展,。又准备找工作了。。。
-----------------------------------------------------------------------
微电子,搞IC设计可是金领中的金领。 mark 这个水平可以直接硕士毕业了吧~~ mark 我也为我这水平可以硕士毕业了!我现在就在干这事,还没他干的好!汗!!!! 祝楼主前途似锦:) 牛人! 我也想做个这个东西,但是现在在摄像头驱动这里卡主,不怎么才能更好的读懂那个驱动代码吗?难道必须看懂那个英语手册吗?往版主指点下 方便的话想和版主讨教下1340935442 希望版主给我意见 必mark mark!~ 牛逼啊!只能这样说了 干得不错…… mark 学习 高人! well done 楼主用的什么webserver?boa? 真的听牛逼 开源吧,强烈支持! mark!!!!!!!!!!!!!! 楼主威武!!! 楼主威武,一直也有这个想法,但是现在还没有思路。请教楼主个问题,现在实现了摄像头采集数据显示在LCD上,也研究过UIP联网协议,stm32板作为服务器,电脑浏览器与板子连接成功后想 把采集的数据传至浏览器,但是该如何把这个图像给显示在浏览器上哪。或者先实现个简单点的,先实现传送一帧上去,这些都是16进制的数据,该如何显示在特定的区域哪?问的有点啰嗦啦,主要是没有很好的思路,请楼主给予指点迷津,谢谢啦 这个网络监控做得不错!@!! 楼主很厉害! 支持很好的东西 {:lol:} 又是膜拜之 不错,mark 一个
页:
[1]