?? communication.c
字號(hào):
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};//應(yīng)答數(shù)據(jù)幀格式
PacketStr = tmp_buf;
netwk = (unsigned char)netwk1;/*獲得網(wǎng)絡(luò)號(hào)*/
/*以下為查詢節(jié)點(diǎn)要求發(fā)送數(shù)據(jù)幀程序*/
for(t=0;t<23;t++) /*設(shè)定查詢間隔*/
{
if(write_flag==0)
{write(fd,AskData,strlen(AskData));}/*發(fā)送請(qǐng)求數(shù)據(jù)幀*/
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; /* 等待新的輸入訊號(hào) */
}
else if(buf_pac[0]==0x43)/*zigbee返回正確應(yīng)答*/
{
wait_flag = TRUE;
write_flag = 1;
}
else if(buf_pac[0]==0x44)//收到子節(jié)點(diǎn)發(fā)送的數(shù)據(jù)包
{
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);
/*按功能編碼判斷數(shù)據(jù)長(zhǎng)度*/
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;
}
/*發(fā)送郵件*/
sprintf(tittle,"shu ju you jian");
sprintf(body,"jie dian shu ju fa song");
for(j=0;j<data_len;j++) //循環(huán)讀取數(shù)據(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) //脈沖量數(shù)據(jù),提交網(wǎng)頁(yè)顯示
{
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; /* 等待新的輸入訊號(hào) */
return(data_flag);
}
else
{
/*如果此時(shí)有安放信息到來(lái)則相應(yīng)安防信息*/
/*安防信息的應(yīng)答信息發(fā)送*/
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));
/*調(diào)用設(shè)防子程序*/
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("解除報(bào)警設(shè)置關(guān)聯(lián)矩陣為0.\n");break;
case 1: printf("報(bào)警設(shè)置關(guān)聯(lián)矩陣為1.\n");break;
default: printf("alarm_return is not right.\n");
}
data_flag=0;
wait_flag = TRUE; /* 等待新的輸入訊號(hào) */
}
}
else if(buf_pac[0]==0x52)
{
if(t==22)
{
wait_flag = TRUE; /* 等待新的輸入訊號(hào) */
data_flag=0;
return(data_flag);
}
wait_flag = TRUE; /* 等待新的輸入訊號(hào) */
printf("||\n");
}
else
{
memset(buf_pac,'\0',sizeof(buf_pac));
wait_flag = TRUE; /* 等待新的輸入訊號(hào) */
printf("!\n");
}
}
if(t==22)
{
data_flag=0;
return(data_flag);
}
}
data_flag=0;
return(data_flag);
}
/*********************************************************************
*ASC碼轉(zhuǎn)換為十六進(jìn)制,并將兩個(gè)ASC碼數(shù)合并為一個(gè)16位的16進(jìn)制數(shù)
**********************************************************************/
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碼轉(zhuǎn)十六進(jìn)制
**********************************************************************/
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);
}
/*********************************************************************
*將兩字節(jié)的字符合成一字節(jié)的字符
**********************************************************************/
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);
}
/*********************************************************************
*將四字節(jié)的字符型合成一個(gè)long的長(zhǎng)整型
**********************************************************************/
BYTE Char2long(BYTE Data[10])
{
unsigned long int x;
x=(Data[0]<<24)+(Data[1]<<16)+(Data[2]<<8)+Data[3];
return(x);
}
/*********************************************************************
*函數(shù)名:Bit_Xor 按位異或,進(jìn)行數(shù)據(jù)校驗(yàn)
*發(fā)送數(shù)據(jù)與接收數(shù)據(jù)的校驗(yàn)規(guī)則
**********************************************************************/
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]);
}
/*********************************************************************
*函數(shù)名:Send_Mail_Packet 發(fā)送郵件數(shù)據(jù)包函數(shù)
*功能:郵件的按規(guī)定格式進(jìn)行數(shù)據(jù)打包
**********************************************************************/
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);
/*將時(shí)間按規(guī)定格式打包*/
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);
}
/*********************************************************************
*函數(shù)名:Get_Mail_Address 獲取郵箱地址
*功能: 從I2C中讀取郵件服務(wù)器郵箱地址
**********************************************************************/
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地址長(zhǎng)度
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;//目標(biāo)地址
SrcStr[i] = *src;//源地址
dst++,src++;
}
DstStr[dst_len] = '\0';
SrcStr[src_len] = '\0';
}
/*********************************************************************
*函數(shù)名:Get_User_Inf 獲取用戶信息
*功能:通過(guò)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);//讀取信息長(zhǎng)度
name_len = (int)*mail_name_len;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -