📄 new_communication.c
字号:
printf("cannot open client_fd\n");
}
memset(SenConData,'\0',sizeof(SenConData));
con_netwk = Bcd2int(PipeBuf[0]);
if(con_netwk==100)
{
sprintf(some_data,"网络号错误");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);
return;
}
re = Bcd2int(PipeBuf[1]);
if(re==100)
{
sprintf(some_data,"节点号错误");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);
return;
}
con_node = zig_node[re];
if(con_len==4) //发送继电器控制命令,组成继电器控制命令帧
{
SenConData[0] = 0x44;
SenConData[1] = NetNode[con_netwk][con_node].zigbee_node;
SenConData[2] = 0x03;
SenConData[3] = NetNode[con_netwk][con_node].real_node;
SenConData[4] = set_relay_order;
show_node = (int)(SenConData[1]&0x0f);
con_ch = Bcd2hex(PipeBuf[2],PipeBuf[3]);
if(con_ch==0x00) {SenConData[5]=0xff; }
else if(con_ch==0x01)
{SenConData[5]=con_ch;
NetNode[con_netwk][show_node].state="关";}
else if(con_ch==0xff)
{
sprintf(some_data,"控制命令错误");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);
return;
}
else
{SenConData[5]=con_ch;
NetNode[con_netwk][show_node].state="开";}
Get_Time(&TimeBuffer[0]);
sprintf(NetNode[con_netwk][show_node].show_node_time,"(%02i/%02i;%02i:%02i)", \
ds_1302_time.month,ds_1302_time.date,ds_1302_time.hour,ds_1302_time.min);
SenConData[6] = Bit_Xor(con_len+2,SenConData);
}
else if(con_len==6)//发送PWM控制命令,组成PWM控制命令帧
{
SenConData[0] = 0x44;
SenConData[1] = NetNode[con_netwk][con_node].zigbee_node;
SenConData[2] = 0x04;
SenConData[3] = NetNode[con_netwk][con_node].real_node;
SenConData[4] = set_ao1_order;
show_node = (int)(SenConData[1]&0x0f);
con_ch = Bcd2hex(PipeBuf[2],PipeBuf[3]);
if(con_ch==0x00)
{
SenConData[5] = 0xff;
}
else if(con_ch==0x2f) //如果pwm命令高字节为2f则关掉pwm功能
{SenConData[5] = con_ch;
NetNode[con_netwk][show_node].state="关";}
else if(con_ch==0xff)
{sprintf(some_data,"控制命令错误");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);
return;}
else
{SenConData[5] = con_ch;NetNode[con_netwk][show_node].state="开";}
con_ch = Bcd2hex(PipeBuf[4],PipeBuf[5]);
if(con_ch==0x00){SenConData[6] = 0xff; }
else if(con_ch==0xff)
{
sprintf(some_data,"控制命令错误");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);
return;
}
else
{SenConData[6] = con_ch;}
/*获取控制命令发送时间*/
Get_Time(&TimeBuffer[0]);
sprintf(NetNode[con_netwk][show_node].show_node_time,"(%02i/%02i;%02i:%02i)",\
ds_1302_time.month,ds_1302_time.date,ds_1302_time.hour,ds_1302_time.min);
SenConData[7] = Bit_Xor(con_len+1,SenConData);
}
else if(con_len==10) //发送修改表底控制命令,组成修改表底控制命令帧
{
SenConData[0] = 0x44;
SenConData[1] = NetNode[con_netwk][con_node].zigbee_node;
SenConData[2] = 0x06;
SenConData[3] = NetNode[con_netwk][con_node].real_node;
SenConData[4] = amend_pulse_count1;
show_node = (int)(SenConData[1]&0x0f);
con_ch = Bcd2hex(PipeBuf[2],PipeBuf[3]);
NetNode[con_netwk][show_node].data[0] = con_ch;
if(con_ch==0x00)
{SenConData[5] = 0xff;}
else if(con_ch==0xff)
{
sprintf(some_data,"控制命令错误");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);
return;
}
else
{SenConData[5] = con_ch;}
con_ch = Bcd2hex(PipeBuf[4],PipeBuf[5]);
NetNode[con_netwk][show_node].data[1] = con_ch;
if(con_ch==0x00)
{SenConData[6] = 0xff;}
else if(con_ch==0xff)
{
sprintf(some_data,"控制命令错误");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);
return;
}
else
{SenConData[6] = con_ch;}
con_ch = Bcd2hex(PipeBuf[6],PipeBuf[7]);
NetNode[con_netwk][show_node].data[2] = con_ch;
if(con_ch==0x00)
{SenConData[7] = 0xff;}
else if(con_ch==0xff)
{
sprintf(some_data,"控制命令错误");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);
return;
}
else
{SenConData[7] = con_ch;}
con_ch = Bcd2hex(PipeBuf[8],PipeBuf[9]);
NetNode[con_netwk][show_node].data[3] = con_ch;
if(con_ch==0x00)
{SenConData[8] = 0xff;}
else if(con_ch==0xff)
{
sprintf(some_data,"控制命令错误");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);
return;
}
else
{SenConData[8] = con_ch;}
NetNode[con_netwk][show_node].data[4] = '\0';
/*将修改表底数显示网页*/
NetNode[con_netwk][show_node].node_data = Char2long(NetNode[con_netwk][show_node].data);
/*获取控制命令发送时间*/
Get_Time(&TimeBuffer[0]);
sprintf(NetNode[con_netwk][show_node].show_node_time,"(%02i/%02i;%02i:%02i)",\
ds_1302_time.month,ds_1302_time.date,ds_1302_time.hour,ds_1302_time.min);
SenConData[9] = Bit_Xor(9,SenConData);
}
else
{
sprintf(some_data,"命令错误");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);
return;
}
}
/*以下为发送数据包程序*/
for(i=0;i<23;i++) /*设定查询间隔*/
{
if(read_flag==0)
{write(fd,SenConData,strlen(SenConData));}//发送数据包给指定节点
else {read_flag=0;}
usleep(1000000);
if (wait_flag==FALSE)
{
memset(data_buf,'\0',sizeof(data_buf));
res = read(fd,data_buf,20);
data_buf[res]=0;
if(res==1) /* 如果只输入 CR 则停止返回 */
{
wait_flag = TRUE; /* 等待新的输入信号 */
}
else if(data_buf[0]==0x43)/*收到数据等待应答*/
{
read_flag = 1;
wait_flag = TRUE;
}
else if(data_buf[0]==0x44)/*返回应答信息*/
{
if((data_buf[1]==SenConData[1])&&(data_buf[2]==0x03)&&(data_buf[4]==respond_relay_order))
{
/*继电器控制命令应答*/
if(con_order_flag == 1)
{sprintf(some_data,"ok!成功!");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);}
printf("收到应答\n");
wait_flag = TRUE;
break;
}
else if((data_buf[1]==SenConData[1])&&(data_buf[2]==0x04)&&(data_buf[4]==respond_a01_order))
{
/*PWM控制命令应答*/
sprintf(some_data,"right!成功!");
write(client_fd,some_data,strlen(some_data));
printf("收到应答\n");
(void)close(client_fd);
wait_flag = TRUE;
break;
}
else if((data_buf[1]==SenConData[1])&&(data_buf[2]==0x06)&&(data_buf[4]==report_data_fun_code))
{
/*修改表底命令应答*/
sprintf(some_data,"finish!成功!");
write(client_fd,some_data,strlen(some_data));
printf("收到应答\n");
(void)close(client_fd);
wait_flag = TRUE;
break;
}
else
{
if(con_order_flag == 1)
{sprintf(some_data,"error!错误!");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);}
/*如果此时有安放信息到来则相应安防信息*/
/*安防信息的应答信息发送*/
ResDevData[1]=data_buf[1];
if(data_buf[4]==report_switch1_order)
{
ResDevData[4] = respond_switch1;//应答开关量1
}
else if(data_buf[4]==report_switch2_order)
{
ResDevData[4] = respond_switch2;//应答开关量2
}
else
{printf("not alarm infor");break;}
ResDevData[3]=data_buf[3];
if(((data_buf[3]&0x0f)==0x04)||((data_buf[3]&0x0f)==0x05))
{
/*报警信息应答*/
if(alarm_flag==0) //未设防
{ResDevData[5]=alarm_unreply;}
else
{ResDevData[5]=alarm_reply_data;}
}
else
{ResDevData[5]=alarm_reply_data;}//设/撤防信息应答
ResDevData[6] = Bit_Xor(6,ResDevData);
write(fd,ResDevData,strlen(ResDevData));
/*调用设防子程序*/
alarm_return=Alarm_Inf(data_buf);
switch(alarm_return)
{
case -1: printf("alarm_return error\n");break;
case 2: printf("alarm_return success\n");break;
case 0: printf("解除报警设置关联矩阵为0.\n");break;
case 1: printf("报警设置关联矩阵为1.\n");break;
default: printf("alarm_return is not right.\n");
}
wait_flag = TRUE;
break;
}
}
else if(data_buf[0]==0x52) //子节点未返回信息
{
if(i==22)
{
if(con_order_flag == 1)
{
sprintf(some_data,"error");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);
}
/*无返回信息通讯失败*/
wait_flag = TRUE;
break;
}
else
{
usleep(400000);
wait_flag = TRUE;
}
}
else
{wait_flag = TRUE;}
}
if(i==22){
if(con_order_flag == 1)
{sprintf(some_data,"error");
write(client_fd,some_data,strlen(some_data));
(void)close(client_fd);}
}
else {printf("无返回信号\n");}
}
}
/**************************************************************************
*函数名:Receive_Packet 接收子节点脉冲量、模拟量函数 *
*功能:定时读取子节点发送的脉冲量、模拟量 *
*进入设定采集数据时间后调用此程序 *
*返回值:data_flag整型数1或0 *
*程序根据返回值判断此数据采集节点是否工作正常 *
*即返回值先为1后连续几次返回0则此节点工作不正常 *
***************************************************************************/
int Receive_Packet(int fd,int netwk1,BYTE AskData[6])
{
int t,res,j,show_node;
int write_flag = 0;
int data_flag;
int alarm_return;
BYTE TimeBuffer[8];
BYTE fun_code,node,netwk;
WORD data_len;
BYTE buf_pac[20];
BYTE *PacketStr,tmp_buf[20];
BYTE tittle[30];
BYTE body[50];
BYTE *SendMailStr;
BYTE ResDevData[7]={0x44,0x00,0x02,0x00,0x98,0x00,0xc6};//应答数据帧格式
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -