feiyang007 发表于 2010-8-31 19:24:35

交作业啦 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)

eworker 发表于 2010-8-31 19:36:21

不错

shotstar 发表于 2010-8-31 20:14:45

很好!

ljt8015 发表于 2010-8-31 21:37:12

很好!开源吧!~

1181zjf 发表于 2010-8-31 21:42:39

很强大

zhanshenguilai 发表于 2010-8-31 21:48:58

祝你考研成功!

huangdog 发表于 2010-8-31 22:13:25

看到了 阿莫电子邮购部~./emotion/em006.gif

feiyang007 发表于 2010-8-31 22:43:46

回复【3楼】ljt8015
很好!开源吧!~
-----------------------------------------------------------------------

好像没什么好开的,改天我把那些脚本传上来吧,然后就是移植ffmpeg了

feiyang007 发表于 2010-8-31 22:44:03

回复【5楼】zhanshenguilai
祝你考研成功!
-----------------------------------------------------------------------

谢谢~~

wisebaby 发表于 2010-8-31 23:38:48

初具规模,做的不错.

honami520 发表于 2010-9-1 00:13:19

很好很强大,牛逼!

microcreat 发表于 2010-9-1 01:11:16

你的视频播放软件是什么?

希望大侠能开源!呵呵!

quzegang 发表于 2010-9-1 01:26:03

祝福考研成功

clever0725 发表于 2010-9-1 08:28:46

很好很强大

zeasa 发表于 2010-9-1 08:57:26

开源吧,强烈支持!!!!!!!!!!!!!
我对WEB这块比较感兴趣!

menglongfc 发表于 2010-9-1 13:49:42

很是漂亮

Excellence 发表于 2010-9-1 13:57:46

顶。

feiyang007 发表于 2010-9-1 15:00:16

资料来了!现学的写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)

wanmyqawdr 发表于 2010-9-2 14:04:05

mark

楼主考研必胜!

linkin8834 发表于 2010-9-2 18:11:16

我做了一个差不多的,没使用LINUX,开发难度大多了,而且吃力不讨好。。。

QQ373466062 发表于 2010-9-2 19:50:43

不错   厉害

xlwxdl1 发表于 2010-9-3 10:03:25

和楼主差不多,我是准备考研半年多,然后觉得专业(电子科学与技术-微电子方向)没发展,。又准备找工作了。。。

eworker 发表于 2010-9-3 10:16:22

回复【21楼】xlwxdl1 睡着的冰
和楼主差不多,我是准备考研半年多,然后觉得专业(电子科学与技术-微电子方向)没发展,。又准备找工作了。。。
-----------------------------------------------------------------------

微电子,搞IC设计可是金领中的金领。

lirics 发表于 2010-9-4 21:49:23

mark

xczxwy 发表于 2010-9-4 22:14:54

这个水平可以直接硕士毕业了吧~~

mantrous 发表于 2010-9-10 10:24:30

mark

shuixingoo 发表于 2011-4-24 10:19:50

我也为我这水平可以硕士毕业了!我现在就在干这事,还没他干的好!汗!!!!

gaoyukun 发表于 2011-4-24 10:26:37

祝楼主前途似锦:)

flyingcys 发表于 2011-4-24 11:36:49

牛人!

251131250 发表于 2011-4-28 16:27:11

我也想做个这个东西,但是现在在摄像头驱动这里卡主,不怎么才能更好的读懂那个驱动代码吗?难道必须看懂那个英语手册吗?往版主指点下 方便的话想和版主讨教下1340935442 希望版主给我意见

ap0405209 发表于 2011-5-3 17:35:41

必mark

ljt8015 发表于 2011-5-3 17:56:26

mark!~

wangrong 发表于 2011-5-3 18:00:42

牛逼啊!只能这样说了

gloryzkl 发表于 2011-5-3 20:23:41

干得不错……

yesful 发表于 2011-5-3 20:30:39

mark

wcm_e 发表于 2011-5-3 20:48:19

学习

shangxf 发表于 2011-5-3 21:42:51

高人!

quzegang 发表于 2011-5-3 22:04:43

well done

ljt8015 发表于 2011-5-4 09:17:23

楼主用的什么webserver?boa?

jumning 发表于 2011-5-7 10:24:30

zzuyelei 发表于 2012-3-5 15:44:38

真的听牛逼

franki 发表于 2013-4-14 20:01:31

开源吧,强烈支持!

babyhua 发表于 2013-4-14 21:09:14

mark!!!!!!!!!!!!!!

ly674496415 发表于 2013-8-3 08:27:45

楼主威武!!!

ly674496415 发表于 2013-8-3 09:43:31

楼主威武,一直也有这个想法,但是现在还没有思路。请教楼主个问题,现在实现了摄像头采集数据显示在LCD上,也研究过UIP联网协议,stm32板作为服务器,电脑浏览器与板子连接成功后想 把采集的数据传至浏览器,但是该如何把这个图像给显示在浏览器上哪。或者先实现个简单点的,先实现传送一帧上去,这些都是16进制的数据,该如何显示在特定的区域哪?问的有点啰嗦啦,主要是没有很好的思路,请楼主给予指点迷津,谢谢啦

yidehui 发表于 2013-8-22 15:16:00

这个网络监控做得不错!@!!

LVmcu 发表于 2013-8-23 12:33:58

楼主很厉害!

fangchangqing 发表于 2013-8-23 12:59:14

支持很好的东西

lgc-sdu 发表于 2013-10-9 10:20:27

{:lol:} 又是膜拜之

mxcai2005 发表于 2013-10-9 11:05:16

不错,mark 一个
页: [1]
查看完整版本: 交作业啦 ARM LINUX的网络监控系统 然后闭关4个月--复习