📄 connect.c
字号:
A_ClientSocket[i].IEC_Flag &= (~IEC104_FLAG_START); break; case 0x07: //STARTDT RecvBuff[2] = 0x0b; A_ClientSocket[i].IEC_Flag |= IEC104_FLAG_START; CONN_SendBuff(A_ClientSocket[i].Socket_fd, RecvBuff, 6); SYS_Delay(10); if(A_ClientSocket[i].lport == OPERATOR_PORT) { for(k=1;k<=8;k++) { if(COM_Para[k].Protocol!=0) { for(j=0;j<SubDevice[k].SubTotalNum;j++) { if (SubDevice[k].SubStations[j].sub_state == SUB_STATE_ONLINE) ucPI = 0; else ucPI = 1; ret = IEC_PackNode_104(SendBuff,SubDevice[k].SubStations[j].sub_address,3,ucPI); CONN_Send104Data(0,i,SendBuff,ret); SYS_Delay(10); } } } } else { for(k=1;k<=8;k++) { if(COM_Para[k].Protocol!=0) { for(j=0;j<SubDevice[k].SubTotalNum;j++) { if (SubDevice[k].SubStations[j].sub_state == SUB_STATE_ONLINE) ucPI = 1; else ucPI = 2; ret = IEC_PackNode_TCP(SendBuff,SubDevice[k].SubStations[j].sub_address,IEC103_COT_M_per,SubDevice[k].SubStations[j].sub_FUN,ucPI); CONN_Send104Data(0,i,SendBuff,ret); SYS_Delay(10); } } } } break; case 0x01: if (RecvBuff[3]==0) { A_ClientSocket[i].IEC_Flag &=(~IEC104_FLAG_WAIT_S); A_ClientSocket[i].count_I_Send=0; } break; default : break; } } if(nRecv>=14 ) { A_ClientSocket[i].IEC_Flag |= IEC104_FLAG_RETURN_S; A_ClientSocket[i].IEC_Flag |= IEC104_FLAG_START; A_ClientSocket[i].count_I_Recv += 1; uiCount = RecvBuff[3]*0x100 + RecvBuff[2]; if (uiCount != A_ClientSocket[i].Conn_RecvCount) { A_ClientSocket[i].IEC_Flag |= IEC104_ERR_RECV; } A_ClientSocket[i].Conn_RecvCount+=2; TempBuff[0] = i; //A网,第一个字节高四位为0000,低四位为iConnect; memcpy(TempBuff+1, RecvBuff, nRecv); if ((A_ClientSocket[i].lport == OPERATOR_PORT) && (RecvBuff[IEC104_OFFSET_TI] == IEC104_TI_C_IC_NA_1) && (RecvBuff[IEC104_OFFSET_ADDR] == 0xff)) { for(m=1;m<=8;m++) { if(COM_Para[m].Protocol!=0) { for(n=0;n<SubDevice[m].SubTotalNum;n++) { TempBuff[IEC104_OFFSET_ADDR+1]=SubDevice[m].SubStations[n].sub_address; Save_Net104Data_To_Memory(m,TempBuff,nRecv+1); } } } } else { nPort = SUB_AddrToPort(RecvBuff[IEC104_OFFSET_ADDR]); if((nPort>=1)&&(nPort<=8)) { if (CONN_Need_RT(0,i,RecvBuff)) {
//PrintDebugInfo(CurDebugPort,Send_Data,RecvBuff,nRecv); //优先级高的下行命令存放在 iPort*1000 起始的共享内存区 Save_Net104Data_To_Memory(nPort,TempBuff,nRecv+1); } else { //优先级低的下行命令存放在 100000 + iPort*10000 起始的共享内存区 Save_Call104Data_To_Memory(nPort,TempBuff,nRecv+1); } } } //--------------------是否为校时命令---------------------- if ((A_ClientSocket[i].lport == OPERATOR_PORT) && (RecvBuff[6] == IEC104_TI_C_CS_NA_1))//操作员站来的校时命令 { timeBAK.mSecond = RecvBuff[IEC104_OFFSET_CONTEXT+1] * 0x100+RecvBuff[IEC104_OFFSET_CONTEXT] ; //change local time timeBAK.second = timeBAK.mSecond/1000; timeBAK.minute = RecvBuff[IEC104_OFFSET_CONTEXT+2] & 0x3f; timeBAK.hour = RecvBuff[IEC104_OFFSET_CONTEXT+3] & 0x1f; timeBAK.day = RecvBuff[IEC104_OFFSET_CONTEXT+4] & 0x1f; timeBAK.month = RecvBuff[IEC104_OFFSET_CONTEXT+5] & 0x0f; timeBAK.year = RecvBuff[IEC104_OFFSET_CONTEXT+6] & 0x7f; if(memcmp(OpeTimeBuff,RecvBuff+15,7)!=0) { memcpy(OpeTimeBuff,RecvBuff+15,7); SetTime(timeBAK); } CONN_PackCount(0,i,RecvBuff); RecvBuff[IEC104_OFFSET_COT] =IEC104_COT_M_acton; A_ClientSocket[i].Conn_SendCount += 2; CONN_SendBuff(A_ClientSocket[i].Socket_fd, RecvBuff, MIN_IEC104_FRAMELEN+9); } else if ((A_ClientSocket[i].lport == ENGINEER_PORT) && (RecvBuff[6] == IEC103_TI_M_SYN_TA_3))//工程师站来的校时命令 { timeBAK.mSecond = RecvBuff[TCP_OFFSET_CONTEXT+1] * 0x100 + RecvBuff[TCP_OFFSET_CONTEXT] ; //change local time timeBAK.second = timeBAK.mSecond/1000; timeBAK.minute = RecvBuff[TCP_OFFSET_CONTEXT+2] & 0x3f; timeBAK.hour = RecvBuff[TCP_OFFSET_CONTEXT+3] & 0x1f; timeBAK.day = RecvBuff[TCP_OFFSET_CONTEXT+4] & 0x1f; timeBAK.month = RecvBuff[TCP_OFFSET_CONTEXT+5] & 0x0f; timeBAK.year = RecvBuff[TCP_OFFSET_CONTEXT+6] & 0x7f; if(memcmp(EngTimeBuff,RecvBuff+15,7)!=0) { memcpy(EngTimeBuff,RecvBuff+15,7); SetTime(timeBAK); } CONN_PackCount(0,i,RecvBuff); A_ClientSocket[i].Conn_SendCount += 2; CONN_SendBuff(A_ClientSocket[i].Socket_fd, RecvBuff, MIN_TCP_FRAMELEN+9); } else { SendBuff[0] = START_CODE2; SendBuff[1] = 0x04; SendBuff[2] = 0x01; SendBuff[3] = 0x00; SendBuff[4] = LOBYTE(A_ClientSocket[i].Conn_RecvCount); SendBuff[5] = HIBYTE(A_ClientSocket[i].Conn_RecvCount); CONN_SendBuff(A_ClientSocket[i].Socket_fd, SendBuff, 6); } } } } } else if (PreRead==0) //客户端断开了连接 { if((A_ClientSocket[i].lport==OPERATOR_PORT)||(A_ClientSocket[i].lport==ENGINEER_PORT)) { A_Flag--; } FD_CLR(A_ClientSocket[i].Socket_fd,&A_Sockset); close(A_ClientSocket[i].Socket_fd); Conn_Clear(0,i); } else { getsockopt(A_ClientSocket[i].Socket_fd, SOL_SOCKET, SO_ERROR, &optval, &optlen); } } } } add_socket(&A_Sockset, &A_ListenSocket[0], &A_ClientSocket[0]); //////////////////////////////////////////处理A网的连接,数据接收结束////////////////////////////////////////////////// }}void *B_NetRecv(void * tmp){ struct linger lingero; int optval, optlen = sizeof(int); int i,j,k,m,n,PreRead; int ret,nRecv,uiCount; int nPort,B_Maxfd=0; int client_len,iCon_Number; unsigned char ucPI; SOCKET Client_Temp; CurrentTime timeBAK; unsigned char TempBuff[256]; unsigned char SendBuff[256],RecvBuff[256]; unsigned char OpeTimeBuff[32],EngTimeBuff[32]; struct timeval TimeOut; fd_set B_Sockset; struct sockaddr_in client_addr; client_len = sizeof(client_addr); NetInit(1); FD_ZERO(&B_Sockset); for(i=0;i<ListenPort_Num;i++) { FD_SET(B_ListenSocket[i],&B_Sockset); B_Maxfd = max(B_Maxfd,B_ListenSocket[i]+1); } while(1) { CurNetB ++ ; CheckNetConnected(1); //////////////////////////////////////////处理B网的连接,数据接收///////////////////////////////////////////////////////// for(i=0;i<MAX_CLIENT;i++) { if(B_ClientSocket[i].inUse) { B_ClientSocket[i].timeout_T1++; if (B_ClientSocket[i].timeout_T1>=TIMEOUT_TIMES) { if((B_ClientSocket[i].lport==OPERATOR_PORT)||(B_ClientSocket[i].lport==ENGINEER_PORT)) { B_Flag--; } FD_CLR(B_ClientSocket[i].Socket_fd,&B_Sockset); close(B_ClientSocket[i].Socket_fd); Conn_Clear(1,i); } } } TimeOut.tv_sec = SELECT_S; TimeOut.tv_usec = SELECT_US;// if(select(B_Maxfd,&B_Sockset,NULL,NULL,&TimeOut) != 0) { for(k=0;k<ListenPort_Num;k++) { if( (FD_ISSET(B_ListenSocket[k], &B_Sockset)) && ( ( i=GetFreeConnect(1) ) >= 0 ) ) { getsockopt(B_ListenSocket[k], SOL_SOCKET, SO_ERROR, &optval, &optlen); Client_Temp = accept(B_ListenSocket[k],(struct sockaddr *)&client_addr,&client_len); if(Client_Temp<0) { printf("accept error \n"); } else { fcntl(Client_Temp, F_SETFL, fcntl(Client_Temp, F_GETFL, 0) | O_NONBLOCK); B_ClientSocket[i].Socket_fd=Client_Temp; B_ClientSocket[i].inUse =1; switch(k) { case 0: B_Flag++; B_ClientSocket[i].lport =OPERATOR_PORT; break; case 1: B_Flag++; B_ClientSocket[i].lport=ENGINEER_PORT; break; case 2: B_ClientSocket[i].lport=MCUSET_PORT; break; case 3: B_ClientSocket[i].lport=DEBUG_PORT; break; } FD_SET(Client_Temp, &B_Sockset); B_Maxfd = max(B_Maxfd, Client_Temp+1); getsockopt(B_ClientSocket[i].Socket_fd, SOL_SOCKET, SO_ERROR, &optval, &optlen); optlen = sizeof(lingero); lingero.l_onoff=1; lingero.l_linger=1; setsockopt(B_ClientSocket[i].Socket_fd, SOL_SOCKET, SO_LINGER, &lingero, optlen); } } } for(i=0;i<MAX_CLIENT;i++) { if( (B_ClientSocket[i].inUse) && (FD_ISSET(B_ClientSocket[i].Socket_fd,&B_Sockset)) ) { getsockopt(B_ClientSocket[i].Socket_fd, SOL_SOCKET, SO_ERROR, &optval, &optlen); PreRead = recv(B_ClientSocket[i].Socket_fd, TempBuff, sizeof(TempBuff), MSG_DONTWAIT | MSG_PEEK);//Not Clean Buffer if (PreRead>0) { B_ClientSocket[i].timeout_T1=0; nRecv = RecvDataFromNet(B_ClientSocket[i].Socket_fd,RecvBuff); if(nRecv>0) { if(B_ClientSocket[i].lport==MCUSET_PORT) { if((nRecv == 6 )&&(RecvBuff[2]==0x43)) { RecvBuff[2]=0x83; CONN_SendBuff(B_ClientSocket[i].Socket_fd, RecvBuff, 6); } else { ProcessParameters(1,i,RecvBuff); } } else if(B_ClientSocket[i].lport==DEBUG_PORT) { if((nRecv == 6 )&&(RecvBuff[2]==0x43)) { RecvBuff[2]=0x83; CONN_SendBuff(B_ClientSocket[i].Socket_fd, RecvBuff, 6); } else { ProcessDebugParameters(1,i,RecvBuff); } } else { if(nRecv==6) { switch( RecvBuff[2] ) { case 0x43: //TESTFR RecvBuff[2]=0x83; CONN_SendBuff(B_ClientSocket[i].Socket_fd, RecvBuff, 6); B_ClientSocket[i].NeedCheck = 1; break; case 0x13: //STOPDT RecvBuff[2]=0x23; B_ClientSocket[i].IEC_Flag &= (~IEC104_FLAG_START); CONN_SendBuff(B_ClientSocket[i].Socket_fd, RecvBuff, 6); break; case STOPDT_CONFIRM: B_ClientSocket[i].IEC_Flag &=(~IEC104_FLAG_START); break; case 0x07: //STARTDT RecvBuff[2] = 0x0B; B_ClientSocket[i].IEC_Flag |= IEC104_FLAG_START; CONN_SendBuff(B_ClientSocket[i].Socket_fd, RecvBuff, 6); SYS_Delay(10); if(B_ClientSocket[i].lport == OPERATOR_PORT) { for(k=1;k<=8;k++) { if(COM_Para[k].Protocol!=0) { for(j=0;j<SubDevice[k].SubTotalNum;j++) { if (SubDevice[k].SubStations[j].sub_state == SUB_STATE_ONLINE) ucPI = 0; else ucPI = 1; ret = IEC_PackNode_104(SendBuff,SubDevice[k].SubStations[j].sub_address,3,ucPI); CONN_Send104Data(1,i,SendBuff,ret); SYS_Delay(10); } } } } else { for(k=1;k<=8;k++) { if(COM_Para[k].Protocol!=0) { for(j=0;j<SubDevice[k].SubTotalNum;j++) { if (SubDevice[k].SubStations[j].sub_state == SUB_STATE_ONLINE) ucPI = 1; else ucPI = 2; ret = IEC_PackNode_TCP(SendBuff,SubDevice[k].SubStations[j].sub_address,IEC103_COT_M_per,SubDevice[k].SubStations[j].sub_FUN,ucPI); CONN_Send104Data(1,i,SendBuff,ret); SYS_Delay(10); } } } } break; case 0x01: if (RecvBuff[3]==0) { B_ClientSocket[i].IEC_Flag &=(~IEC104_FLAG_WAIT_S); B_ClientSocket[i].count_I_Send=0; } break; default : break; } } if(nRecv>=14) { B_ClientSocket[i].IEC_Flag |= IEC104_FLAG_RETURN_S; B_ClientSocket[i].IEC_Flag |= IEC104_FLAG_START; B_ClientSocket[i].count_I_Recv += 1; uiCount = RecvBuff[3]*0x100 + RecvBuff[2]; if (uiCount != B_ClientSocket[i].Conn_RecvCount) { B_ClientSocket[i].IEC_Flag |= IEC104_ERR_RECV; } B_ClientSocket[i].Conn_RecvCount+=2; TempBuff[0] = 0x10+i; //B网,第一个字节高四位为0001,低四位为iConnect; memcpy(TempBuff+1, RecvBuff, nRecv); if ((B_ClientSocket[i].lport == OPERATOR_PORT) && (RecvBuff[IEC104_OFFSET_TI] == IEC104_TI_C_IC_NA_1) && (RecvBuff[IEC104_OFFSET_ADDR] == 0xff)) //来自操作员站或者远动站的总召唤命令 { for(m=1;m<=8;m++) { if(COM_Para[m].Protocol!=0) { for(n=0;n<SubDevice[m].SubTotalNum;n++) { TempBuff[IEC104_OFFSET_ADDR+1]=SubDevice[m].SubStations[n].sub_address; Save_Net104Data_To_Memory(m,TempBuff,nRecv+1); } } } } else { nPort = SUB_AddrToPort(RecvBuff[IEC104_OFFSET_ADDR]); if((nPort>=1)&&(nPort<=8)) { if(CONN_Need_RT(1,i,RecvBuff)) { Save_Net104Data_To_Memory(nPort,TempBuff,nRecv+1); } else { Save_Call104Data_To_Memory(nPort,TempBuff,nRecv+1); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -