⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 esmart.c

📁 一个智能门禁系统的linux的程序
💻 C
📖 第 1 页 / 共 4 页
字号:
				local_buf[3]=1;
			len=1;				
			
			break;
		case 0x04:		//消息标题
			len=read_message_titile(&local_buf[3]);
			break;
		case 0x05:		//消息内容
			len=read_message(&local_buf[3],buf[0]);
			break;
		case 0x06:		//计量表
			len=read_metric(buf[0],&local_buf[3]);
			break;
		case 0x07:		//报警信息
			len=read_alarm_message(&local_buf[3]);
			break;
		case 0x08:		//查询时间
			//从小区得到时间			
			if((fd=server_open(0))<0){
#ifdef DEBUG
			printf("can't create the server1 socket\n");
#endif
				return;
			}
			len=produce_transdata(0x34,0x03,0);
			len=trans_data(tx_buf, len);
			write(fd,tx_buf,len);
			i=client_add(fd);
			FD_SET(fd,&allset);
			if(maxfd<fd)
				maxfd=fd;
			if(maxi<i)
				maxi=i;			
			mytimer=malloc(sizeof(timer_lst));
			init_timer(fd,1,len,tx_buf,mytimer);
			add_timer(mytimer);		
#ifdef DEBUG	
			showall(tx_buf,len);
#endif
			return;
		case 0x09:		//控制器IP
			len=sprintf(&local_buf[3],"%s %s",ipaddr,netmask);
			break;
		case 0x0a:		//小区控制软件
			len=sprintf(&local_buf[3],"%s %d",server[0].ip,server[0].port);			
			break;
		case 0x0b:		//小区报警
			len=sprintf(&local_buf[3],"%s %d",server[1].ip,server[1].port);						
			break;
		case 0x0c:		//报警电话
			len=sprintf(&local_buf[3],"%s",dialnbr[buf[0]-1]);
			break;
		case 0x0d:		//安防端口状态
			memcpy(&local_buf[3],&alarm_mode[now],2);
			len=2;
			break;
		case 0x0e:		//家政设备状态
			local_buf[3]=io_state;		
			len=1;
			break;
		case 0x0f:		//家政设备配置状态
			local_buf[3]=io_mask;
			len=1;
			break;
		case 0x10:
			local_buf[3]=buf[0];
			local_buf[4]=sensor[buf[0]-1].property;
			local_buf[5]=sensor[buf[0]-1].type;
			len=3;
			break;
		default:
			return;
	}
	send_local(lcd_fd[1],0x02,cmd,len);
}

void lcd_set_argument(u8 cmd,u8 *buf,u8 len){
	s32 fd;
	struct timer_lst *mytimer;
	s32 i,pid=-1;
	u8 mac[6];
	u8 * next;
	
	switch(cmd){
		case 0x01:		//安装信息	
			//应该向小区发布,并当小区返回数据后发给LCD			
			if((fd=server_open(0))<0){
#ifdef DEBUG
				printf("can't creat the server1 socket\n");
#endif
				local_buf[3]=0;
				send_local(lcd_fd[1],0x3,0x1,1);
				return;
			}
			len=produce_transdata(0x32,0x07,0);
			len=trans_data(tx_buf,len);
			write(fd,tx_buf,len);
#ifdef DEBUG
			showall(tx_buf,len);
#endif
			break;
		case 0x02:		//用户密码
			if(len>USR_PSW_LEN)	return;
			strncpy(user_pswd,buf,len);
			write_password_file();
			break;
		case 0x03:		//传感器端口修改
			if(buf[0]>MAX_SENSOR_NBR)
				return;
			sensor[buf[0]-1].property=buf[1];
			sensor[buf[0]-1].type=buf[2];
			break;
		case 0x04:		//家政设备配置
			if(buf[1]){
//				io[buf[0]]=buf[1];
				io_mask |=(1<<buf[0]);
			}else{
//				io[buf[0]]=buf[1];
				io_mask &=~(1<<buf[0]);
			}
			write_io_config();
			tx_buf[6]=buf[0];
			tx_buf[6]=buf[1]+1;
			len=produce_transdata(0x32,0x13,2);
			len=trans_data(tx_buf, len);
			fd=server_open(0);
			if(fd<=0)
				return;
			write(fd,tx_buf,len);
			i=client_add(fd);
			FD_SET(fd,&allset);
			if(maxfd<fd)
				maxfd=fd;
			if(maxi<i)
				maxi=i;			
			mytimer=malloc(sizeof(timer_lst));
			init_timer(fd,1,len,tx_buf,mytimer);
			add_timer(mytimer);			
			break;
		case 0x05:		//安防模式
			i=buf[0]-1;
			alarm_mode[i]=*(u16*)(buf+1);
			//sensor.ini文件的修改
			break;
		case 0x06:		//计量表
			set_metric_value(buf,len);
			break;
		case 0x07:		//报警电话
			memset(&dialnbr[buf[0]-1],0,MAX_PHONE_LEN);
			memcpy(&dialnbr[buf[0]-1],buf+1,len-1);
			write_dialnbr();
			memcpy(local_buf+3,buf,len);			
#ifdef TCS	
			fd=tcs_fd;
#else
			fd=modem_fd[1];
#endif
			send_local(fd,0x03,0x01,len);			
			break;
		case 0x08:		//电话报警振铃次数
			//发给TCS或MODEM模块
#ifdef TCS	
			fd=tcs_fd;
#else
			fd=modem_fd[1];
#endif
			local_buf[3]=buf[0];
			send_local(fd,0x05,0x07,1);
			break;
		case 0x09:		//本地IP
			memset(ipaddr,0,16);
			strncpy(ipaddr,buf,len);
			client_clear();
			clear_socket();
			net_config();			
			create_socket();
			write_network_config();			
			break;
		case 0x0a:		//本地NETMASK
			memset(netmask,0,16);
			strncpy(netmask,buf,len);
			client_clear();
			clear_socket();
			net_config();			
			create_socket();
			write_network_config();			
			break;
		case 0x0b:		//小区IP
			memset(server[0].ip,0,16);
			strncpy(server[0].ip,buf,len);
			write_network_config();			
			write_ftp_config();
			break;
		case 0x0c:		//小区端口
			buf[len]=0;
			server[0].port=atoi(buf);
			write_network_config();			
			break;
		case 0x0d:		//小区报警IP
			memset(server[1].ip,0,16);
			strncpy(server[1].ip,buf,len);
			write_network_config();			
			break;
		case 0x0e:		//小区报警端口
			buf[len]=0;
			server[1].port=atoi(buf);
			write_network_config();			
			break;
			/*
		case 0x0f:		//mac 地址修改
			buf[len]=0;
			for(i=0;buf && (i<6);i++) {
				mac[i] =strtol(buf,&next,16)&0xff;
				if (next)
					buf = next + 1;
				else
					buf = 0;
			}
			 
			if (i!=6)
				return;
			set_macaddr(mac);
			save_all();
			while(pid<0)
				pid=vfork();
			if(pid==0){
				execl("/bin/reboot","reboot",(u8 *)0);
				exit(0);
			}else{
				waitpid(pid,NULL,0);
			}
			break;
			*/
		case 0x10:		//在线升级
				save_all();
			while(pid<0)
				pid=vfork();
			if(pid==0){
				execl("/mnt/esmart/update","update",(u8 *)0);
				exit(0);
			}else{
				waitpid(pid,NULL,0);
			}
			break;
		default:
			return;
	}
	return;
}

