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