📄 esmart.c
字号:
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,¤t_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 + -