void lcd_transmit(u8 cmd,u8 *buf,u8 len){
	s32 fd;
#ifdef TCS
	fd=tcs_fd;	
#else
	fd=modem_fd[1];
#endif
	memcpy(local_buf+3,buf,len);
	send_local(fd,0x05,cmd,len);
}


void poorlight_onoff(u8 on){
	if(!on)
		*(u16 *)IO_ADDRA |=POOR_LIGHT;
	else
		*(u16 *)IO_ADDRA &=~POOR_LIGHT;
}

u8 read_metric(u8 mode,u8 *buf){
	u8 len=0;
	struct metric_data  p[MAX_METRIC_NBR];
	char tmp[10];
	float current_value;
	u32 current_data;
	FILE *fp;
	s32 fd;
	u8 i,j;
	
	for(i=0;i<MAX_METRIC_NBR;i++){
		memset(&p[i],0,sizeof(struct metric_data));
		if(!(fp=fopen(metric_file[i],"r")))
			return 0;
		fscanf(fp,"%s %s %s\n",tmp,p[i].data,p[i].money);
		p[i].value=atof(tmp);
		fclose(fp);		
	}
	
	for(i=0;i<MAX_METRIC_NBR;i++){
		if(mode==2)
			len+=sprintf(buf+len,"%s ",p[i].data);
		else if(mode==3)
			len+=sprintf(buf+len,"%s ",p[i].money);
		else{
			fd=open(metric_dev[i],O_RDONLY);
			if(read(fd,&current_data,4)<1){
				buf[len++]='0';
				buf[len++]=' ';
			}else if(metric[i].rev==0){
				buf[len++]='0';
				buf[len++]=' ';
			}else{
				current_value=(float)((float)current_data/metric[i].rev) + metric[i].value;
				if(mode==4){
					ftoa(current_value,tmp);
					len+=sprintf(buf+len,"%s ",tmp);
				}else{
					ftoa(current_value-p[i].value,tmp);
					len+=sprintf(buf+len,"%s ",tmp);
				}
			}
			close(fd);
		}
	}	
	return (len-1);
}

void tcs_command(s32 fd,u8 cmd,u8 *buf,u8 len){
	switch(cmd){
		case 0x01:		//网络家电开关控制
			local_buf[0]=buf[0];
			local_buf[1]=buf[1];
			local_buf[2]=buf[2];
			local_buf[3]=do_sum(local_buf,3);
			write(cebus_fd,local_buf,4);
			break;
		case 0x02:		//布撤防控制
			now=buf[0]-1;
			break;
		default:
			return;
	}
}

