123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include "pxTools.h"
- #include "pxEpoll.h"
- #include "JMcan.h"
- #include "JMrtk.h"
- extern POSTDATABUF_S postData;
- static int rtkepollfd=-1;
- static int rtksock=-1;
- static int recvTimeout=0;
- static PXEPOLL_S *recvEpoll=NULL;
- typedef struct RTKSENDMSG{
- char *msg;
- int len;
- }RTKSENDMSG_S;
- void rtk_conn(PXTIMER_S *p);
- void RTK_recv(PXEPOLL_S *epoll)
- {
- char buf[1024]={0};
- ssize_t s = read(epoll->clientfd,buf,sizeof(buf));
- int sta=0;
- if(s>0)
- {
- buf[s]=0;
- pxLog(EVENT,"[RTK] recv data:%s",buf);
- //recv data:$GNGGA,125805.00,3006.77639511,N,11514.70776703,E,4,47,0.4,40.2165,M,-10.4074,M,01,0*5C
- int dashCount=0;
- recvTimeout=0;
- for(int x=0;x<s;x++)
- {
- if(buf[x]==',' && ++dashCount==13)
- {
- int flag=atoi(buf+x)+1;
- if(flag==0 || flag>4)
- {
- //rtk状态异常
- close(rtksock);
- pxLog(EVENT,"[RTK] statu wrong:%d,reconnect",flag);
- epollDel(recvEpoll);
- rtksock=-1;
- recvEpoll=NULL;
- timerAdd(rtkepollfd,0,60000,0,rtk_conn,NULL);
- }
- else
- {
- //rtk状态正常
- sta=1;
- }
- }
- }
- }
- else
- {
- pxLog(EVENT,"[RTK] connect closed");
- epollDel(recvEpoll);
- rtksock=-1;
- recvEpoll=NULL;
- timerAdd(rtkepollfd,0,60000,0,rtk_conn,NULL);
- }
- pxLog(DEBUG,"[RTK] statu %d",sta);
- postData.status.rtkconn=sta;
- }
- void rtk_conn(PXTIMER_S *p)
- {
- pxLog(INIT,"[RTK] communication Init");
- int sock=0;
- if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- pxLog(ERROR,"[RTK] socket error:%d,retry in 3 sec",sock);
- timerAdd(rtkepollfd,0,3000,0,rtk_conn,NULL);
- return;
- }
- struct sockaddr_in my_addr;
- my_addr.sin_family = AF_INET;
- my_addr.sin_port = htons(SERIAL_SERVER_PORT6_PC_PORT);
- if (inet_pton(AF_INET, SERIAL_SERVER_PORT6_IP, &(my_addr.sin_addr)) <= 0)
- {
- close(sock);
- pxLog(ERROR,"[RTK] RTK ip parse error,retry in 3 sec");
- timerAdd(rtkepollfd,0,3000,0,rtk_conn,NULL);
- return;
- }
- bzero(&(my_addr.sin_zero),8);
- // 设置连接超时时间
- struct timeval timeout={2,0};
- if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) < 0
- || setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)))
- {
- close(sock);
- pxLog(ERROR,"[RTK] socket set timeout error,retry in 3 sec");
- timerAdd(rtkepollfd,0,3000,0,rtk_conn,NULL);
- return;
- }
-
- // 连接到服务器
- if (connect(sock, (struct sockaddr*)&my_addr, sizeof(my_addr)) == -1)
- {
- close(sock);
- pxLog(ERROR,"[RTK] connect error");
- timerAdd(rtkepollfd,0,3000,0,rtk_conn,NULL);
- return;
- }
- pxLog(INIT,"[RTK] connect sucess");
- rtksock=sock;
- recvEpoll=epollAdd(rtkepollfd,sock,RTK_recv,NULL,NULL);
- }
- void rtkkeepAlivetimer(PXTIMER_S *p)
- {
- if(rtksock>0 && recvEpoll!=NULL && recvTimeout++>=3)
- {
- //rtk状态异常
- pxLog(EVENT,"[RTK] recv timeout");
- epollDel(recvEpoll);
- rtksock=-1;
- recvEpoll=NULL;
- timerAdd(rtkepollfd,0,60000,0,rtk_conn,NULL);
- }
- }
- void rtkthread()
- {
- pxLog(INIT,"[RTK] start thread");
- rtkepollfd=epollInit("RTK");
-
- if(!timerAdd(rtkepollfd,0,10*1000,1,rtkkeepAlivetimer,NULL))
- {
- pxLog(ERROR,"[RTK] rtk add keepalive timer failed");
- }
- rtk_conn(NULL);
- epollMain(rtkepollfd,"RTK");
- }
- void rtksendmsgtimer(PXTIMER_S *p)
- {
- RTKSENDMSG_S *rtksm=(RTKSENDMSG_S*)p->param;
- if(rtksock==-1)
- {
- pxLog(WARNING,"[RTK] send socks is -1");
- }
- else
- {
- int i=send(rtksock, rtksm->msg, rtksm->len,0);
- if(i<=0)
- {
- pxLog(WARNING,"[RTK] send ret %d",i);
- }
- else
- {
- pxLog(PACKGE,"[RTK] send data %d",i);
- }
- }
- free(rtksm->msg);
- free(rtksm);
- }
- void rtksend(char *data,int len)
- {
- if(rtkepollfd==-1)
- {
- pxLog(DEBUG,"[RTK] send rtkepollfd is -1");
- return;
- }
- char *msg=(char*)malloc(len);
- memcpy(msg,data,len);
- RTKSENDMSG_S *rtksm=new(RTKSENDMSG_S);
- rtksm->msg=msg;
- rtksm->len=len;
- if(!timerAdd(rtkepollfd,0,1,0,rtksendmsgtimer,rtksm))
- {
- pxLog(ERROR,"[RTK] rtk add timer failed");
- free(rtksm->msg);
- free(rtksm);
- return;
- }
- }
|