From 67ca69985af9109a0603a1cde71f21b940c059ff Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期四, 15 五月 2025 09:12:53 +0800 Subject: [PATCH] 完全将免布线标签代码移植过来版本 --- keil/include/components/internet/src/AIR780ESocket.c | 513 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 513 insertions(+), 0 deletions(-) diff --git a/keil/include/components/internet/src/AIR780ESocket.c b/keil/include/components/internet/src/AIR780ESocket.c new file mode 100644 index 0000000..82bee1c --- /dev/null +++ b/keil/include/components/internet/src/AIR780ESocket.c @@ -0,0 +1,513 @@ +/******************************************************************************* + * File Name : Socket.c + * Description : + * Created on : 2018年5月22日 + * Author : 杜键 + *******************************************************************************/ + +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "Socket.h" +#include "string.h" +#include "stdlib.h" +#include "AIR780EDriver.h" +#include "AIR780EFSM.h" +#include "HIDO_FSM.h" +#include "HIDO_Timer.h" +#include "HIDO_Util.h" +#include "HIDO_VLQueue.h" +#include "HIDO_ArraryQueue.h" +#include "HIDO_ATLite.h" +#include "HIDO_Debug.h" +#include "Module.h" +#include "ATConfig.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + +/******************************************************************************* + * Local Variable * + *******************************************************************************/ +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780ESocketConnect) /* SOCKET连接状态 */ +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780ESocketClose) /* SOCKET关闭状态 */ +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780ESocketSendData) /* SOCKET发送数据状态 */ +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780ESocketSendAck) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780ESocketHeartConfig) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780ESocketHeartbeat) + +static HIDO_BOOL l_abSocketUnAck[SOCKET_NUM]; +static HIDO_UINT32 l_au32SocketUnAckTick[SOCKET_NUM]; +static HIDO_UINT32 l_au32SocketSendTick[SOCKET_NUM]; + +/******************************************************************************* + * Local Function Declaration * + *******************************************************************************/ + +/******************************************************************************* + * Local Function * + *******************************************************************************/ + +/******************************************************************************* + * Global Function * + *******************************************************************************/ + +/******************************************************************************* + * State Name : AIR780ESocketHeartConfig + * Parent State : AIR780E + * Description : + * Author : 杜键 + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780ESocketHeartConfig, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL) +{ + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + static HIDO_INT32 l_i32SocketID = 0; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_i32SocketID = (HIDO_INT32) _pArg; + HIDO_ATLiteCmdSend(pstATDevice, HIDO_TIMER_TICK_S(30), "AT^HEARTCONFIG=1,%d,%u\r\n", l_i32SocketID, Socket_GetHeartbeatFreq(l_i32SocketID)); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + break; + } + case HIDO_AT_EVENT_ERROR: + case HIDO_AT_EVENT_OK: + { + + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780ESocketHeartbeat), HIDO_NULL); + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780ESocketHeartbeat + * Parent State : AIR780E + * Description : + * Author : 杜键 + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780ESocketHeartbeat, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL) +{ + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + static HIDO_INT32 l_i32SocketID = 0; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_i32SocketID = (HIDO_INT32) _pArg; + HIDO_ATLiteCmdSend(pstATDevice, HIDO_TIMER_TICK_S(30), "AT^HEARTBEATHEX=%d,%u,%s\r\n", l_i32SocketID, + strlen(Socket_GetHeartbeatData(l_i32SocketID)) / 2, Socket_GetHeartbeatData(l_i32SocketID)); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + break; + } + case HIDO_AT_EVENT_ERROR: + case HIDO_AT_EVENT_OK: + { + + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780ESocketConnect + * Parent State : AIR780E + * Description : + * Author : 杜键 + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780ESocketConnect, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL) +{ + static HIDO_INT32 l_i32SocketID = 0; + static HIDO_UINT32 l_u32FailedCnt = 0; + + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + HIDO_UINT32 u32FSMTimerID = ((ST_AIR780EDriverData *)pstATDevice->m_pUserData)->m_u32FSMTimerID; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_i32SocketID = (HIDO_INT32) _pArg; + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CIPSTART=%d,\"%s\",\"%s\",%u\r\n", l_i32SocketID, + Socket_GetType(l_i32SocketID) == SOCKET_TYPE_TCP ? "TCP" : "UDP", + Socket_GetRemoteAddr(l_i32SocketID), Socket_GetRemotePort(l_i32SocketID)); + + HIDO_FSMStartTimer(u32FSMTimerID, HIDO_TIMER_TYPE_ONCE, HIDO_TIMER_TICK_S(180), _pstFSM, AIR780E_EVENT_DELAY); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + HIDO_TimerCancel(u32FSMTimerID); + break; + } + case HIDO_AT_EVENT_OK: + { + break; + } + case HIDO_AT_EVENT_ERROR: + { + Socket_OnConnectFailed(l_i32SocketID); + + l_u32FailedCnt++; + if(l_u32FailedCnt >= 3) + { + l_u32FailedCnt = 0; + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780E), HIDO_NULL); + } + else + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + } + break; + } + case AIR780E_EVENT_NUM_0: + case AIR780E_EVENT_NUM_1: + case AIR780E_EVENT_NUM_2: + case AIR780E_EVENT_NUM_3: + case AIR780E_EVENT_NUM_4: + case AIR780E_EVENT_NUM_5: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + HIDO_UINT32 u32ConnectID = 0; + HIDO_DataStruct stEvent; + + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "%d, %p\r\n", + &u32ConnectID, &stEvent) != 2) + { + break; + } + + if (l_i32SocketID == u32ConnectID) + { + if (strncmp(stEvent.m_pData, "ALREADY CONNECT", stEvent.m_u32Len) == 0 + || strncmp(stEvent.m_pData, "CONNECT OK", stEvent.m_u32Len) == 0) + { + l_u32FailedCnt = 0; + Socket_OnConnected(l_i32SocketID); + + if(Socket_UseHeartbeat(l_i32SocketID)) + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780ESocketHeartConfig), HIDO_NULL); + + } + else + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + } + + break; + } + else if (strncmp(stEvent.m_pData, "CONNECT FAIL", stEvent.m_u32Len) == 0) + { + Socket_OnConnectFailed(l_i32SocketID); + + l_u32FailedCnt++; + if (l_u32FailedCnt >= 3) + { + l_u32FailedCnt = 3; + Socket_Destroy(l_i32SocketID); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + } + else + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + } + } + } + + break; + } + case AIR780E_EVENT_DELAY: + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780ESocketClose + * Parent State : AIR780E + * Description : + * Author : 杜键 + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780ESocketClose, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL) +{ + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + static HIDO_INT32 l_i32SocketID = 0; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_i32SocketID = (HIDO_INT32) _pArg; + HIDO_ATLiteCmdSend(pstATDevice, HIDO_TIMER_TICK_S(30), "AT+CIPCLOSE=%d\r\n", l_i32SocketID); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + break; + } + case HIDO_AT_EVENT_ERROR: + case HIDO_AT_EVENT_OK: + { + Socket_OnClosed(l_i32SocketID); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + break; + } + case AIR780E_EVENT_NUM_0: + case AIR780E_EVENT_NUM_1: + case AIR780E_EVENT_NUM_2: + case AIR780E_EVENT_NUM_3: + case AIR780E_EVENT_NUM_4: + case AIR780E_EVENT_NUM_5: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + HIDO_UINT32 u32ConnectID = 0; + HIDO_DataStruct stEvent; + + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "%d, %p\r\n", + &u32ConnectID, &stEvent) != 2) + { + break; + } + + if (strncmp(stEvent.m_pData, "CLOSE OK", stEvent.m_u32Len) == 0) + { + Socket_OnClosed(l_i32SocketID); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + break; + } + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780ESocketSendData + * Parent State : Ready + * Description : + * Author : 杜键 + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780ESocketSendData, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL) +{ + static HIDO_INT32 l_i32SocketID = 0; + static HIDO_VLQMemberStruct *l_pstMember = HIDO_NULL; + + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + HIDO_VLQStruct *pstSendQueue = HIDO_NULL; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_i32SocketID = (HIDO_INT32) _pArg; + + pstSendQueue = Socket_GetSocketSendQueue(l_i32SocketID); + if(HIDO_NULL == pstSendQueue) + { + break; + } + + l_pstMember = HIDO_VLQGetDequeueMember(pstSendQueue); + if(HIDO_NULL == l_pstMember) + { + break; + } + + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CIPSEND=%d,%u\r\n", l_i32SocketID, l_pstMember->m_u32DataLen); + break; + } + case HIDO_EVENT_EXIT: + { + l_pstMember = HIDO_NULL; + HIDO_ATLiteCmdSendOver(pstATDevice); + break; + } + case HIDO_AT_EVENT_OK: + { + //HIDO_Debug("OK\r\n"); + break; + } + case HIDO_AT_EVENT_ERROR: + { + Socket_OnClosed(l_i32SocketID); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + break; + } + case AIR780E_EVENT_ACK: + { + if(HIDO_ATLiteGetDebugFlag() == HIDO_TRUE) + { + HIDO_DebugHex((HIDO_UINT8 *)l_pstMember->m_pDataAddr, l_pstMember->m_u32DataLen); + } + + HIDO_ATLiteDataSend(pstATDevice, 20000, (HIDO_UINT8 *)l_pstMember->m_pDataAddr, l_pstMember->m_u32DataLen); + break; + } + case AIR780E_EVENT_NUM_0: + case AIR780E_EVENT_NUM_1: + case AIR780E_EVENT_NUM_2: + case AIR780E_EVENT_NUM_3: + case AIR780E_EVENT_NUM_4: + case AIR780E_EVENT_NUM_5: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + HIDO_UINT32 u32ConnectID = 0; + HIDO_DataStruct stEvent; + + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "%d, %p\r\n", + &u32ConnectID, &stEvent) != 2) + { + break; + } + + if (l_i32SocketID == u32ConnectID) + { + if (strncmp(stEvent.m_pData, "SEND OK", stEvent.m_u32Len) == 0) + { + pstSendQueue = Socket_GetSocketSendQueue(l_i32SocketID); + if (NULL == pstSendQueue) + { + break; + } + + HIDO_VLQDequeue(pstSendQueue, l_pstMember); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), NULL); + } + else if (strncmp(stEvent.m_pData, "SEND FAIL", stEvent.m_u32Len) == 0) + { + Socket_OnClosed(l_i32SocketID); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EInit), NULL); + } + } + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +HIDO_INT32 AIR780ESocket_Poll(HIDO_ATLiteDeviceStruct *_pstATDevice) +{ + static HIDO_INT32 i32LastSocketIndex = 0; + HIDO_INT32 i = 0; + HIDO_INT32 i32SocketIndex = 0; + HIDO_VLQStruct *pstSendQueue = HIDO_NULL; + HIDO_UINT32 u32CurTick = HIDO_TimerGetTick(); + + /* 先处理连接、断开、数据接收 */ + for(i32SocketIndex = 0; i32SocketIndex < SOCKET_NUM; i32SocketIndex++) + { + if(SOCKET_STATE_CONNECT == Socket_GetSocketState(i32SocketIndex)) + { + Socket_SetSocketState(i32SocketIndex, SOCKET_STATE_CLOSE_BEFORE_CONNECT); + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780ESocketClose), (HIDO_VOID *)(HIDO_UINT32)i32SocketIndex); + return HIDO_OK; + } + else if(SOCKET_STATE_CLOSE_BEFORE_CONNECT == Socket_GetSocketState(i32SocketIndex)) + { + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780ESocketConnect), (HIDO_VOID *)(HIDO_UINT32)i32SocketIndex); + return HIDO_OK; + } + else if (SOCKET_STATE_CLOSE == Socket_GetSocketState(i32SocketIndex)) + { + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780ESocketClose), + (HIDO_VOID *) (HIDO_UINT32) i32SocketIndex); + return HIDO_OK; + } + +#if 0 + /* 暂不使用发送确认检查,影响发送速率 */ + if (HIDO_TRUE == l_abSocketUnAck[i32SocketIndex]) + { + if ((u32CurTick - l_au32SocketUnAckTick[i32SocketIndex]) >= 10) + { + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780ESocketSendAck), (HIDO_VOID *)(HIDO_UINT32)i32SocketIndex); + return HIDO_OK; + } + else + { + return HIDO_ERR; + } + } +#endif + } + + /* 采用均衡的方式处理数据发送 */ + i32SocketIndex = (i32LastSocketIndex + 1) % SOCKET_NUM; + for(i = 0; i < SOCKET_NUM; i++) + { + if(SOCKET_STATE_CONNECTED == Socket_GetSocketState(i32SocketIndex)) + { + pstSendQueue = Socket_GetSocketSendQueue(i32SocketIndex); + if(pstSendQueue != HIDO_NULL) + { + if(HIDO_VLQGetDequeueMember(pstSendQueue) != HIDO_NULL) + { + i32LastSocketIndex = i32SocketIndex; + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780ESocketSendData), (HIDO_VOID *)(HIDO_UINT32)i32SocketIndex); + return HIDO_OK; + } + } + } + + i32SocketIndex = (i32SocketIndex + 1) % SOCKET_NUM; + } + + return HIDO_ERR; +} -- Gitblit v1.9.3