📄 ibmsgateway.c
字号:
#include "IBMSGateway.h"char *token,*deviceport,*localserverport;int pointnumber;point_struct point[3000];com_struct read_com;net_struct read_net;char *alarm_monitorname[50];char *alarm_deviceno[50];int alarm_index;int read_comdata_from_file(char *filename,net_struct *net,com_struct *com){ FILE *fp; int i,re; char s[30],tmp[30]; char *p; if ((fp=fopen(filename,"r"))==NULL) { re=0; } else { for(i=0;i<7;i++) { fscanf(fp,"%s",s); p=strstr(s,":"); memset(tmp,0,30); strncpy(tmp,s,p-s); if (!strcmp(tmp,"serverip")) { strcpy((*net).serverip,p+1); } if (!strcmp(tmp,"serverport")) { strcpy((*net).serverport,p+1); } if (!strcmp(tmp,"baudrate")) { strcpy((*com).baudrate,p+1); } if (!strcmp(tmp,"parity")) { strcpy((*com).parity,p+1); } if (!strcmp(tmp,"databits")) { strcpy((*com).databits,p+1); } if (!strcmp(tmp,"stopbits")) { strcpy((*com).stopbits,p+1); } if (!strcmp(tmp,"handshaking")) { strcpy((*com).handshaking,p+1); } } re=1; } fclose(fp); return re;}/*void processcomdata(){ int com_fd; fd_set readfds; int i,numbytes,checksum,processbuffbytes=0; unsigned char recvbuff[30],processbuff[256]; char sendbuff[1]={6}; int SystemNo,deviceaddress; com_fd=opencommport("/dev/ttyS1",read_com); printf("the serial comport(fd=%d) is now already...\n",com_fd); FD_ZERO(&readfds); FD_SET(com_fd,&readfds); while (1) { select(com_fd+1,&readfds,NULL,NULL,NULL); if (FD_ISSET(com_fd,&readfds)) { numbytes=read(com_fd,recvbuff,sizeof(recvbuff)); if ((numbytes==1) && (recvbuff[0]==5)) //device send inquire message { write(com_fd,sendbuff,1); } else { for (i=0;i<numbytes;i++) processbuff[processbuffbytes+i]=recvbuff[i]; processbuffbytes=processbuffbytes+numbytes; while (processbuffbytes>=7) //start to process data { if (processbuff[0]=0xFF) { checksum=0; for (i=0;i<=5;i++) checksum=checksum+processbuff[i]; if (processbuff[6]==(checksum-(checksum/128)*128))//check success { write(com_fd,sendbuff,1); if ((processbuff[1] & 0x0F)==9) //sensor event { if (((processbuff[2] & 0x1F)==5) || ((processbuff[2] & 0x1F)==11)) //smoke or temp sensor event { SystemNo=(processbuff[4]>>5)+1; deviceaddress=(processbuff[4] & 0x1F)*16+(processbuff[3] & 0x0F); if ((processbuff[1]>>4)==0) //sensor normal { } else { printf("System:%d,address:%d\n",SystemNo,deviceaddress); //then the socket will send the data } } } else if ((processbuff[1] & 0x0F)==5) //onoff operate { if ((processbuff[2] & 0x1F)==3) //reset { printf("System Reset.\n"); //then the socket will send the reset message } } } //discard these 7 data whether check success or not for (i=7;i<processbuffbytes;i++) processbuff[i-7]=processbuff[i]; processbuffbytes=processbuffbytes-7; } else { processbuffbytes=0; } } } } }}*//*void processdata(){ int localserver_fd,udp_fd,com_fd,max_fd,new_fd; struct sockaddr_in localserv_addr,udp_addr,their_addr; unsigned char strbuf[100],recvbuff[30],processbuff[256]; char sendbuff[1]={6}; fd_set readfds; int numbytes,processbuffbytes=0; int i,checksum; int SystemNo,deviceaddress; char *monitorname; char deviceno[14]; int sin_size; char tmpbuf[50]; //creat the local server socket localserver_fd=socket(AF_INET,SOCK_STREAM,0); if (localserver_fd==-1) { printf("create local server socket error.\n"); exit(1); } max_fd=localserver_fd; //set the socket to nonblock fcntl(localserver_fd,F_SETFL,O_NONBLOCK); bzero(&localserv_addr,sizeof(localserv_addr)); localserv_addr.sin_family=AF_INET; localserv_addr.sin_port=htons(atoi(localserverport)); localserv_addr.sin_addr.s_addr=INADDR_ANY; if (bind(localserver_fd,(struct sockaddr *)&localserv_addr,sizeof(struct sockaddr))==-1) { printf("bind local server port error.\n"); exit(1); } if (listen(localserver_fd,5)==-1) //local server socket is listening... { printf("local server socket listen error.\n"); exit(1); } printf("the local server socket(fd=%d) is now listening...\n",localserver_fd); //creat the udp socket udp_fd=socket(AF_INET,SOCK_DGRAM,0); if (udp_fd==-1) { printf("create device message socket error.\n"); exit(1); } bzero(&udp_addr,sizeof(udp_addr)); udp_addr.sin_family=AF_INET; udp_addr.sin_port=htons(atoi(deviceport)); inet_aton(read_net.serverip,&udp_addr.sin_addr); printf("the udp socket(fd=%d) is now already...\n",udp_fd); //open comm port com_fd=opencommport("/dev/ttyS1",read_com); printf("the serial comport(fd=%d) is now already...\n",com_fd); if (com_fd>max_fd) max_fd=com_fd; FD_ZERO(&readfds); FD_SET(localserver_fd,&readfds); FD_SET(com_fd,&readfds); while (1) { select(max_fd+1,&readfds,NULL,NULL,NULL); if (FD_ISSET(com_fd,&readfds)) { FD_SET(localserver_fd,&readfds); FD_SET(com_fd,&readfds); numbytes=read(com_fd,recvbuff,sizeof(recvbuff)); if ((numbytes==1) && (recvbuff[0]==5)) //device send inquire message { write(com_fd,sendbuff,1); } else// if (recvbuff[0]==0xFF) //device message { for (i=0;i<numbytes;i++) processbuff[processbuffbytes+i]=recvbuff[i]; processbuffbytes=processbuffbytes+numbytes; while (processbuffbytes>=7) //start to process data { if (processbuff[0]=0xFF) { //first check the sum checksum=0; for (i=0;i<=5;i++) checksum=checksum+processbuff[i]; if (processbuff[6]==(checksum-(checksum/128)*128))//check success { write(com_fd,sendbuff,1); if ((processbuff[1] & 0x0F)==9) //sensor event { if (((processbuff[2] & 0x1F)==5) || ((processbuff[2] & 0x1F)==11)) //smoke or temp sensor event { SystemNo=(processbuff[4]>>5)+1; deviceaddress=(processbuff[4] & 0x1F)*16+(processbuff[3] & 0x0F); sprintf(monitorname,"%d.%d",SystemNo,deviceaddress); if (FindDeviceNo(point,pointnumber,monitorname,deviceno)==0) //cannot find the deviceno { printf("cannot find the deviceno of %s.\n",monitorname); } else { if ((processbuff[1]>>4)==0) //sensor normal { } else //sensor alarm { printf("monitorname:%s deviceno:%s\n",monitorname,deviceno); alarm_monitorname[alarm_index]=(char *)malloc(sizeof(char)*20); strcpy(alarm_monitorname[alarm_index],monitorname); alarm_deviceno[alarm_index]=(char *)malloc(sizeof(char)*20); strcpy(alarm_deviceno[alarm_index],deviceno); alarm_index++; strcpy(strbuf,""); strcatall(strbuf,TokenSeparator,token,TokenSeparator,DeviceSeparator,deviceno,DeviceSeparator,DataSeparator,monitorname,DataSeparator,DataSeparator,"alarm",DataSeparator,NULL); sendto(udp_fd,strbuf,strlen(strbuf),0,(struct sockaddr *)&udp_addr,sizeof(struct sockaddr)); } }//end if (find deviceno) }//end if (smoke or temp sensor event) }//end if(sensor event) else if ((processbuff[1] & 0x0F)==5) //onoff operate { if ((processbuff[2] & 0x1F)==3) //reset { printf("System Reset.\n"); for (i=0;i<alarm_index;i++) { printf("%s:%s is normal.\n",alarm_deviceno[i],alarm_monitorname[i]); strcpy(strbuf,""); strcatall(strbuf,TokenSeparator,token,TokenSeparator,DeviceSeparator,alarm_deviceno[i],DeviceSeparator,DataSeparator,alarm_monitorname[i],DataSeparator,DataSeparator,"normal",DataSeparator,NULL); free(alarm_deviceno[i]); free(alarm_monitorname[i]); sendto(udp_fd,strbuf,strlen(strbuf),0,(struct sockaddr *)&udp_addr,sizeof(struct sockaddr)); } alarm_index=0; }//end if (reset) }//end if (onoff operate) }// end if (check) //discard these 7 data whether check success or not for (i=7;i<processbuffbytes;i++) processbuff[i-7]=processbuff[i]; processbuffbytes=processbuffbytes-7; }//end if (0xFF) else //discard all data { processbuffbytes=0; } }//end if (processbuffbytes) }//end if(device message) }//end if(FD_ISSET com_fd) if (FD_ISSET(localserver_fd,&readfds)) { FD_SET(localserver_fd,&readfds); FD_SET(com_fd,&readfds); sin_size=sizeof(struct sockaddr_in); if ((new_fd=accept(localserver_fd,(struct sockaddr *)&their_addr,&sin_size))==-1) { continue; } printf("local server socket get connection from %s.\n",inet_ntoa(their_addr.sin_addr)); close(new_fd); }//end if(FD_ISSET localserver_fd) } //end while} */void processdata(){ int localserver_fd,udp_fd,com_fd,max_fd,new_fd; struct sockaddr_in localserv_addr,udp_addr,their_addr; unsigned char strbuf[100],recvbuff[30],processbuff[256],processdata[10]; unsigned char *sendbuff; fd_set readfds; int numbytes,processbuffbytes=0; int i,checksum; int SystemNo,deviceaddress; char *monitorname; char deviceno[14]; int sin_size; char tmpbuf[50]; char s[10]; char mytmp[256]; char *mytmp2; long int mytmpd; time_t t; char str_t[50]; struct tm *gt; int isdigital=1; double f; //creat the local server socket localserver_fd=socket(AF_INET,SOCK_STREAM,0); if (localserver_fd==-1) { printf("create local server socket error.\n"); exit(1); } max_fd=localserver_fd; //set the socket to nonblock fcntl(localserver_fd,F_SETFL,O_NONBLOCK); bzero(&localserv_addr,sizeof(localserv_addr)); localserv_addr.sin_family=AF_INET; localserv_addr.sin_port=htons(atoi(localserverport)); localserv_addr.sin_addr.s_addr=INADDR_ANY; if (bind(localserver_fd,(struct sockaddr *)&localserv_addr,sizeof(struct sockaddr))==-1) { printf("bind local server port error.\n"); exit(1); } if (listen(localserver_fd,5)==-1) //local server socket is listening... { printf("local server socket listen error.\n"); exit(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -