智能家居网络系统设计(四)

               

上一篇文章我们刚好可以登录用户了,如果登录成功就是调用main.cgi这个java脚本在这一小节中我们就来学习main.c这个文件。

在这里我得强调一下,在网页中控制开发板上的开设,这个项目在所有开发板上基本通用,只是你的外设驱动程序不一样吧了,这里我写出我开发板上led驱动程序,如果你在网页上想显示温度,气体浓度,这需要加相应传感器和驱动就可以了,不同内核有可能用函数或者宏不一样,自己做相应的修改就好了。

led_drv.c驱动程序:(既然你都开始做项目了,我相信这个驱动程序应该难不倒你吧)

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/device.h>
#include <linux/gpio.h>

#define DEVICE_NAME "led1"

static struct class *led_1;   /* 定义一个;类,用来自动创建设备节点 */

static unsigned long led_table [] = {
S3C2410_GPB5,
S3C2410_GPB6,
S3C2410_GPB8,
S3C2410_GPB10,
};
static unsigned int led_cfg_table [] = {
S3C2410_GPB5_OUTP, //0x01<<10 defined in refg-gpio.h
S3C2410_GPB6_OUTP,
S3C2410_GPB8_OUTP,
S3C2410_GPB10_OUTP,
};
static int s3c2440_leds_ioctl( struct inode *inode, struct file *file,unsigned int cmd,unsigned long arg)
{
switch(cmd) {
case 0:
case 1:
   if (arg > 4) 
   {
   return -EINVAL;
   }
s3c2410_gpio_setpin(led_table[arg], !cmd);
return 0;
default:
return -EINVAL;
}
}

static struct file_operations s3c2440_leds_fops = {
.owner = THIS_MODULE,
.ioctl = s3c2440_leds_ioctl,
};

static int major;
static int __init s3c2440_leds_init(void)
{
  int i;
 major= register_chrdev(0, DEVICE_NAME, &s3c2440_leds_fops);  /* 自动分配主设备号 */
  led_1 = class_create(THIS_MODULE, DEVICE_NAME);               /* 创建一个类 */
device_create(led_1, NULL, MKDEV(major, 0), NULL, "led");/* 在类下面创建一个设备节点,名字为led,应用程序就可以调用open("/dev/led", O_RDWR来访问驱动程序。 */


for (i = 0; i < 4 ; i++) 
{
s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);//设置输出输入
s3c2410_gpio_setpin(led_table[i], 1);
}

printk(DEVICE_NAME " initialized\n");
return 0;
}
static void __exit s3c2440_leds_exit(void)
{
unregister_chrdev(major, DEVICE_NAME);        /* 取消注册 */
device_destroy(led_1,MKDEV(major, 0));            /* 删除类下面的设备节点 */
class_destroy(led_1);/* 删除类 */
}
module_init(s3c2440_leds_init);
module_exit(s3c2440_leds_exit);
MODULE_LICENSE("Dual BSD/GPL");
  
上面是我led驱动程序,在main.cgi中会用到。下面我们来看看main.c怎么编写的。


main.c文件:

#include<string.h>
#include <stdio.h>
#include <stdlib.h>
#include<fcntl.h>

void config(int *led_config,int led_num);          /* led配置文件 */
void led_fun(int *led_config); /*调用led驱动函数*/

int main()
{
int led_num=0;
int led_config[4]={0,0,0,0};
FILE *fp_html;
char buf[512]="";
char *len;
printf("%s\r\n\r\n","Content-Type:text/html");
len = getenv("CONTENT_LENGTH");
if(len != NULL)

unsigned int content_len = 0;
char *data;
content_len = atoi(len);
data = malloc(content_len + 1);
read(0, data, content_len);
sscanf(data,"led%d",&led_num);   /* 把那个led状态改变读出来 */
free(data);
}
else 
{
led_num=0;
}
config(led_config,led_num);

