📄 new_communication.c
字号:
PacketStr = tmp_buf;
netwk = (unsigned char)netwk1;/*获得网络号*/
/*以下为查询节点要求发送数据帧程序*/
for(t=0;t<23;t++) /*设定查询间隔*/
{
if(write_flag==0)
{write(fd,AskData,strlen(AskData));}/*发送请求数据帧*/
else
{write_flag=0;}
usleep(1000000);
if (wait_flag==FALSE)
{
memset(buf_pac,'\0',sizeof(buf_pac));
res = read(fd,buf_pac,20);
buf_pac[res]=0;
if(res==1) /* 如果只输入 CR 则停止返回*/
{
printf("nodata\n");
wait_flag = TRUE; /* 等待新的输入讯号 */
}
else if(buf_pac[0]==0x43)/*zigbee返回正确应答*/
{
wait_flag = TRUE;
write_flag = 1;
}
else if(buf_pac[0]==0x44)//收到子节点发送的数据包
{
if((buf_pac[1]==AskData[1])&&(buf_pac[4]==report_data_fun_code))
{
fun_code=(buf_pac[3]&0x0f);
node=(buf_pac[3]>>4)&0x0f;
show_node = (int)(buf_pac[1]&0x0f);
/*按功能编码判断数据长度*/
switch(fun_code)
{
case 0x01: data_len=4;break;
case 0x02: data_len=4;break;
case 0x03: data_len=2;break;
case 0x04: data_len=1;break;
case 0x05: data_len=1;break;
case 0x06: data_len=8;break;
case 0x07: data_len=6;break;
case 0x08: data_len=6;break;
case 0x09: data_len=3;break;
case 0x0a: data_len=3;break;
case 0x0b: data_len=5;break;
case 0x0c: data_len=5;break;
case 0x0d: data_len=2;break;
case 0x0e: data_len=7;break;
default:data_len=0;
}
/*发送邮件*/
sprintf(tittle,"shu ju you jian");
sprintf(body,"jie dian shu ju fa song");
for(j=0;j<data_len;j++) //循环读取数据
{
tmp_buf[j]=buf_pac[j+5];
}
tmp_buf[data_len] = '\0';
SendMailStr = Send_Mail_Packet(netwk,node,PacketStr);
mail(DstStr,SrcStr,tittle,body,SendMailStr);
if(data_len==4) //脉冲量数据,提交网页显示
{
for(j=0;j<data_len;j++)
{NetNode[netwk1][show_node].data[j]=tmp_buf[j];}
NetNode[netwk1][show_node].data[data_len]='\0';
NetNode[netwk1][show_node].node_data = Char2long(NetNode[netwk1][show_node].data);
Get_Time(&TimeBuffer[0]);
sprintf(NetNode[netwk1][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);
}
data_flag=1;
wait_flag = TRUE; /* 等待新的输入讯号 */
return(data_flag);
}
else
{
/*如果此时有安放信息到来则相应安防信息*/
/*安防信息的应答信息发送*/
ResDevData[1]=buf_pac[1];
if(buf_pac[4]==report_switch1_order)
{
ResDevData[4] = respond_switch1;
}
else if(buf_pac[4]==report_switch2_order)
{
ResDevData[4] = respond_switch2;
}
else
{printf("not alarm infor");break;}
ResDevData[3]=buf_pac[3];
if(((buf_pac[3]&0x0f)==0x04)||((buf_pac[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(buf_pac);
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");
}
data_flag=0;
wait_flag = TRUE; /* 等待新的输入讯号 */
}
}
else if(buf_pac[0]==0x52)
{
if(t==22)
{
wait_flag = TRUE; /* 等待新的输入讯号 */
data_flag=0;
return(data_flag);
}
wait_flag = TRUE; /* 等待新的输入讯号 */
printf("||\n");
}
else
{
memset(buf_pac,'\0',sizeof(buf_pac));
wait_flag = TRUE; /* 等待新的输入讯号 */
printf("!\n");
}
}
if(t==22)
{
data_flag=0;
return(data_flag);
}
}
data_flag=0;
return(data_flag);
}
/*********************************************************************
*ASC码转换为十六进制,并将两个ASC码数合并为一个16位的16进制数 *
**********************************************************************/
BYTE Bcd2hex(BYTE x1,BYTE x2)
{
int i;
BYTE y[2];
y[0]=x1;
y[1]=x2;
for(i=0;i<2;i++)
{
if((y[i] > 0x29)&&(y[i] < 0x40))
{
y[i]=y[i]-0x30;
}
else if((y[i] > 0x40)&&(y[i] < 0x47))
{
y[i]=y[i]-0x41;
y[i]=(y[i]/16)*10+y[i]%16;
}
else if((y[i] > 0x60)&&(y[i] < 0x67))
{
y[i]=y[i]-0x51;
y[i]=(y[i]/16)*10+y[i]%16;
}
else
{
return(0xff);
}
}
return ((( y[0]<<4) & 0xf0) + ( y[1] & 0x0f));
}
/*********************************************************************
*ASC码转十六进制 *
**********************************************************************/
WORD Bcd2int(BYTE x)
{
WORD y;
if((x > 0x29)&&(x < 0x40))
{
y=(WORD)(x-0x30);
}
else if((x > 0x40)&&(x < 0x47))
{
x=x-0x41;
y=(WORD)((x/16)*10+x%16);
}
else if((x > 0x60)&&(x < 0x67))
{
x=x-0x51;
y=(WORD)((x/16)*10+x%16);
}
else
{
return(100);
}
return (y);
}
/*********************************************************************
*将两字节的字符合成一字节的字符 *
**********************************************************************/
BYTE Bcd2char(BYTE *x)
{
BYTE DsStr;
BYTE tmp[3];
int i;
memset(tmp,'\0',sizeof(tmp));
for(i=0;i<2;i++)
{
tmp[i] = *x;
x++;
}
DsStr = (((tmp[0] & 0x0f)*10)+(tmp[1] & 0xf));
return(DsStr);
}
/*********************************************************************
*将四字节的字符型合成一个long的长整型 *
**********************************************************************/
BYTE Char2long(BYTE Data[10])
{
unsigned long int x;
x=(Data[0]<<24)+(Data[1]<<16)+(Data[2]<<8)+Data[3];
return(x);
}
/*********************************************************************
*函数名:Bit_Xor 按位异或,进行数据校验 *
*发送数据与接收数据的校验规则 *
**********************************************************************/
BYTE Bit_Xor(int len,BYTE XorData[20])
{
int i;
XorData[len] = XorData[0];
for(i=1;i<len;i++)
{
XorData[len] = XorData[len] ^ XorData[i];
}
return(XorData[len]);
}
/*********************************************************************
*函数名:Send_Mail_Packet 发送邮件数据包函数 *
*功能:邮件的按规定格式进行数据打包 *
**********************************************************************/
BYTE *Send_Mail_Packet(BYTE netwk,BYTE node,BYTE * MailDataPtr)
{
int j;
WORD y1,y2,data_len;
BYTE TimeBuffer[8];
BYTE *SendMailStr,SendMailData[20];
SendMailStr = SendMailData;
memset(SendMailData,'\0',sizeof(SendMailData));
data_len = strlen(MailDataPtr);
/*将时间按规定格式打包*/
y1=date_encoder(&TimeBuffer[0]);
SendMailData[0]=(unsigned char)(y1>>8);
SendMailData[1]=(unsigned char)(y1&0x00ff);
y2=time_encoder(&TimeBuffer[0]);
SendMailData[2]=(unsigned char)(y2>>8);
SendMailData[3]=(unsigned char)(y2&0x00ff);
SendMailData[4]=((netwk<<4)+(node&0x0f));
for(j=0;j<data_len;j++)
{
SendMailData[j+5] = *MailDataPtr;
MailDataPtr++;
}
SendMailData[data_len+5] = Bit_Xor(data_len+5,SendMailData);
SendMailData[data_len+6] = '\0';
return(SendMailStr);
}
/*********************************************************************
*函数名:Get_Mail_Address 获取邮箱地址 *
*功能: 从I2C中读取邮件服务器IP地址 *
**********************************************************************/
void Get_Mail_Address(void)
{
int i,j,dst_len,src_len;
BYTE *dst,*src;
BYTE *mail_dst_len=IICReadInt(IIC_DEV_0,0x0060,1);//读取IP地址长度
BYTE *mail_src_len=IICReadInt(IIC_DEV_0,0x0080,1);
dst_len = (int)*mail_dst_len;
src_len = (int)*mail_src_len;
dst=IICReadInt(IIC_DEV_0,0x0063,dst_len);
src=IICReadInt(IIC_DEV_0,0x0083,src_len);
for(i=0,j=0;j<dst_len,i<src_len;j++,i++)
{
DstStr[j] = *dst;//目标地址
SrcStr[i] = *src;//源地址
dst++,src++;
}
DstStr[dst_len] = '\0';
SrcStr[src_len] = '\0';
}
/*********************************************************************
*函数名:Get_User_Inf 获取用户信息 *
*功能:通过I2C从24c64中读取用户配置信息 *
**********************************************************************/
void Get_User_Inf(void)
{
int i,j,name_len,add_len;
BYTE *name,*address;
BYTE *mail_name_len=IICReadInt(IIC_DEV_0,0x0020,1);
BYTE *mail_add_len=IICReadInt(IIC_DEV_0,0x0040,1);//读取信息长度
name_len = (int)*mail_name_len;
add_len = (int)*mail_add_len;
name=IICReadInt(IIC_DEV_0,0x0023,name_len);
address=IICReadInt(IIC_DEV_0,0x0043,add_len);
for(i=0,j=0;j<name_len,i<add_len;j++,i++)
{
NameStr[j] = *name;//用户名
AddressStr[i] = *address;//用户地址
name++,address++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -