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

📄 new_communication.c

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