led_fun(led_config);
if( (fp_html=fopen("main_html","r")) == NULL)   /*这里注意,我们不能再写一个html网页,只能通过printf来打印一个网页,为了方便,我们把这个网页读取出来放在一个数组中,在用printf来打印,这个网页是我们用来人机控制界面,开始我们设置了一个用户登录界面*/
{
exit(1);
}
while(fgets(buf,512,fp_html))
{

if(strncmp(buf,"$FLAG4$",7)==0)  /* 这里用到一个变量 */
{
int i=0;
for(i=0; i < 4; i++)
{
if(led_config[i]==0)
{
printf("<img src=\"../www/image/off.jpg\" width=30 height=30 hspace=45 >");/* 图片的切换 */
}
else 
{
printf("<img src=\"../www/image/on.jpg\" width=30 height=30 hspace=45 >");
}
}
}


else 
printf("%s",buf);
}
return 0;
}


void config(int *led_config,int led_num)
{
FILE *fp;
if((fp=fopen("config.ini","r+"))==NULL)  /*这里很重要,开始我实现这个功能的时候,总是不成功,后来找到原因了,当我们点击网页上的按钮时候,这个脚本就会重新刷新一次,从开始重新执行,我们的led状态就会恢复初值,后来才想到一个办法,把led的状态保存在一个配置文件config.ini中,*/
{
printf("<p>fopen Error!<a href=\"/cgi-bin/main.cgi\">Return/a>");
exit(1);
}
fscanf(fp,"led1=%d,led2=%d,led3=%d,led4=%d",led_config,led_config+1,led_config+2,led_config+3);

/* fscanf是把配置文件的状态读取出来,来控制led */

if(led_num > 0)
{
if(led_config[led_num-1]==1)
{
led_config[led_num-1] = 0;
}
else 
{
led_config[led_num-1] = 1;
}
fseek(fp,7*(led_num-1)+5,SEEK_SET);
fprintf(fp,"%d",led_config[led_num-1]);  /* 把改变的状态重新存放在配置文件,注意看文件句柄fp */
}
fclose(fp);
}

void led_fun(int *led_config)
{
unsigned int led_num = 0;
int led_fd = open("/dev/led", O_RDWR);   /* 打开驱动程序 */

for (led_num = 0; led_num < 4; led_num++)    /*传入我们的led配置文件*/
{
ioctl(led_fd, led_config[led_num], led_num);
}
close(led_fd);
}


下一篇文章中将写出led配置文件,main_html网页文件源代码。


           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

