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

📄 esmart.c

📁 一个智能门禁系统的linux的程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	for(i=0;i<len;i++){
		sum+=tx_buf[i+6];
	}
	tx_buf[0]=0x7e;
	tx_buf[1]=0x7f;
	*((s16 *)(tx_buf+2))=htons(len+3);
	tx_buf[4]=property;
	tx_buf[5]=cmd;
//	memcpy(tmp+6,buf,len);
	len+=6;
	tx_buf[len++]=sum;
	tx_buf[len++]=0xfb;
//	memcpy(buf,tmp,len);
	return len;
}

/*
s16 my_ultoa(u32 val,u8 *buf){
	u8 tmp[15];
	u8 *p=tmp+15;
   	*--p = '\0';

   	do
   	{
     	*--p = '0' + val%10;
     	val/=10;
   	}
   	while(val);
   	
   	return strlen(p);
}
*/

void send_local(s32 fd,u8 cmd_type,u8 cmd_nbr,s16 len){
	s16 length=0;
	u8 sum=0;
	
	local_buf[length++]=cmd_type;
	local_buf[length++]=cmd_nbr;
	local_buf[length++]=len+4;
	length+=len;
	local_buf[length++]=do_sum(local_buf,length);

	if(fd>0)
		write(fd,local_buf,length);
#ifdef DEBUG
	showall(local_buf,length);
#endif
	return;
}

void dispose_lcd(u8 * data,u8 length){
	if(data[2]!=length)
		return;
	if(!check_sum(data,length-1))
		return;
	switch(data[0]){
		case 0x01:
			lcd_command(data[1],data+3,length-4);
			break;
		case 0x02:
			lcd_check(data[1],data+3,length-4);
			break;
		case 0x03:
			lcd_set_argument(data[1],data+3,length-4);
			break;
		case 0x05:
			lcd_transmit(data[1],data+3,length-4);
			break;
		default:
			return;
	}
	return;
}

void dispose_tcs(s32 fd,u8 * data,u8 length){
	if(data[2]!=length)
		return;
	if(!check_sum(data,length-1))
		return;
	switch(data[0]){
		case 0x01:
			tcs_command(fd,data[1],data+3,length-4);
			break;
		case 0x02:
			tcs_check(fd,data[1],data+3,length-4);
			break;
/*		case 0x03:
			tcs_set_argument(fd,data+1,length+1);
			break;
*/
		case 0x04:
			del_timer(find_timer(fd));
			break;
		case 0x05:
			  send_local(lcd_fd[1],0x05,0x08,0);
			  break;
		default:
			return;	
	}
	return;
}

