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