智能家居控制系统设计       摘要:本文简单介绍了智能家庭控制系统的组成、旅行、功能、系统设计以及产品选择的 要点,工程设计事例等。 关键词:家庭控制器 自动监控 安全防范 l 引言 随着国民经济和科学技术水平的提高,特别是计算机技术、通信技术、络技术、控制技术 的迅猛发展与提高,促使了家庭实现了生活现代化,居住环境舒适化、安全化。这些高科 技已经影响到人们生活的方方面面,改变了人们生活习惯,提高了人们生活质量,家居智能 化也正是在这种形势下应运而生的。 2 智能家居控制系统概述 智能家庭控制系统是以HFC、以太、现场总线、公共、无线的传输络为物理平台,计算机 络技术为技术平台,现场总线为应用操作平台,构成一个完整的集家庭通信、家庭设备自 动控制、家庭安全防范等功能的控制系统。 智能家居控制系统的总体目标是通过采用计算机技术、络技术、控制技术和集成技术建 立一个由家庭到小区乃至整个城市的综合信息服务和管理系统,以此来提高住宅高新技术 的含量和居民居住环境水平。 系统通常由系统服务器、家庭控制器(各种模块)、各种路由器、电缆调制解调器头端设 备CMTS、交换机、通讯器、控制器、无线收发器、各种探测器、各种传感器、各种执行 机构、打印机等主要部分组成。 3 智能家居控制系统功能 智能家庭控制系统的主要功能包括家庭通信、家庭设备自动控制、家庭安全防范三个方 面。 家庭通信 家庭通信可采用线路、计算机互联、CATV线路、无线局域等方式。 (1)线路 通过线路实现双向传输语音信号和数据信号。 (2)计算机互联 通过互联实现信息交互、综合信息查询、上教育、医疗保健、电子邮件、电子购物等。 (3)CATV线路 通过CATV线路实现VOD点播和多媒体通信。 (4)无线局域 通过无线收发器、天线、各种无线终端,实现双向传输数据信号。 家庭设备自动监控 家庭设备自动监控包括电器设备的集中、遥控、远距离异地(通过或Internet)的监视、 控制及数据采集。 (1)家用电器的监视和控制 按照预先所设定程序的要求对热水器、微波炉、视像音响等家用电器进行监视和控制。 (2)热能表、燃气表、水表、电度表的数据采集、计量和传送根据小区物业管理的要求所 设置数据采集程序,通过传感器对热能表、燃气表、水表、电度表的用量进行自动数据采 集、计量,并将采集结果远程传送给小区物业管理系统。 (3)空调机的监视、调节和控制 按照预先所设定的程序,根据时间、温度、湿度等参数对空调机进行监视、调节和控制。 (4)照明设备的监视、调节和控制按照预先设定的时间程序,分别对各个房间照明设备的 开、关进行控制,并可自动调节各个房间的照度。 (5)窗帘的控制 按照预先设定的时间程序,对窗帘的开启/关闭进行控制。 家庭安全防范 家庭安全防范主要包括多火灾报警、可燃气体泄漏报警、防盗报警、紧急求救、多防区 的设置、访客对讲等。家庭控制器内按等级预先设置若干个报警号码(如家人单位号码、 手机号码、寻呼机号码和小区物业管理安全保卫部门号码等),在有报警发生时,按等级的 次序依次不停地拨通上述进行报警(可报出家中是哪个系统报警了)。同时,各种报警信号 通过控制络传送至小区物业管理中心,并可与其它功能模块实现可编程的联动(如可燃气 体泄漏报警后,联动关闭燃气管道上的电磁阀)。 (1)防火灾发生 通过设置在厨房的感温探测器和设置在客厅、卧室等的感烟探测器,监视各个房间内有无 火灾的发生。如有火灾发生家庭控制器发出声光报警信号,通知家人及小区物业管理部门 。家庭控制器还可以根据有人在家或无人在家的情况,自动调节感温探测器和感烟探测器 的灵敏度。 (2)防可燃气体泄漏 通过设置在厨房的可燃气体探测器,监视燃气管道、灶具有无燃气泄漏。如有燃气泄漏家 庭控制器发出声光报警信号,并联动关闭燃气管道上的电磁阀,同时通知家人及小区物业 管理部门。 (3)防盗报警 防盗报警的防护区域分成两部分,即住宅周界防护和住宅内区域防护。住宅周界防护是指 在住宅的门、窗上安装门磁开关,在对外的玻璃窗、门附近安装玻璃破碎探测器;住宅内 区域防护是指在主要通道、重要的房间内安装被动红外探测器或被动红外/微波双技术探 测器。当家中有人时,住宅周界防护的防盗报警设备(门磁开关、玻璃破碎探测器)设防, 住宅内区域防护的防盗报警设备(红外探测器或被动红外/微波双技术探测器)撤防。当家 人出门后,住宅周界防护的防盗报警设备(门磁开关、玻璃破碎探测器)和住宅内区域防护 的防盗报警设备(被动红外探测器或被动红外/微波双技术探测器)均设防。当有非法侵入 时,家庭控制器发出声光报警信号,并通知家人及小区物业管理部门。另外,通过程序可设 定报警装置的等级和报警器的灵敏度。 (4)访客对讲 住宅的主人通过访客对讲设备与来访者进行双向通话或可视通
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值