void dispose_homeia(u8 *data, u8 len){
	u8 add;	
	s32 fd,i;
	struct timer_lst *newtimer;
#ifdef DEBUG					
	printf("the CeBus data len=%d is:   ",len);
	for(i=0;i<len;i++)
		printf("%x  ",data[i]);
	printf("\n");
#endif

	if((data[0]==0xff)&&(data[1]==0xef))
		return;
	switch(data[1]){
			case 0xec:					
				if(!check_sum(data,6)){
#ifdef DEBUG						
					printf("not check sum!!!\n");
#endif			
					return;
				}else{	
					if((data[3]==homeaddr)&&(device_ishome(data[2],data[5]))){ 
						printf("hahahaha!!!!.......\n");
						homeia[data[2]-1].online=1;	
			   		   	local_buf[0]=data[2];
			   		   	local_buf[1]=0xec;
			   		   	i=2;
					}else{
						printf("hehehehe!!!!.......\n");
						if(alloc_addr){
							printf("there is a new device is alloced now...\n");
							return;
						}
						add=get_unused_addr();
						if(!add)	return;
						homeia[add-1].used=0;
						homeia[add-1].type=data[5];
						devicenbr++;
						alloc_addr=1;
			   			local_buf[0]=data[0];local_buf[1]=0xee;local_buf[2]=data[2];
			   			local_buf[3]=data[3];local_buf[4]=data[4];local_buf[5]=add;
			   			local_buf[6]=do_sum(local_buf,6);
			   		   	i=7;
					}
				}	
			break;
			
			case 0xea:
				if(!check_sum(data,len-1)){
#ifdef DEBUG						
					printf("not check sum!!!\n");
#endif
					return;
				}
				if(len!=data[2]){
#ifdef DEBUG
					printf("the data length is no ok!\n");
#endif
					return;
				}
				homeia[data[0]-1].online=1;
				homeia[data[0]-1].len=len-4;
				memcpy(homeia[data[0]-1].state,data+3,len-4);
				local_buf[0]=data[0];
				local_buf[1]=0xea;
				i=2;
				break;
			case 0x00:
				if(!check_sum(data,len-1)){
#ifdef DEBUG						
					printf("not check sum!!!\n");
#endif
					return;
				}
				if(len!=data[2]){
#ifdef DEBUG
					printf("the data length is no ok!\n");
#endif
					return;
				}
				homeia[data[0]-1].online=1;
				homeia[data[0]-1].len=len-4;
				memcpy(homeia[data[0]-1].state,data+3,len-4);
				return;
			case 0xe8:
				if(data[0]>MAX_IA_NBR)
					return;
				else{
					homeia[data[0]-1].online=0;
					local_buf[0]=data[0];
					local_buf[1]=0xe8;
//					len=2;
					i=2;
				}
		 	break;	
/*		 	case 0xe9:
		 		newtimer=malloc(sizeof(timer_lst));
				memcpy(tx_buf+6,data,2);
				len=produce_transdata(0x32,0x10,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;
				init_timer(fd,1,len,tx_buf,newtimer);
				add_timer(newtimer);
				return;
*/			case 0xee:
				if((homeia[data[0]-1].used)){
					homeia[data[0]-1].online=1;
					write_homeia();
				}
				alloc_addr=0;
				homeia[data[0]-1].used=1;
				homeia[data[0]-1].online=1;
				write_homeia();
				/*************************************/
				tx_buf[6]=data[0];
				tx_buf[7]=homeia[data[0]-1].type;
				len=produce_transdata(0x32,0x11,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;		
				newtimer=malloc(sizeof(timer_lst));
				init_timer(fd,1,len,tx_buf,newtimer);
				add_timer(newtimer);	
				return;
			case 0xed:
				homeia[data[0]-1].online=1;
				local_buf[0]=data[0];
				local_buf[1]=0xed;
				i=2;
			break;	
			default:
				return;
	}
	write(cebus_fd,local_buf,i);
	printf("send to the cebus: \n");
	showall(local_buf,i);
}					

void dispose_boa(u8 * data, u8 length){
	if(data[2]!=length)
		return;
	if(!check_sum(data, length-1))
		return;
	switch(data[0]){
		case 0x01:		//系统配置
			boa_set_argument(data[1],data+3,length-4);
			break;		
		case 0x02:		//查询
			boa_check(data[1],data+3,length-4);
			break;
		case 0x05:		//转发
			lcd_transmit(data[1],data+3,length-4);
			break;
		default:
			return;
	}
	return;
}

void boa_set_argument(u8 cmd,u8 *buf,u8 len){
	s32 fd,n;
	timer_lst * mytimer;
	
	switch(cmd){
		case 0x01:		//用户密码
			if(len>USR_PSW_LEN){
				local_buf[3]=0;
				send_local(boa_fd[1],0x2,0x2,1);	
				return;
			}
			strncpy(user_pswd,buf,len);
			write_password_file();	
			break;
		case 0x02:		//传感器端口修改
			if(buf[0]>MAX_SENSOR_NBR)
				return;
			sensor[buf[0]-1].property=buf[1];
			sensor[buf[0]-1].type=buf[2];
			write_sensor_config();

			tx_buf[6]=buf[0];
			tx_buf[7]=buf[2];
			len=produce_transdata(0x32,0x8,2);
			len=trans_data(tx_buf,len);
			fd=server_open(0);
			if(fd<=0)
				return;
			write(fd,tx_buf,len);
			n=client_add(fd);
			FD_SET(fd,&allset);
			if(maxfd<fd)
				maxfd=fd;
			if(maxi<n)
				maxi=n;			
			mytimer=malloc(sizeof(timer_lst));
			init_timer(fd,1,len,tx_buf,mytimer);
			add_timer(mytimer);			
			break;
		case 0x03:		//家政设备配置		
			if(buf[1]){
				io_mask |=1<<buf[0];
			}else{
				io_mask &=~(1<<buf[0]);
			}
			write_io_config();
			
			tx_buf[6]=buf[0];
			tx_buf[7]=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);
			n=client_add(fd);
			FD_SET(fd,&allset);
			if(maxfd<fd)
				maxfd=fd;
			if(maxi<n)
				maxi=n;			
			mytimer=malloc(sizeof(timer_lst));
			init_timer(fd,1,len,tx_buf,mytimer);
			add_timer(mytimer);			
			break;
		case 0x04:		//安防模式
			n=buf[0]-1;
			alarm_mode[n]=*(u16*)(buf+1);
			//mode.ini文件的修改
			write_mode_config();	
			break;
		case 0x05:		//计量表
			set_metric_value(buf,len);
			write_metric_config();
			break;
		case 0x06:		//报警电话
			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 0x07:		//电话报警振铃次数
			//发给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 0x08:		//本地IP
			memset(ipaddr,0,16);
			strncpy(ipaddr,buf,len);
			write_network_config();
			
			client_clear();
			clear_socket();
			net_config();
			write_network_config();
			create_socket();
			break;
		case 0x09:		//本地NETMASK
			memset(netmask,0,16);
			strncpy(netmask,buf,len);
			write_network_config();

			client_clear();
			clear_socket();
			net_config();
			write_network_config();
			create_socket();
			break;
		case 0x0a:		//小区IP
			memset(server[0].ip,0,16);
			strncpy(server[0].ip,buf,len);
			write_network_config();
			write_ftp_config();
			break;
		case 0x0b:		//小区端口
			buf[len]=0;
			server[0].port=atoi(buf);
			write_network_config();
			break;
		case 0x0c:		//小区报警IP
			memset(server[1].ip,0,16);
			strncpy(server[1].ip,buf,len);
			write_network_config();
			break;
		case 0x0d:		//小区报警端口
			buf[len]=0;
			server[1].port=atoi(buf);
			write_network_config();
			break;
		case 0x0e:
			curtain_time=buf[0];
			write_curtain_len();
			break;
		default:
			local_buf[3]=0;
			send_local(boa_fd[1],0x2,0x2,1);
			return;
	}
	
	local_buf[3]=1;
	send_local(boa_fd[1],0x2,0x2,1);
	return;
}

