/******************************************************************************* * File Name : TCPClient.c * Description : * Created on : 2021Äê11ÔÂ27ÈÕ * Author : www.hido-studio.com *******************************************************************************/ /******************************************************************************* * Include Files * *******************************************************************************/ #include "TCPClient.h" #include "Socket.h" #include "HIDO_Debug.h" #include "Internet.h" #include "string.h" #include "HIDO_Timer.h" #include "HIDO_Util.h" #include "Battery.h" #include "global_param.h" #include "AppConfig.h" #include "OTA.h" #include "Log.h" #include "Uart.h" /******************************************************************************* * Macro * *******************************************************************************/ #define RECONNECT_TICK HIDO_TIMER_TICK_S(3600) /******************************************************************************* * Type Definition * *******************************************************************************/ typedef enum { CONNECT_STATE_IDLE, CONNECT_STATE_CONNECTING, CONNECT_STATE_CONNECTED, CONNECT_STATE_CLOSED, }E_ConnectState; /******************************************************************************* * Local Variable * *******************************************************************************/ static HIDO_INT32 l_i32RTKClientSocket = 0; static E_ConnectState l_eConnectState = CONNECT_STATE_IDLE; static HIDO_UINT32 l_u32ConnectFailedCnt = 0; static HIDO_UINT32 l_u32ConnectTick = 0; static HIDO_UINT32 l_u32ReConnectTick = 0; static HIDO_UINT8 l_au8CmdBuff[1024]; /******************************************************************************* * Local Function Declaration * *******************************************************************************/ /******************************************************************************* * Local Function * *******************************************************************************/ /******************************************************************************* * Function Name : RTKClient_DataProc * Description : * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2021Äê11ÔÂ27ÈÕ *******************************************************************************/ static HIDO_INT32 RTKClient_DataProc(HIDO_UINT8 *_u8Data, HIDO_UINT32 _u32Len) { Uart_Send(UART_ID_GPS, _u8Data, _u32Len); return HIDO_OK; } /******************************************************************************* * Function Name : RTKClient_SocketEventProc * Description : * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2021Äê11ÔÂ27ÈÕ *******************************************************************************/ static HIDO_VOID RTKClient_SocketEventProc(HIDO_INT32 _i32SockID, E_SocketEvent _eEvent, HIDO_VOID *_pData) { switch(_eEvent) { case SOCKET_EVENT_CONNECT_FAILED: { l_u32ConnectFailedCnt++; if(l_eConnectState == CONNECT_STATE_CONNECTING) { l_eConnectState = CONNECT_STATE_CLOSED; l_u32ReConnectTick = HIDO_TimerGetTick(); } break; } case SOCKET_EVENT_CONNECTED: { l_u32ConnectFailedCnt = 0; if(l_eConnectState == CONNECT_STATE_CONNECTING) { l_eConnectState = CONNECT_STATE_CONNECTED; } break; } case SOCKET_EVENT_CLOSED: { l_eConnectState = CONNECT_STATE_CLOSED; l_u32ReConnectTick = HIDO_TimerGetTick(); break; } case SOCKET_EVENT_RECV_DATA: { HIDO_INT32 i32Ret = 0; HIDO_UINT32 u32RecvLen = 0; i32Ret = Socket_Recv(l_i32RTKClientSocket, l_au8CmdBuff, sizeof(l_au8CmdBuff) - 1, &u32RecvLen); if(HIDO_OK == i32Ret) { RTKClient_DataProc(l_au8CmdBuff, u32RecvLen); } break; } default: { break; } } } /******************************************************************************* * Global Function * *******************************************************************************/ /******************************************************************************* * Function Name : * Description : * Input : * Output : * Return : * Author : www.hido-studio.com * Modified Date: : 2021Äê11ÔÂ27ÈÕ *******************************************************************************/ HIDO_INT32 RTKClient_Poll(void) { if (Internet_IsIPReady() == HIDO_TRUE) { HIDO_UINT32 u32CurTick = HIDO_TimerGetTick(); switch(l_eConnectState) { case CONNECT_STATE_IDLE: { if((u32CurTick - l_u32ConnectTick) > RECONNECT_TICK) { l_u32ConnectTick = u32CurTick; l_eConnectState = CONNECT_STATE_CONNECTING; HIDO_CHAR acIP[16]; HIDO_UtilSnprintf(acIP, sizeof(acIP), "%u.%u.%u.%u", g_com_map[TCP_IP_0], g_com_map[TCP_IP_1], g_com_map[TCP_IP_2], g_com_map[TCP_IP_3]); Socket_Connect(l_i32RTKClientSocket, (HIDO_CHAR *) l_au8CmdBuff, g_com_map[TCP_PORT]); } break; } case CONNECT_STATE_CLOSED: { if(l_u32ConnectFailedCnt >= 3) { l_eConnectState = CONNECT_STATE_IDLE; l_u32ConnectTick = u32CurTick; } else { if((u32CurTick - l_u32ReConnectTick) > HIDO_TIMER_TICK_S(10)) { l_u32ReConnectTick = u32CurTick; HIDO_CHAR acIP[16]; HIDO_UtilSnprintf(acIP, sizeof(acIP), "%u.%u.%u.%u", g_com_map[TCP_IP_0], g_com_map[TCP_IP_1], g_com_map[TCP_IP_2], g_com_map[TCP_IP_3]); Socket_Connect(l_i32RTKClientSocket, (HIDO_CHAR *) l_au8CmdBuff, g_com_map[TCP_PORT]); } } break; } default: { break; } } } else { l_eConnectState = CONNECT_STATE_IDLE; l_u32ConnectTick = (HIDO_UINT32)-RECONNECT_TICK; } return HIDO_OK; } /******************************************************************************* * Function Name : RTKClient_ReportData * Description : * Input : None * Output : None * Return : HIDO_OK ³É¹¦,HIDO_ERR ʧ°Ü * Author : www.hido-studio.com * Modified Date: : 2021Äê11ÔÂ27ÈÕ *******************************************************************************/ HIDO_INT32 RTKClient_ReportData(HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len) { if(CONNECT_STATE_CONNECTED == l_eConnectState) { Socket_Send(l_i32RTKClientSocket, _pu8Data, _u32Len); } return HIDO_OK; } /******************************************************************************* * Function Name : RTKClient_Init * Description : * Input : None * Output : None * Return : * Author : www.hido-studio.com * Modified Date: : 2021Äê11ÔÂ27ÈÕ *******************************************************************************/ HIDO_INT32 RTKClient_Init(void) { l_eConnectState = CONNECT_STATE_IDLE; l_u32ConnectTick = (HIDO_UINT32)-RECONNECT_TICK; Socket_Create(&l_i32RTKClientSocket, SOCKET_TYPE_TCP, RTKClient_SocketEventProc, HIDO_NULL); return HIDO_OK; }