From 9fcacfb2735c99a9300f5054f37157e654546226 Mon Sep 17 00:00:00 2001 From: cfif Date: Wed, 4 Dec 2024 13:10:48 +0300 Subject: [PATCH] Init --- Inc/AtGsmTelitLe910_DefinePdpContext.h | 35 +++ Inc/AtGsmTelitLe910_EstablishConnection.h | 47 +++ Inc/AtGsmTelitLe910_Socket.h | 14 + Inc/AtGsmTelitLe910_SocketReadData.h | 12 + Inc/AtGsmTelitLe910_SocketSendData.h | 48 +++ Inc/AtGsmTelitLe910_StartSocketService.h | 12 + Inc/AtGsmTelitLe910_StopSocketService.h | 12 + Src/AtGsmTelitLe910_DefinePdpContext.c | 159 ++++++++++ Src/AtGsmTelitLe910_EstablishConnection.c | 340 ++++++++++++++++++++++ Src/AtGsmTelitLe910_SocketReadData.c | 67 +++++ Src/AtGsmTelitLe910_SocketSendData.c | 177 +++++++++++ Src/AtGsmTelitLe910_StartSocketService.c | 70 +++++ Src/AtGsmTelitLe910_StopSocketService.c | 15 + modular.json | 17 ++ 14 files changed, 1025 insertions(+) create mode 100755 Inc/AtGsmTelitLe910_DefinePdpContext.h create mode 100755 Inc/AtGsmTelitLe910_EstablishConnection.h create mode 100755 Inc/AtGsmTelitLe910_Socket.h create mode 100644 Inc/AtGsmTelitLe910_SocketReadData.h create mode 100755 Inc/AtGsmTelitLe910_SocketSendData.h create mode 100755 Inc/AtGsmTelitLe910_StartSocketService.h create mode 100755 Inc/AtGsmTelitLe910_StopSocketService.h create mode 100755 Src/AtGsmTelitLe910_DefinePdpContext.c create mode 100755 Src/AtGsmTelitLe910_EstablishConnection.c create mode 100644 Src/AtGsmTelitLe910_SocketReadData.c create mode 100755 Src/AtGsmTelitLe910_SocketSendData.c create mode 100755 Src/AtGsmTelitLe910_StartSocketService.c create mode 100755 Src/AtGsmTelitLe910_StopSocketService.c create mode 100755 modular.json diff --git a/Inc/AtGsmTelitLe910_DefinePdpContext.h b/Inc/AtGsmTelitLe910_DefinePdpContext.h new file mode 100755 index 0000000..523f852 --- /dev/null +++ b/Inc/AtGsmTelitLe910_DefinePdpContext.h @@ -0,0 +1,35 @@ +// +// Created by xemon on 10.05.23. +// + +#ifndef ATGSMSIMCOMA7600_DEFINEPDPCONTEXT_H +#define ATGSMSIMCOMA7600_DEFINEPDPCONTEXT_H + +#include "AtCmdCommon.h" + +typedef enum { + AtGsmTelitLe910_PdpType_IP, + AtGsmTelitLe910_PdpType_IPV6, + AtGsmTelitLe910_PdpType_IPV4V6 +} eAtGsmTelitLe910_PdpType; + + +//AtCommandResult AtGsmSimComA7600_DefinePdpContext( +// tAtCmd *env, uint8_t cid, eAtGsmSimComA7600_PdpType pdpType, const char *apn, uint8_t apnLen +//); + +AtCommandResult AtGsmTelitLe910_DefinePdpContext( + tAtCmd *env, uint8_t cid, eAtGsmTelitLe910_PdpType pdpType, const char *apn, uint8_t apnLen +); + + +AtCommandResult AtGsmTelitLe910_PdpActivate(tAtCmd *env, uint8_t cid); +AtCommandResult AtGsmTelitLe910_PdpDeactivate(tAtCmd *env, uint8_t cid); + +#define AtGsmTelitLe910_DefinePdpIpContextStaticApn(ENV, CID, APN) AtGsmTelitLe910_DefinePdpContext(ENV,CID,AtGsmSimComA7600_PdpType_IPV4V6,APN,sizeof(APN)-1) + +//AtCommandResult AtGsmSimComA7600_PdpActivate(tAtCmd *env, uint8_t cid); +//AtCommandResult AtGsmSimComA7600_PdpDeactivate(tAtCmd *env, uint8_t cid); + +//#define AtGsmSimComA7600_DefinePdpIpContextStaticApn(ENV, CID, APN) AtGsmSimComA7600_DefinePdpContext(ENV,CID,AtGsmSimComA7600_PdpType_IP,APN,sizeof(APN)-1) +#endif //ATGSMSIMCOMA7600_DEFINEPDPCONTEXT_H diff --git a/Inc/AtGsmTelitLe910_EstablishConnection.h b/Inc/AtGsmTelitLe910_EstablishConnection.h new file mode 100755 index 0000000..7d7daf8 --- /dev/null +++ b/Inc/AtGsmTelitLe910_EstablishConnection.h @@ -0,0 +1,47 @@ +// +// Created by xemon on 10.05.23. +// + +#ifndef ATGSMSIMCOMA7600_ESTEBLISHCONNECTION_H +#define ATGSMSIMCOMA7600_ESTEBLISHCONNECTION_H + +#include "AtCmdCommon.h" + +typedef enum { + eAtGsmSimComA7600_IpType_TCP, + eAtGsmSimComA7600_IpType_UDP, +} eAtGsmSimComA7600_IpType; + + +//AtCommandResult AtGsmSimComA7600_EstablishConnection( +// tAtCmd *env, +// uint8_t linkNum, +// eAtGsmSimComA7600_IpType type, +// char *srvIp, +// uint8_t srvIpLen, +// uint16_t srvPort, +// uint16_t localPort +//); + +AtCommandResult AtGsmTelitLe910_EstablishConnection( + tAtCmd *env, + uint8_t linkNum, + eAtGsmSimComA7600_IpType type, + char *srvIp, + uint8_t srvIpLen, + uint16_t srvPort, + uint16_t localPort +); + +//#define AtGsmSimComA7600_EstablishTcpConnStatic(ENV, LNK, SRV, PORT) AtGsmSimComA7600_EstablishConnection(ENV,LNK,eAtGsmSimComA7600_IpType_TCP,SRV,sizeof(SRV)-1,PORT,0) + +#define AtGsmSimComA7600_EstablishTcpConnStatic(ENV, LNK, SRV, PORT) AtGsmTelitLe910_EstablishConnection(ENV,LNK,eAtGsmSimComA7600_IpType_TCP,SRV,sizeof(SRV)-1,PORT,0) + +//AtCommandResult AtGsmSimComA7600_HasConnection(tAtCmd *env, uint8_t linkNum, bool *status); +AtCommandResult AtGsmTelitLe910_HasConnection(tAtCmd *env, uint8_t linkNum, bool *status); + + +AtCommandResult AtGsmTelitLe910_CloseConnection(tAtCmd *env, uint8_t linkNum); +//AtCommandResult AtGsmSimComA7600_CloseConnection(tAtCmd *env, uint8_t linkNum); + +#endif //ATGSMSIMCOMA7600_ESTEBLISHCONNECTION_H diff --git a/Inc/AtGsmTelitLe910_Socket.h b/Inc/AtGsmTelitLe910_Socket.h new file mode 100755 index 0000000..03ca856 --- /dev/null +++ b/Inc/AtGsmTelitLe910_Socket.h @@ -0,0 +1,14 @@ +// +// Created by xemon on 10.05.23. +// + +#ifndef ATGSMSIMCOMA7600_H +#define ATGSMSIMCOMA7600_H + +#include "AtGsmTelitLe910_DefinePdpContext.h" +#include "AtGsmTelitLe910_StartSocketService.h" +#include "AtGsmTelitLe910_StopSocketService.h" +#include "AtGsmTelitLe910_EstablishConnection.h" +#include "AtGsmTelitLe910_SocketSendData.h" + +#endif //ATGSMSIMCOMA7600_H diff --git a/Inc/AtGsmTelitLe910_SocketReadData.h b/Inc/AtGsmTelitLe910_SocketReadData.h new file mode 100644 index 0000000..0777e02 --- /dev/null +++ b/Inc/AtGsmTelitLe910_SocketReadData.h @@ -0,0 +1,12 @@ +// +// Created by cfif on 16.10.2023. +// + +#ifndef MOTOTERMINAL_MAIN_ONAT435_ATGSMTELITLE910_SOCKETREADDATA_H +#define MOTOTERMINAL_MAIN_ONAT435_ATGSMTELITLE910_SOCKETREADDATA_H + +#include "AtCmdCommon.h" + +AtCommandResult xAtGsmTelit_ReadSocket(tAtCmd *env, int idSocket, uint8_t *dataSocketRead, uint32_t dataSocketReadMaxLen, uint32_t *dataSocketReadLen); + +#endif //MOTOTERMINAL_MAIN_ONAT435_ATGSMTELITLE910_SOCKETREADDATA_H diff --git a/Inc/AtGsmTelitLe910_SocketSendData.h b/Inc/AtGsmTelitLe910_SocketSendData.h new file mode 100755 index 0000000..ded9cca --- /dev/null +++ b/Inc/AtGsmTelitLe910_SocketSendData.h @@ -0,0 +1,48 @@ +// +// Created by xemon on 10.05.23. +// + +#ifndef ATGSMSIMCOMA7600_SOCKETSENDDATA_H +#define ATGSMSIMCOMA7600_SOCKETSENDDATA_H + +#include "AtCmdCommon.h" + +AtCommandResult AtGsmTelitLe910_SocketSendData( + tAtCmd *env, uint8_t linkNum, uint8_t *data, uint16_t dataLen, uint32_t timeout +); + + +AtCommandResult AtGsmTelitLe910_SocketSendDataUdp( + tAtCmd *env, + uint8_t linkNum, + uint8_t *data, + uint16_t dataLen, + char *srvIp, + uint8_t srvIpLen, + uint16_t srvPort, + uint32_t timeout +); + +#define AtGsmTelitLe910_SocketSendDataStatic(ENV, LNK, STR, TOUT) AtGsmSimComA7600_SocketSendData(ENV,LNK,(uint8_t*)STR,sizeof(STR)-1,TOUT) + +/* +AtCommandResult AtGsmSimComA7600_SocketSendData( + tAtCmd *env, uint8_t linkNum, uint8_t *data, uint16_t dataLen, uint32_t timeout +); + + +AtCommandResult AtGsmSimComA7600_SocketSendDataUdp( + tAtCmd *env, + uint8_t linkNum, + uint8_t *data, + uint16_t dataLen, + char *srvIp, + uint8_t srvIpLen, + uint16_t srvPort, + uint32_t timeout +); + +#define AtGsmSimComA7600_SocketSendDataStatic(ENV, LNK, STR, TOUT) AtGsmSimComA7600_SocketSendData(ENV,LNK,(uint8_t*)STR,sizeof(STR)-1,TOUT) +*/ + +#endif //ATGSMSIMCOMA7600_DEFINEPDPCONTEXT_H diff --git a/Inc/AtGsmTelitLe910_StartSocketService.h b/Inc/AtGsmTelitLe910_StartSocketService.h new file mode 100755 index 0000000..28a9aa8 --- /dev/null +++ b/Inc/AtGsmTelitLe910_StartSocketService.h @@ -0,0 +1,12 @@ +// +// Created by xemon on 10.05.23. +// + +#ifndef ATGSMSIMCOMA7600_STARTSOCKETSERVICE_H +#define ATGSMSIMCOMA7600_STARTSOCKETSERVICE_H + +#include "AtCmdCommon.h" + +AtCommandResult AtGsmSimComA7600_StartSocketService(tAtCmd *env); +AtCommandResult AtGsmSimComA7600_HasIp(tAtCmd *env); +#endif //ATGSMSIMCOMA7600_STARTSOCKETSERVICE_H diff --git a/Inc/AtGsmTelitLe910_StopSocketService.h b/Inc/AtGsmTelitLe910_StopSocketService.h new file mode 100755 index 0000000..dc10fb7 --- /dev/null +++ b/Inc/AtGsmTelitLe910_StopSocketService.h @@ -0,0 +1,12 @@ +// +// Created by xemon on 10.05.23. +// + +#ifndef ATGSMSIMCOMA7600_STOPSOCKETSERVICE_H +#define ATGSMSIMCOMA7600_STOPSOCKETSERVICE_H + +#include "AtCmdCommon.h" + +AtCommandResult AtGsmSimComA7600_StopSocketService(tAtCmd *env); + +#endif //ATGSMSIMCOMA7600_STOPSOCKETSERVICE_H diff --git a/Src/AtGsmTelitLe910_DefinePdpContext.c b/Src/AtGsmTelitLe910_DefinePdpContext.c new file mode 100755 index 0000000..4d18426 --- /dev/null +++ b/Src/AtGsmTelitLe910_DefinePdpContext.c @@ -0,0 +1,159 @@ +// +// Created by xemon on 10.05.23. +// +#include "AtGsmTelitLe910_DefinePdpContext.h" +#include "AtCmdCommonProtected.h" +#include "SystemDelayInterface.h" + +AtCommandResult AtGsmTelitLe910_DefinePdpContext( + tAtCmd *env, uint8_t cid, eAtGsmTelitLe910_PdpType pdpType, const char *apn, uint8_t apnLen +) { + AtCmdPrepare(env); + + if (cid > 15) { + return AT_ERROR; + } + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CGDCONT="); + AtCmdTxAddDecimalIntWithLimit(env, cid, 2); + AtCmdTxAddChar(env, ','); + + AtCmdTxAddChar(env, '"'); + switch (pdpType) { + + case AtGsmTelitLe910_PdpType_IP: + AtCmdTxAddStatic(env, "IP"); + break; + + case AtGsmTelitLe910_PdpType_IPV6: + AtCmdTxAddStatic(env, "IPV6"); + break; + case AtGsmTelitLe910_PdpType_IPV4V6: + AtCmdTxAddStatic(env, "IPV4V6"); + break; + default: + return AT_ERROR; + + } + AtCmdTxAddChar(env, '"'); + AtCmdTxAddChar(env, ','); + + + AtCmdTxAddChar(env, '"'); + AtCmdTxAdd(env, apn, apnLen); + AtCmdTxAddChar(env, '"'); + + AtCmdTxSendLn(env); + + return AtCmdOkErrAnswer(env, env->stdRxTimeout); +} + +AtCommandResult AtGsmTelitLe910_PdpActivate(tAtCmd *env, uint8_t cid) { + AtCmdPrepare(env); + + if (cid > 15) { + return AT_ERROR; + } + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT#SGACT=1,"); + AtCmdTxAddDecimalIntWithLimit(env, cid, 2); + + AtCmdTxSendLn(env); + + return AtCmdOkErrAnswer(env, env->stdRxTimeout*10); +} + +AtCommandResult AtGsmTelitLe910_PdpDeactivate(tAtCmd *env, uint8_t cid) { + AtCmdPrepare(env); + + if (cid > 15) { + return AT_ERROR; + } + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT#SGACT=0,"); + AtCmdTxAddDecimalIntWithLimit(env, cid, 2); + + AtCmdTxSendLn(env); + + return AtCmdOkErrAnswer(env, env->stdRxTimeout*10); +} +/* +AtCommandResult AtGsmSimComA7600_DefinePdpContext( + tAtCmd *env, uint8_t cid, eAtGsmSimComA7600_PdpType pdpType, const char *apn, uint8_t apnLen +) { + AtCmdPrepare(env); + + if (cid > 15) { + return AT_ERROR; + } + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CGDCONT="); + AtCmdTxAddDecimalIntWithLimit(env, cid, 2); + AtCmdTxAddChar(env, ','); + + AtCmdTxAddChar(env, '"'); + switch (pdpType) { + + case AtGsmSimComA7600_PdpType_IP: + AtCmdTxAddStatic(env, "IP"); + break; + + case AtGsmSimComA7600_PdpType_IPV6: + AtCmdTxAddStatic(env, "IPV6"); + break; + case AtGsmSimComA7600_PdpType_IPV4V6: + AtCmdTxAddStatic(env, "IPV4V6"); + break; + default: + return AT_ERROR; + + } + AtCmdTxAddChar(env, '"'); + AtCmdTxAddChar(env, ','); + + + AtCmdTxAddChar(env, '"'); + AtCmdTxAdd(env, apn, apnLen); + AtCmdTxAddChar(env, '"'); + + AtCmdTxSendLn(env); + + return AtCmdOkErrAnswer(env, env->stdRxTimeout); +} + +AtCommandResult AtGsmSimComA7600_PdpActivate(tAtCmd *env, uint8_t cid) { + AtCmdPrepare(env); + + if (cid > 15) { + return AT_ERROR; + } + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CGACT=1,"); + AtCmdTxAddDecimalIntWithLimit(env, cid, 2); + + AtCmdTxSendLn(env); + + return AtCmdOkErrAnswer(env, env->stdRxTimeout*10); +} + +AtCommandResult AtGsmSimComA7600_PdpDeactivate(tAtCmd *env, uint8_t cid) { + AtCmdPrepare(env); + + if (cid > 15) { + return AT_ERROR; + } + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CGACT=0,"); + AtCmdTxAddDecimalIntWithLimit(env, cid, 2); + + AtCmdTxSendLn(env); + + return AtCmdOkErrAnswer(env, env->stdRxTimeout*10); +} +*/ diff --git a/Src/AtGsmTelitLe910_EstablishConnection.c b/Src/AtGsmTelitLe910_EstablishConnection.c new file mode 100755 index 0000000..4acd655 --- /dev/null +++ b/Src/AtGsmTelitLe910_EstablishConnection.c @@ -0,0 +1,340 @@ +// +// Created by xemon on 10.05.23. +// +#include +#include "AtGsmTelitLe910_EstablishConnection.h" +#include "AtCmdCommonProtected.h" +#include "SystemDelayInterface.h" +#include "string.h" +#include "stdlib.h" + + +AtCommandResult AtGsmTelitLe910_EstablishConnection( + tAtCmd *env, + uint8_t linkNum, + eAtGsmSimComA7600_IpType type, + char *srvIp, + uint8_t srvIpLen, + uint16_t srvPort, + uint16_t localPort +) { + AtCmdPrepare(env); + + if (linkNum > 9) { + return AT_ERROR; + } + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT#SD="); + AtCmdTxAddDecimalIntWithLimit(env, linkNum, 1); + AtCmdTxAddChar(env, ','); + + switch (type) { + + case eAtGsmSimComA7600_IpType_TCP: + AtCmdTxAddStatic(env, "0"); + break; + + case eAtGsmSimComA7600_IpType_UDP: + AtCmdTxAddStatic(env, "1"); + break; + default: + return AT_ERROR; + + } + AtCmdTxAddChar(env, ','); + + if (srvPort) { + AtCmdTxAddDecimalIntWithLimit(env, srvPort, 5); + } + AtCmdTxAddChar(env, ','); + + if (srvIpLen) { + AtCmdTxAddChar(env, '"'); + AtCmdTxAdd(env, srvIp, srvIpLen); + AtCmdTxAddChar(env, '"'); + } + AtCmdTxAddChar(env, ','); + + AtCmdTxAddStatic(env, "0"); + + AtCmdTxAddChar(env, ','); + +// if (localPort) { + AtCmdTxAddDecimalIntWithLimit(env, localPort, 5); +// } + + AtCmdTxAddChar(env, ','); + + AtCmdTxAddStatic(env, "1"); + + AtCmdTxSendLn(env); + + uint32_t timeout = env->stdRxTimeout * 5; + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + + if (AtCmdRxBeginWithStatic(env, "OK")) { + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "CONNECT")) { + AtCmdRxClear(env); + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + + } else if (AtCmdRxBeginWithStatic(env, "+CME ERROR:")) { + AtCmdRxClear(env); + return AT_ERROR; + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + +/* +AtCommandResult AtGsmSimComA7600_EstablishConnection( + tAtCmd *env, + uint8_t linkNum, + eAtGsmSimComA7600_IpType type, + char *srvIp, + uint8_t srvIpLen, + uint16_t srvPort, + uint16_t localPort +) { + AtCmdPrepare(env); + + if (linkNum > 9) { + return AT_ERROR; + } + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CIPOPEN="); + AtCmdTxAddDecimalIntWithLimit(env, linkNum, 1); + AtCmdTxAddChar(env, ','); + + AtCmdTxAddChar(env, '"'); + switch (type) { + + case eAtGsmSimComA7600_IpType_TCP: + AtCmdTxAddStatic(env, "TCP"); + break; + + case eAtGsmSimComA7600_IpType_UDP: + AtCmdTxAddStatic(env, "UDP"); + break; + default: + return AT_ERROR; + + } + AtCmdTxAddChar(env, '"'); + AtCmdTxAddChar(env, ','); + + + if (srvIpLen) { + AtCmdTxAddChar(env, '"'); + AtCmdTxAdd(env, srvIp, srvIpLen); + AtCmdTxAddChar(env, '"'); + } + AtCmdTxAddChar(env, ','); + + if (srvPort) { + AtCmdTxAddDecimalIntWithLimit(env, srvPort, 5); + } + AtCmdTxAddChar(env, ','); + + if (localPort) { + AtCmdTxAddDecimalIntWithLimit(env, localPort, 5); + } + + AtCmdTxSendLn(env); + + uint32_t timeout = env->stdRxTimeout * 5; + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + + if (AtCmdRxBeginWithStatic(env, "OK")) { + AtCmdRxClear(env); + } else if (AtCmdRxBeginWithStatic(env, "+CIPOPEN: ")) { + AtCommandResult res=(env->rxBuffer.data[sizeof ("+CIPOPEN: X,")-1]=='0')?AT_OK:AT_ERROR; + AtCmdRxClear(env); + return res; + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} +*/ + +AtCommandResult AtGsmTelitLe910_HasConnection(tAtCmd *env, uint8_t linkNum, bool *status) { + + char pattern[9]; + memset(pattern, 0, sizeof(pattern)); + strcat(pattern, "#SS: "); + utoa(linkNum, &pattern[strlen(pattern)], 10); + strcat(pattern, ","); + + *status = false; + + AtCmdPrepare(env); + AtCmdSendStatic(env, "AT#SS\r\n"); + + uint32_t timeout = env->stdRxTimeout * 5; + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + + if (AtCmdRxBeginWithStatic(env, "OK")) { + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWith(env, pattern, strlen(pattern))) { + + if ((env->rxBuffer.data[strlen(pattern)] == '0') || (env->rxBuffer.data[strlen(pattern)] == '3')) { + *status = false; + } else { + *status = true; + } + AtCmdRxClear(env); + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + +/* +AtCommandResult AtGsmSimComA7600_HasConnection(tAtCmd *env, uint8_t linkNum, bool *status) { + + char pattern[11]; + + memcpy(pattern, "+CIPOPEN: X", 11); + + pattern[sizeof(pattern) - 1] = vAsciiStringDecimalIntToChar(linkNum); + uint8_t pattern_len = sizeof(pattern); + *status = false; + + AtCmdPrepare(env); + AtCmdSendStatic(env, "AT+CIPOPEN?\r\n"); + + uint32_t timeout = env->stdRxTimeout * 5; + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + + if (AtCmdRxBeginWithStatic(env, "OK")) { + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "+CIPOPEN")) { + if (AtCmdRxBeginWith(env, pattern, pattern_len)) { + if (env->rxBuffer.data[pattern_len] == '\r') + *status = false; + else if (env->rxBuffer.data[pattern_len] == ',') { + *status = true; + } + } + AtCmdRxClear(env); + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} +*/ + + +AtCommandResult AtGsmTelitLe910_CloseConnection( + tAtCmd *env, + uint8_t linkNum +) { +// AtCmdPrepare(env); + + if (linkNum > 9) { + return AT_ERROR; + } + +// AtCmdPrepare(env); + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT#SH="); + AtCmdTxAddDecimalIntWithLimit(env, linkNum, 2); + AtCmdTxSendLn(env); + + //debug_printf(env->io, "AT#SH=%u\r\n", idSocket); + return AtCmdOkErrAnswer(env, 5 * env->stdRxTimeout); + +} + +/* +AtCommandResult AtGsmSimComA7600_CloseConnection( + tAtCmd *env, + uint8_t linkNum +) { + AtCmdPrepare(env); + + if (linkNum > 9) { + return AT_ERROR; + } + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CIPClOSE="); + AtCmdTxAddDecimalIntWithLimit(env, linkNum, 1); + + AtCmdTxSendLn(env); + + uint32_t timeout = env->stdRxTimeout * 5; + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + + if (AtCmdRxBeginWithStatic(env, "OK")) { + AtCmdRxClear(env); + } else if (AtCmdRxBeginWithStatic(env, "CLOSED")) { + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} +*/ \ No newline at end of file diff --git a/Src/AtGsmTelitLe910_SocketReadData.c b/Src/AtGsmTelitLe910_SocketReadData.c new file mode 100644 index 0000000..2bd26a3 --- /dev/null +++ b/Src/AtGsmTelitLe910_SocketReadData.c @@ -0,0 +1,67 @@ +// +// Created by cfif on 16.10.2023. +// + +#include "AtGsmTelitLe910_SocketReadData.h" +#include "AtCmdCommonProtected.h" +#include "SystemDelayInterface.h" +#include "string.h" +#include "stdlib.h" +#include "AsciiStringParsingUtils.h" + +AtCommandResult xAtGsmTelit_ReadSocket(tAtCmd *env, int idSocket, uint8_t *dataSocketRead, uint32_t dataSocketReadMaxLen, uint32_t *dataSocketReadLen) { +// AtCmdPrepare(env); + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT#SRECV="); + AtCmdTxAddDecimalIntWithLimit(env, idSocket, 1); + AtCmdTxAddStatic(env, ","); + AtCmdTxAddDecimalIntWithLimit(env, dataSocketReadMaxLen, 4); + AtCmdTxSendLn(env); + + //debug_printf(env->io, "AT#SRECV=%u,%u\r\n", idSocket, dataSocketReadMaxLen); + + *dataSocketReadLen = 0; + + uint32_t timeout = env->stdRxTimeout; + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + + if (AtCmdRxBeginWithStatic(env, "#SRECV: ")) { + + char *front; + char *div = env->rxBuffer.data + sizeof("#SRECV:") - 1; + char *end = div + env->rxBuffer.len; + + if (iAsciiStringMoveToNextParsingBlock(&front, &div, end, ',')) { + uint32_t id = atoi(front); + } + + if (iAsciiStringMoveToNextParsingBlock(&front, &div, end, ',')) { + *dataSocketReadLen = atoi(front); + } + + +// *dataSocketReadLen = atoi(&env->rxBuffer.data[strlen("#SRECV: ")]); + AtCmdRxClear(env); + break; + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + } else if (AtCmdRxBeginWithStatic(env, "Operation")) { + AtCmdRxClear(env); + return AT_ERROR; + } else { +// AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + AtCmdRxReadRAW(env, dataSocketRead, *dataSocketReadLen, env->stdRxTimeout); + + return AT_OK; +// return AtCmdOkErrAnswer(env, env->stdRxTimeout); + } diff --git a/Src/AtGsmTelitLe910_SocketSendData.c b/Src/AtGsmTelitLe910_SocketSendData.c new file mode 100755 index 0000000..a71bc44 --- /dev/null +++ b/Src/AtGsmTelitLe910_SocketSendData.c @@ -0,0 +1,177 @@ +// +// Created by xemon on 10.05.23. +// +#include "AtGsmTelitLe910_SocketSendData.h" +#include "AtCmdCommonProtected.h" +#include "SystemDelayInterface.h" + + +AtCommandResult AtGsmTelitLe910_SocketSendData( + tAtCmd *env, uint8_t linkNum, uint8_t *data, uint16_t dataLen, uint32_t timeout +) { + return AtGsmTelitLe910_SocketSendDataUdp(env, linkNum, data, dataLen, 0, 0, 0, timeout); +} + +AtCommandResult AtGsmTelitLe910_SocketSendDataUdp( + tAtCmd *env, + uint8_t linkNum, + uint8_t *data, + uint16_t dataLen, + char *srvIp, + uint8_t srvIpLen, + uint16_t srvPort, + uint32_t timeout +) { + AtCmdPrepare(env); + AtCmdRxClear(env); + + if (linkNum > 9) { + return AT_ERROR; + } + + AtCmdPrepare(env); + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT#SSENDEXT="); + AtCmdTxAddDecimalIntWithLimit(env, linkNum, 1); + AtCmdTxAddStatic(env, ","); + AtCmdTxAddDecimalIntWithLimit(env, dataLen, 4); + AtCmdTxSendLn(env); + + + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + while ((AtCmdReceiveNextChar(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + if (AtCmdRxIsCompleteLine(env)) { + if (AtCmdRxBeginWithStatic(env, ">")) { + AtCmdRxClear(env); + AtCmdSend(env, data, dataLen); + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + } else if (AtCmdRxBeginWithStatic(env, "OK")) { + AtCmdRxClear(env); + return AT_OK; + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } else { + if (AtCmdRxBeginWithStatic(env, ">")) { + AtCmdRxClear(env); + AtCmdSend(env, data, dataLen); + +// return AT_OK; + + } + + + } + + } + + return AT_TIMEOUT; + /* + //debug_printf(env->io, "AT#SSENDEXT=%u,%u\r\n", idSocket, dataSocketWriteLen); + + AtCommandResult ready = AtCmdWaitChar(env, env->stdRxTimeout, '>'); + + if (ready != AT_OK) { + AtCmdSendStatic(env, AT_ESC_STR); + return ready; + } + + AtCmdSend(env, data, dataLen); + + AtCmdSendStatic(env, AT_ESC_STR); + + return AtCmdOkErrAnswer(env, env->stdRxTimeout); +*/ +} + +/* +AtCommandResult AtGsmSimComA7600_SocketSendData( + tAtCmd *env, uint8_t linkNum, uint8_t *data, uint16_t dataLen, uint32_t timeout +) { + return AtGsmSimComA7600_SocketSendDataUdp(env, linkNum, data, dataLen, 0, 0, 0, timeout); +} + +AtCommandResult AtGsmSimComA7600_SocketSendDataUdp( + tAtCmd *env, + uint8_t linkNum, + uint8_t *data, + uint16_t dataLen, + char *srvIp, + uint8_t srvIpLen, + uint16_t srvPort, + uint32_t timeout +) { + AtCmdPrepare(env); + + if (linkNum > 9) { + return AT_ERROR; + } + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CIPSEND="); + AtCmdTxAddDecimalIntWithLimit(env, linkNum, 1); + AtCmdTxAddChar(env, ','); + AtCmdTxAddDecimalIntWithLimit(env, dataLen, 5); + + + if (srvPort || srvIpLen) { + AtCmdTxAddChar(env, ','); + + if (srvIpLen) { + AtCmdTxAddChar(env, '"'); + AtCmdTxAdd(env, srvIp, srvIpLen); + AtCmdTxAddChar(env, '"'); + } + + if (srvPort) { + AtCmdTxAddChar(env, ','); + AtCmdTxAddDecimalIntWithLimit(env, srvPort, 5); + } + } + + + AtCmdTxSendLn(env); + + + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + while ((AtCmdReceiveNextChar(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + if (AtCmdRxIsCompleteLine(env)) { + if (AtCmdRxBeginWithStatic(env, ">")) { + AtCmdRxClear(env); + AtCmdSend(env, data, dataLen); + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + } else if (AtCmdRxBeginWithStatic(env, "+CIPERROR:")) { + AtCmdRxClear(env); + return AT_ERROR; + } else if (AtCmdRxBeginWithStatic(env, "+CIPSEND: ")) { + //todo check + AtCmdRxClear(env); + return AT_OK; + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } else { + if (AtCmdRxBeginWithStatic(env, ">")) { + AtCmdRxClear(env); + AtCmdSend(env, data, dataLen); + } + } + } + + return AT_TIMEOUT; +} +*/ \ No newline at end of file diff --git a/Src/AtGsmTelitLe910_StartSocketService.c b/Src/AtGsmTelitLe910_StartSocketService.c new file mode 100755 index 0000000..ea81a27 --- /dev/null +++ b/Src/AtGsmTelitLe910_StartSocketService.c @@ -0,0 +1,70 @@ +// +// Created by xemon on 10.05.23. +// +#include "AtGsmTelitLe910_StartSocketService.h" +#include "AtCmdCommonProtected.h" +#include "SystemDelayInterface.h" + + +AtCommandResult AtGsmSimComA7600_StartSocketService(tAtCmd *env) { + AtCmdPrepare(env); + + AtCmdSendStatic(env, "AT+NETOPEN\r\n"); + + uint32_t timeout = env->stdRxTimeout*5; + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + + if (AtCmdRxBeginWithStatic(env, "OK")) { + AtCmdRxClear(env); + } else if (AtCmdRxBeginWithStatic(env, "+NETOPEN: 0")) { + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "+NETOPEN: 1")) { + AtCmdRxClear(env); + return AT_ERROR; + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + +AtCommandResult AtGsmSimComA7600_HasIp(tAtCmd *env) { + AtCmdPrepare(env); + + AtCmdSendStatic(env, "AT+IPADDR\r\n"); + + uint32_t timeout = env->stdRxTimeout; + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + + if (AtCmdRxBeginWithStatic(env, "OK")) { + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "+IP ERROR:")) { + AtCmdRxClear(env); + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} diff --git a/Src/AtGsmTelitLe910_StopSocketService.c b/Src/AtGsmTelitLe910_StopSocketService.c new file mode 100755 index 0000000..e954fa6 --- /dev/null +++ b/Src/AtGsmTelitLe910_StopSocketService.c @@ -0,0 +1,15 @@ +// +// Created by xemon on 10.05.23. +// +#include "AtGsmTelitLe910_StopSocketService.h" +#include "AtCmdCommonProtected.h" +#include "SystemDelayInterface.h" + + +AtCommandResult AtGsmSimComA7600_StopSocketService(tAtCmd *env) { + AtCmdPrepare(env); + + AtCmdSendStatic(env, "AT+NETCLOSE\r\n"); + + return AtCmdOkErrAnswer(env, env->stdRxTimeout); +} diff --git a/modular.json b/modular.json new file mode 100755 index 0000000..6e0f28c --- /dev/null +++ b/modular.json @@ -0,0 +1,17 @@ +{ + "dep": [ + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "AtGsmCommon" + } + ], + "cmake": { + "inc_dirs": [ + "./Inc" + ], + "srcs": [ + "./Src/**.c" + ] + } +} \ No newline at end of file