void boa_check(u8 cmd,u8 *buf,u8 len){
	switch(cmd){
		case 0x01:		//安防模式
			local_buf[3]=now+1;
			len=1;
			break;
		case 0x02:		//用户密码
			if(len!=strlen(user_pswd)||strncmp(buf,user_pswd,len))
				local_buf[3]=2;
			else
				local_buf[3]=1;
			len=1;
			break;
		case 0x03:		//超级用户密码
			if(len!=strlen(surper_pswd)||strncmp(buf,surper_pswd,SUP_PSW_LEN))
				local_buf[3]=2;
			else
				local_buf[3]=1;
			len=1;
			break;
		case 0x04:		//控制器IP
			len=sprintf(local_buf+3,"%s %s",ipaddr,netmask);
			break;
		case 0x05:		//小区控制软件
			len=sprintf(local_buf+3,"%s %d",server[0].ip,server[0].port);			
			break;
		case 0x06:		//小区报警
			len=sprintf(local_buf+3,"%s %d",server[1].ip,server[1].port);						
			break;
		case 0x07:		//报警电话
			len=1;
			local_buf[3]=buf[0];
			len+=sprintf(local_buf+4,"%s",dialnbr[buf[0]-1]);
			break;
		case 0x08:		//安防端口状态
//			memcpy(local_buf+3,&alarm_mask,2);
			*(u16*)(local_buf+3) =alarm_mode[buf[0]-1];
			len=2;
			break;
		case 0x09:
			local_buf[3]=curtain_time;
			len=1;
			break;
		case 0x0a:
			local_buf[3]=io_state;
			len=1;
			break;
		default:
			return;
	}
	send_local(boa_fd[1],0x02,cmd,len);
}

void lcd_command(u8 cmd,u8 *buf,u8 len){
	u8 dev;
	u8 on;
	
	switch(cmd){
	case 0x01:		//安防模式		
		if(buf[0]>MAX_MODE_NBR)	return;
		now=buf[0]-1;
		break;
	case 0x02:		//消警命令
//		alarm_on=0;
		last_alarm=0;
		alarm_onoff(0);
//		memset(alarm_data,0,MAX_ALARM_MESSAGE_LEN);
#ifdef TCS
		send_local(tcs_fd,0x4,0x2,0);
#else
		send_local(modem_fd[1],0x4,0x2,0);
#endif
		
		break;
	case 0x03:		//家政控制
		dev=(buf[0]&0xf0)>>4;
		on =buf[0]&0x0f;
		if(dev==4)
			curtain_onoff(on);
		else
			light_onoff(dev,on);
		break;
	case 0x04:
		poorlight_onoff(buf[0]);
		break;
	default:
#ifdef DEBUG
		printf("there is no the lcd command %c",cmd);
#endif
		return;	
	}
}

void lcd_check(u8 cmd,u8 *buf,u8 len){
	s32 fd,i;
	struct timer_lst *mytimer;

//	u8 tmp[MAX_BUF_LEN];
	switch(cmd){
		case 0x01:		//安防模式
			local_buf[3]=now+1;
			len=1;
			break;
		case 0x02:		//用户密码
			if((len!=strlen(user_pswd))||strncmp(buf,user_pswd,len))
				local_buf[3]=2;
			else
				local_buf[3]=1;
			len=1;			
			break;
		case 0x03:		//超级用户密码
			if(len!=strlen(surper_pswd)||strncmp(buf,surper_pswd,SUP_PSW_LEN))
				local_buf[3]=2;
			else

⌨️ 快捷键说明

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