void tcs_check(s32 fd,u8 cmd,u8 *buf,u8 len){
	s32 i;
	switch(cmd){
		case 0x01:
			printf("the data len=%d user password is %s\n",user_pswd);
			if((len!=strlen(user_pswd))||strncmp(buf,user_pswd,len))
				local_buf[3]=0;
			else
				local_buf[3]=1;
			len=1;
			break;
		case 0x02:
			local_buf[3]=device_online(buf[0]);
			len=1;
			break;
		case 0x03:
			local_buf[3]=now+1;
			len=1;
			break;
		case 0x04:
			len=0;
			for(i=0;i<MAX_IA_NBR;i++){
				if(homeia[i].used){
					local_buf[3+len++]=i+1;
					local_buf[3+len++]=homeia[i].type;
				}
			}
			break;
		default:
			return;
	}
	send_local(fd,0x02,cmd,len);
}

u8 device_online(u8 addr){
	if(homeia[addr-1].online)
		return 1;
	return 0;	
}

u8 device_ishome(u8 addr,u8 type){
	printf("the addr=0x%x type=0x%x\n",addr,type);
	if(addr>MAX_IA_NBR)
		return 0;
	if((homeia[addr-1].type!=type) || (!homeia[addr-1].used))
		return 0;
	return 1;
}

u8 get_unused_addr(){
	u8  i;
	for(i=0;i<MAX_IA_NBR;i++){
		if(!homeia[i].used){
			homeia[i].used=1;
			return(i+1);
		}
	}
	if(i==MAX_IA_NBR)
		return 0;
}

u8 do_sum(u8 *buf,u8 len){
	u8 i;
	u8 sum=0;
	for(i=0;i<len;i++){
		sum+=buf[i];
	}
	return sum;
}

s32 ftoa(float a,u8 *buf){
	s32 b,c,len;
	b=(s32)floor(a);
	c=(s32)floor((a-b)*100);
	if(c<10)
		len=sprintf(buf,"%d.0%d",b,c);
	else
		len=sprintf(buf,"%d.%d",b,c);
	return len;
}

s32 read_com(s32 hm,u8 * buf,s32 length){
	s32 a,h=0;
	fd_set readfs;
	struct timeval oft;
	
	oft.tv_sec=0;
	oft.tv_usec=2*1000;
	h=0;

	do{
		FD_ZERO(&readfs);
		FD_SET(hm,&readfs);
		a=select(hm+1,&readfs,NULL,NULL,&oft);
		if(a<=0)
			return h; //返回实际读取的数据数
		a=read(hm,buf+h,length-h);
		if(a<0)
			return -1;
		if(a>0){
			h+=a;
		}
	}while(h<length);
	
	return h;
}

void save_all(){
	s32 i,fd;
	u32 tmp;
	
	for(i=0;i<MAX_METRIC_NBR;i++){
		if(!metric[i].rev)	continue;
		if((fd=open(metric_dev[i],O_RDONLY))<0){
			printf("can't open the metirc%d device\n",i);
			continue;
		}
		if(read(fd,&tmp,4)<1){			
			metric[i].value=(float)((float)tmp/metric[i].rev)+metric[i].value;
		}
	}
	write_metric_config();

}

void set_metric_value(u8 *buf,s16 len){
	s32 i,fd;
	u8 *p,*p1;
	buf[len]=' ';
	p=p1=buf;
	
	while(p<buf+len){
		i=*p++;
		while(*(++p1)!=' ') ;
		*(p1++)='\0';
	
		if(i<MAX_METRIC_NBR && i>0){
			metric[i-1].value=atof(p);
			if((fd=open(metric_dev[i-1],O_RDONLY))<0)
				continue;
			ioctl(fd,METRIC_ZERO, NULL);
		}
		p=p1;
	}
}

void
client_clear(){
	s32 i;
	for(i=0;i<maxi;i++){
		if(!client[i].fd){
			client[i].fd=0;
			FD_CLR(client[i].fd,&allset);
			close(client[i].fd);
		}
	}
}

void create_socket(){
	s32 ret,opt,flags;
	opt=1;
	listenfd=socket(AF_INET,SOCK_STREAM,0);
	if(listenfd<0){
#ifdef DEBUG		
		printf("can't creat socket\n");
#endif
		return;
	}
	setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

	bzero(&serv_addr,sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=(INADDR_ANY);
	serv_addr.sin_port=htons(SERVER_PORT);

	if((flags=fcntl(listenfd,F_GETFL,0))<0){
#ifdef DEBUG		
		printf("F_GETFL error\n");
#endif
		return;
	}
	flags &=~O_NONBLOCK;
	if(fcntl(listenfd,F_SETFL,flags)<0){
#ifdef DEBUG		
		printf("F_SETFL error\n");
#endif
		return;
	}
	ret=bind(listenfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
	if(ret<0){
#ifdef DEBUG
		printf("bind server port\n");
#endif	
		return;	
	}
	ret=listen(listenfd,5);
	if(ret==-1){
#ifdef DEBUG
		printf("can't listen the socket ...\n");
#endif	
		return;

	}
	
	FD_SET(listenfd,&allset);
	maxfd=MAX(listenfd,maxfd);
}

void clear_socket(){
	FD_CLR(listenfd,&allset);
	close(listenfd);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -