⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 new_communication.c

📁 基于S3C4510的家庭网关的通讯进程程序源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	
	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 + -