#include #include #include #include #include #include #include #include #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;x4) { //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; } }