commit 2aa504add434885b18d6681e68b832e9510282c1 Author: cfif Date: Fri Jan 24 13:22:33 2025 +0300 Перенос на новую организацию GONEC diff --git a/Inc/AtGsmSim800f.h b/Inc/AtGsmSim800f.h new file mode 100644 index 0000000..be9d401 --- /dev/null +++ b/Inc/AtGsmSim800f.h @@ -0,0 +1,175 @@ +// +// Created by cfif on 25.01.23. +// + +#ifndef GONEC_GSM_ATGGMSIM800F_H +#define GONEC_GSM_ATGGMSIM800F_H + +#include +#include "AtCmdCommonProtected.h" +#include "AsciiStringParsingUtils.h" +#include "AtGsm_NetworkRegistrationStatus.h" + + +typedef enum { + AT_DETACH_FROM_GPRS_SERVICE = '0', + AT_ATTACH_FROM_GPRS_SERVICE = '1' +} tAtGsm_AttachOrDetachFromGPRSService; + +typedef enum { + IP_INITIAL = 0, + IP_START = 1, + IP_CONFIG = 2, + IP_GPRSACT = 3, + IP_STATUS = 4, + TCP__CONNECTING = 5, + UDP_CONNECTING = 6, + SERVER_LISTENING = 7, + CONNECT_OK = 8, + TCP_CLOSING = 9, + UDP_CLOSING = 10, + TCP_CLOSED = 11, + UDP_CLOSED = 12, + PDP_DEACT = 13, + PDP_NOT_FOUND_ERROR = 100 +} tAtGsm_QueryCurrentConnectionStatus; + +typedef enum { + SIM_READY = 0, + SIM_SIM_PIN = 1, + SIM_SIM_PUK = 2, + SIM_PH_SIM_PIN = 3, + SIM_PH_SIM_PUK = 4, + SIM_SIM_PIN2 = 5, + SIM_SIM_PUK2 = 6, + SIM_SIM_NOT_FOUND_ERROR = 100 +} tAtGsm_PINStatus; + + + +typedef enum { + GSM_STATUS_OK = 0, + + GSM_STATUS_ERROR_PIN_STATUS = 1, + GSM_STATUS_ERROR__WAIT_NETWORK_REGISTRATION = 2, + GSM_STATUS_ERROR_ATTACH_GPR_SERVICE = 3 + + } tAtGsm_StatusError; + +// +// Created by cfif on 25.01.23. +// +#include "AtGsmSim800f.h" +#include "stdlib.h" + +// начало-------------------------- Служебные ---------------------------------------------------------------------- +// начало-------------------------- Служебные ---------------------------------------------------------------------- +// начало-------------------------- Служебные ---------------------------------------------------------------------- + +// IMEI +AtCommandResult AtGsm_Simcom800f_GET_CGSN(tAtCmd *env, char *acpString, size_t *acpStringLen); +AtCommandResult AtGsm_Simcom800f_CCID(tAtCmd *env, char *acpString, size_t *acpStringLen); + + +// конец-------------------------- Служебные ---------------------------------------------------------------------- +// конец-------------------------- Служебные ---------------------------------------------------------------------- +// конец-------------------------- Служебные ---------------------------------------------------------------------- + + +// начало-------------------------- Инициализация ---------------------------------------------------------------------- +// начало-------------------------- Инициализация ---------------------------------------------------------------------- +// начало-------------------------- Инициализация ---------------------------------------------------------------------- + +// Проверка готовности SIM-карты +AtCommandResult AtGsm_Simcom800f_PINStatus(tAtCmd *env, tAtGsm_PINStatus *state); + +// Уровень сигнала +AtCommandResult AtGsm_Simcom800f_SignalQualityReport(tAtCmd *env, uint32_t *rssi, int *error); + +// Проверка наличия регистрации в сети GSM. +AtCommandResult AtGsm_Simcom800f_NetworkRegistrationStatusGSM( + tAtCmd *env, + tAtGsm_NetworkRegistrationReportMode *mode, + tAtGsm_NetworkRegistrationState *state, + int *error +); + +// Проверка получения доступа к услугам пакетной передачи данных. +AtCommandResult AtGsm_Simcom800f_AttachOrDetachFromGPRSService( + tAtCmd *env, + tAtGsm_AttachOrDetachFromGPRSService *state, + int *error +); + +// Установка количества соединений с сокетом - 0 +AtCommandResult AtGsm_Simcom800f_StartUpMultiIPConnection(tAtCmd *env, uint8_t count); + +// Режим передачи данных 0 - Ручной +AtCommandResult AtGsm_Simcom800f_SelectTCPIPApplicationMode(tAtCmd *env, uint8_t mode); + +// Режим передачи данных 0 - Ручной +AtCommandResult AtGsm_Simcom800f_SelectDataTransmittingMode(tAtCmd *env, uint8_t mode); + +// Режим приема данных 1 - Ручной +AtCommandResult AtGsm_Simcom800f_GetDataFromNetworkManuallySet(tAtCmd *env, uint8_t mode) ; + +// конец----------------------------------- Инициализация -------------------------------------------------------------- +// конец----------------------------------- Инициализация -------------------------------------------------------------- +// конец----------------------------------- Инициализация -------------------------------------------------------------- + + +// начало---------------------- Настройка контекста и открытие соединения ----------------------------------- +// начало---------------------- Настройка контекста и открытие соединения ----------------------------------- +// начало---------------------- Настройка контекста и открытие соединения ----------------------------------- + +// Деактивация контекста +AtCommandResult AtGsm_Simcom800f_DeactivateGPRSPDPContext(tAtCmd *env); + +// Настройка точки доступа APN +AtCommandResult AtGsm_Simcom800f_StartTaskAndSetAPN(tAtCmd *env, char *apn, int apnLen); + +// Запрос текущего статуса соединения +AtCommandResult AtGsm_Simcom800f_QueryCurrentConnectionStatus(tAtCmd *env, tAtGsm_QueryCurrentConnectionStatus *state); + +// Активация контекста +AtCommandResult AtGsm_Simcom800f_BringUpWirelessConnectionWithGPRS(tAtCmd *env); +// Установление TCP соединения +AtCommandResult AtGsm_Simcom800f_StartUpTCPOrUDPConnection(tAtCmd *env, char *url, int urlLen, uint16_t port); + +// Закрытие соединения +AtCommandResult AtGsm_Simcom800f_CloseTCPorUDPConnection(tAtCmd *env); + +// конец---------------------------- Настройка контекста и открытие соединения ----------------------------------------- +// конец---------------------------- Настройка контекста и открытие соединения ----------------------------------------- +// конец---------------------------- Настройка контекста и открытие соединения ----------------------------------------- + + +// начало----------------------- Передача данных с подтверждением в командном режиме ----------------------------------- +// начало----------------------- Передача данных с подтверждением в командном режиме ----------------------------------- +// начало----------------------- Передача данных с подтверждением в командном режиме ----------------------------------- + +// Начать отправку данных на сервер +AtCommandResult AtGsm_Simcom800f_SendDataThroughTCPOrUDPConnection(tAtCmd *env, uint8_t *pBuf, uint16_t size); + +// конец----------------------- Передача данных с подтверждением в командном режиме ----------------------------------- +// конец----------------------- Передача данных с подтверждением в командном режиме ----------------------------------- +// конец----------------------- Передача данных с подтверждением в командном режиме ----------------------------------- + + +// начало----------------------- Прием данных в командном режиме, ручной вывод принятых данных ------------------------- +// начало----------------------- Прием данных в командном режиме, ручной вывод принятых данных ------------------------- +// начало----------------------- Прием данных в командном режиме, ручной вывод принятых данных ------------------------- + +// Получить количества данных готовых для чтения +AtCommandResult AtGsm_Simcom800f_GetDataFromNetworkManuallyGetSize(tAtCmd *env, uint16_t *size); + +// Получить данные готовые для чтения из сокета +AtCommandResult AtGsm_Simcom800f_GetDataFromNetworkManuallyGet(tAtCmd *env, uint8_t *pBuf, uint16_t sizeRead, uint16_t *sizeRealRead); + +// конец----------------------- Прием данных в командном режиме, ручной вывод принятых данных ------------------------- +// конец----------------------- Прием данных в командном режиме, ручной вывод принятых данных ------------------------- +// конец----------------------- Прием данных в командном режиме, ручной вывод принятых данных ------------------------- + + + +#endif //GONEC_GSM_ATGGMSIM800F_H diff --git a/Src/AtGsmSim800f.c b/Src/AtGsmSim800f.c new file mode 100644 index 0000000..7a1abbe --- /dev/null +++ b/Src/AtGsmSim800f.c @@ -0,0 +1,736 @@ +// +// Created by cfif on 25.01.23. +// +#include "AtGsmSim800f.h" +#include "stdlib.h" +#include "memory.h" + +// начало-------------------------- Служебные ---------------------------------------------------------------------- +// начало-------------------------- Служебные ---------------------------------------------------------------------- +// начало-------------------------- Служебные ---------------------------------------------------------------------- + +// IMEI +AtCommandResult AtGsm_Simcom800f_GET_CGSN(tAtCmd *env, char *acpString, size_t *acpStringLen) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CGSN"); + AtCmdTxSendLn(env); + + + 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, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + + } else if (AtCmdRxBeginWithStatic(env, "AT+CGSN")) { + while (AtCmdReceiveNextLine(env, 1000) == AT_OK) { + *acpStringLen = env->rxBuffer.len - 2; + memcpy(acpString, env->rxBuffer.data, *acpStringLen); + AtCmdRxClear(env); + return AtCmdOkErrAnswer(env, env->stdRxTimeout); + } + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + +AtCommandResult AtGsm_Simcom800f_CCID(tAtCmd *env, char *acpString, size_t *acpStringLen) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CCID"); + AtCmdTxSendLn(env); + + + 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, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + + } else if (AtCmdRxBeginWithStatic(env, "+CCID: ")) { + while (AtCmdReceiveNextLine(env, 1000) == AT_OK) { + char *start = env->rxBuffer.data + sizeof("+CCID:"); + *acpStringLen = env->rxBuffer.len - sizeof("+CCID:") - 2; + memcpy(acpString, start, *acpStringLen); + AtCmdRxClear(env); + return AtCmdOkErrAnswer(env, env->stdRxTimeout); + } + + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + + +// конец-------------------------- Служебные ---------------------------------------------------------------------- +// конец-------------------------- Служебные ---------------------------------------------------------------------- +// конец-------------------------- Служебные ---------------------------------------------------------------------- + +// начало-------------------------- Инициализация ---------------------------------------------------------------------- +// начало-------------------------- Инициализация ---------------------------------------------------------------------- +// начало-------------------------- Инициализация ---------------------------------------------------------------------- + +// Проверка готовности SIM-карты +AtCommandResult AtGsm_Simcom800f_PINStatus(tAtCmd *env, tAtGsm_PINStatus *state) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CPIN?"); + AtCmdTxSendLn(env); + + uint32_t timeout = env->stdRxTimeout; + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + *state = SIM_SIM_NOT_FOUND_ERROR; + + while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + + if (AtCmdRxBeginWithStatic(env, "OK")) { + AtCmdRxClear(env); + return AT_OK; + + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + + } else if (AtCmdRxBeginWithStatic(env, "+CPIN: READY")) { + *state = SIM_READY; + AtCmdRxClear(env); + } else if (AtCmdRxBeginWithStatic(env, "+CPIN: SIM PIN")) { + *state = SIM_SIM_PIN; + AtCmdRxClear(env); + } else if (AtCmdRxBeginWithStatic(env, "+CPIN: SIM PUK")) { + *state = SIM_SIM_PUK; + AtCmdRxClear(env); + } else if (AtCmdRxBeginWithStatic(env, "+CPIN: PH_SIM PIN")) { + *state = SIM_PH_SIM_PIN; + AtCmdRxClear(env); + } else if (AtCmdRxBeginWithStatic(env, "+CPIN: PH_SIM PUK")) { + *state = SIM_PH_SIM_PUK; + AtCmdRxClear(env); + } else if (AtCmdRxBeginWithStatic(env, "+CPIN: SIM PUK2")) { + *state = SIM_SIM_PIN2; + AtCmdRxClear(env); + } else { + + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + + +// Уровень сигнала +AtCommandResult AtGsm_Simcom800f_SignalQualityReport(tAtCmd *env, uint32_t *rssi, int *error) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CSQ"); + AtCmdTxSendLn(env); + + + uint32_t timeout = env->stdRxTimeout; + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + *rssi = 0; + *error = -1; + + while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + + if (AtCmdRxBeginWithStatic(env, "OK")) { + AtCmdRxClear(env); + return AT_OK; + + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + + } else if (AtCmdRxBeginWithStatic(env, "+CME ERROR: ")) { + char *start = env->rxBuffer.data + sizeof("+CME ERROR:"); + *error = atoi(start); + AtCmdRxClear(env); + + } else if (AtCmdRxBeginWithStatic(env, "+CSQ: ")) { + char *start = env->rxBuffer.data + sizeof("+CSQ:"); + *rssi = atoi(start); + AtCmdRxClear(env); + + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + + +// Проверка наличия регистрации в сети GSM. +AtCommandResult AtGsm_Simcom800f_NetworkRegistrationStatusGSM( + tAtCmd *env, + tAtGsm_NetworkRegistrationReportMode *mode, + tAtGsm_NetworkRegistrationState *state, + int *error +) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CREG?"); + AtCmdTxSendLn(env); + + uint32_t timeout = 5000; + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + *error = -1; + + while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + + if (AtCmdRxBeginWithStatic(env, "AT+CLCC")) { + AtCmdRxClear(env); + continue; + + } else if (AtCmdRxBeginWithStatic(env, "OK")) { + AtCmdRxClear(env); + return AT_OK; + + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + + } else if (AtCmdRxBeginWithStatic(env, "+CME ERROR: ")) { + char *start = env->rxBuffer.data + sizeof("+CME ERROR:"); + *error = atoi(start); + AtCmdRxClear(env); + + } else if (AtCmdRxBeginWithStatic(env, "+CREG: ")) { + + char *front; + char *div = env->rxBuffer.data + sizeof("+CREG:"); + char *end = div + env->rxBuffer.len; + + if (iAsciiStringMoveToNextParsingBlock(&front, &div, end, ',')) { + *(char *) mode = *front; + } + + if (iAsciiStringMoveToNextParsingBlock(&front, &div, end, ',')) { + *(char *) state = *front; + } + + AtCmdRxClear(env); + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + +// Проверка получения доступа к услугам пакетной передачи данных. +AtCommandResult AtGsm_Simcom800f_AttachOrDetachFromGPRSService( + tAtCmd *env, + tAtGsm_AttachOrDetachFromGPRSService *state, + int *error +) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CGATT?"); + AtCmdTxSendLn(env); + + uint32_t timeout = 5000; + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + *error = -1; + + while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + + if (AtCmdRxBeginWithStatic(env, "OK")) { + AtCmdRxClear(env); + return AT_OK; + + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + + } else if (AtCmdRxBeginWithStatic(env, "+CME ERROR: ")) { + char *start = env->rxBuffer.data + sizeof("+CME ERROR:"); + *error = atoi(start); + AtCmdRxClear(env); + + } else if (AtCmdRxBeginWithStatic(env, "+CGATT: ")) { + char *start = env->rxBuffer.data + sizeof("+CGATT:"); + *(char *) state = *start; + AtCmdRxClear(env); + + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + +// Установка количества соединений с сокетом - 0 +AtCommandResult AtGsm_Simcom800f_StartUpMultiIPConnection(tAtCmd *env, uint8_t count) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CIPMUX="); + AtCmdTxAddDecimalIntWithLimit(env, count, 1); + AtCmdTxSendLn(env); + return AtCmdOkErrAnswer(env, env->stdRxTimeout); +} + +// Режим передачи данных 0 - Ручной +AtCommandResult AtGsm_Simcom800f_SelectTCPIPApplicationMode(tAtCmd *env, uint8_t mode) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CIPMODE="); + AtCmdTxAddDecimalIntWithLimit(env, mode, 1); + AtCmdTxSendLn(env); + return AtCmdOkErrAnswer(env, env->stdRxTimeout); +} + +// Режим передачи данных 0 - Ручной +AtCommandResult AtGsm_Simcom800f_SelectDataTransmittingMode(tAtCmd *env, uint8_t mode) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CIPQSEND="); + AtCmdTxAddDecimalIntWithLimit(env, mode, 1); + AtCmdTxSendLn(env); + return AtCmdOkErrAnswer(env, env->stdRxTimeout); +} + +// Режим приема данных 1 - Ручной +AtCommandResult AtGsm_Simcom800f_GetDataFromNetworkManuallySet(tAtCmd *env, uint8_t mode) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CIPRXGET="); + AtCmdTxAddDecimalIntWithLimit(env, mode, 1); + AtCmdTxSendLn(env); + return AtCmdOkErrAnswer(env, env->stdRxTimeout); +} +// конец----------------------------------- Инициализация -------------------------------------------------------------- +// конец----------------------------------- Инициализация -------------------------------------------------------------- +// конец----------------------------------- Инициализация -------------------------------------------------------------- + + +// начало---------------------- Настройка контекста и открытие соединения ----------------------------------- +// начало---------------------- Настройка контекста и открытие соединения ----------------------------------- +// начало---------------------- Настройка контекста и открытие соединения ----------------------------------- + +// Деактивация контекста +AtCommandResult AtGsm_Simcom800f_DeactivateGPRSPDPContext(tAtCmd *env) { + + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CIPSHUT"); + AtCmdTxSendLn(env); + + 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, "SHUT OK")) { + AtCmdRxClear(env); + return AT_OK; + + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + +// Настройка точки доступа APN +AtCommandResult AtGsm_Simcom800f_StartTaskAndSetAPN(tAtCmd *env, char *apn, int apnLen) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CSTT="); + AtCmdTxAdd(env, apn, apnLen); + AtCmdTxSendLn(env); + return AtCmdOkErrAnswer(env, env->stdRxTimeout); +} + + +// Запрос текущего статуса соединения +AtCommandResult AtGsm_Simcom800f_QueryCurrentConnectionStatus(tAtCmd *env, tAtGsm_QueryCurrentConnectionStatus *state) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CIPSTATUS"); + AtCmdTxSendLn(env); + + uint32_t timeout = env->stdRxTimeout; + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs = timeout; + + *state = PDP_NOT_FOUND_ERROR; + + while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) { + leftMs = endMs - SystemGetMs(); + + if (AtCmdRxBeginWithStatic(env, "OK")) { + AtCmdRxClear(env); + continue; + + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + + } else if (AtCmdRxBeginWithStatic(env, "STATE: IP INITIAL")) { + *state = IP_INITIAL; + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "STATE: IP START")) { + *state = IP_START; + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "STATE: IP CONFIG")) { + *state = IP_CONFIG; + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "STATE: IP GPRSACT")) { + *state = IP_GPRSACT; + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "STATE: IP STATUS")) { + *state = IP_STATUS; + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "STATE: TCP CONNECTING")) { + *state = TCP__CONNECTING; + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "STATE: UDP CONNECTING")) { + *state = UDP_CONNECTING; + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "STATE: SERVER LISTENING")) { + *state = SERVER_LISTENING; + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "STATE: CONNECT OK")) { + *state = CONNECT_OK; + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "STATE: TCP CLOSING")) { + *state = TCP_CLOSING; + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "STATE: UDP CLOSING")) { + *state = UDP_CLOSING; + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "STATE: TCP CLOSED")) { + *state = TCP_CLOSED; + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "STATE: UDP CLOSED")) { + *state = UDP_CLOSED; + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "STATE: PDP DEACT")) { + *state = PDP_DEACT; + AtCmdRxClear(env); + return AT_OK; + } else { + + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + +// Активация контекста +AtCommandResult AtGsm_Simcom800f_BringUpWirelessConnectionWithGPRS(tAtCmd *env) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CIICR"); + AtCmdTxSendLn(env); + return AtCmdOkErrAnswer(env, env->stdRxTimeout); +} + +// Установление TCP соединения +AtCommandResult AtGsm_Simcom800f_StartUpTCPOrUDPConnection(tAtCmd *env, char *url, int urlLen, uint16_t port) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CIPSTART=\"TCP\",\""); + AtCmdTxAdd(env, url, urlLen); + AtCmdTxAddStatic(env, "\",\""); + AtCmdTxAddDecimalIntWithLimit(env, port, 5); + AtCmdTxAddStatic(env, "\""); + AtCmdTxSendLn(env); + + 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); + continue; + } else if (AtCmdRxBeginWithStatic(env, "CONNECT OK")) { + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "ALREADY CONNECT")) { + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + } else if (AtCmdRxBeginWithStatic(env, "CONNECT FAIL")) { + 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 AtGsm_Simcom800f_CloseTCPorUDPConnection(tAtCmd *env) { + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdTxAddStatic(env, "AT+CIPCLOSE"); + AtCmdTxSendLn(env); + + 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); + continue; + } else if (AtCmdRxBeginWithStatic(env, "CLOSE OK")) { + AtCmdRxClear(env); + return AT_OK; + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + + +// конец---------------------------- Настройка контекста и открытие соединения ----------------------------------------- +// конец---------------------------- Настройка контекста и открытие соединения ----------------------------------------- +// конец---------------------------- Настройка контекста и открытие соединения ----------------------------------------- + + +// начало----------------------- Передача данных с подтверждением в командном режиме ----------------------------------- +// начало----------------------- Передача данных с подтверждением в командном режиме ----------------------------------- +// начало----------------------- Передача данных с подтверждением в командном режиме ----------------------------------- + +// Начать отправку данных на сервер +AtCommandResult AtGsm_Simcom800f_SendDataThroughTCPOrUDPConnection(tAtCmd *env, uint8_t *pBuf, uint16_t size) { + + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdSendStatic(env, "AT+CIPSEND="); + AtCmdTxAddDecimalIntWithLimit(env, size, 4); + AtCmdTxSendLn(env); + + 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, ">")) { + AtCmdRxClear(env); + AtCmdSend(env, pBuf, size); + } else if (AtCmdRxBeginWithStatic(env, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + } else if (AtCmdRxBeginWithStatic(env, "+CME ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + } else if (AtCmdRxBeginWithStatic(env, "SEND OK")) { + AtCmdRxClear(env); + return AT_OK; + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + +// конец----------------------- Передача данных с подтверждением в командном режиме ----------------------------------- +// конец----------------------- Передача данных с подтверждением в командном режиме ----------------------------------- +// конец----------------------- Передача данных с подтверждением в командном режиме ----------------------------------- + + +// начало----------------------- Прием данных в командном режиме, ручной вывод принятых данных ------------------------- +// начало----------------------- Прием данных в командном режиме, ручной вывод принятых данных ------------------------- +// начало----------------------- Прием данных в командном режиме, ручной вывод принятых данных ------------------------- + +// Получить количества данных готовых для чтения +AtCommandResult AtGsm_Simcom800f_GetDataFromNetworkManuallyGetSize(tAtCmd *env, uint16_t *size) { + + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdSendStatic(env, "AT+CIPRXGET=4"); + AtCmdTxSendLn(env); + + 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, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + + } else if (AtCmdRxBeginWithStatic(env, "+CIPRXGET: 4,")) { + char *start = env->rxBuffer.data + sizeof("+CIPRXGET: 4,") - 1; + *size = atoi(start); + AtCmdRxClear(env); + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + +// Получить данные готовые для чтения из сокета +AtCommandResult +AtGsm_GetDataFromNetworkManuallyGet(tAtCmd *env, uint8_t *pBuf, uint16_t sizeRead, uint16_t *sizeRealRead) { + + AtCmdPrepare(env); + + AtCmdTxClear(env); + AtCmdSendStatic(env, "AT+CIPRXGET=2,"); + AtCmdTxAddDecimalIntWithLimit(env, sizeRead, 4); + AtCmdTxSendLn(env); + + 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, "ERROR")) { + AtCmdRxClear(env); + return AT_ERROR; + + } else if (AtCmdRxBeginWithStatic(env, "+CIPRXGET: 4,")) { + char *start = env->rxBuffer.data + sizeof("+CIPRXGET: 4,") - 1; + *sizeRealRead = atoi(start); + AtCmdRxClear(env); + + AtCmdRxReadRAW(env, pBuf, *sizeRealRead, env->stdRxTimeout); + + } else { + AtCmdProcessUnresolvedLine(env); + AtCmdRxClear(env); + continue; + } + } + + return AT_TIMEOUT; +} + + +// конец----------------------- Прием данных в командном режиме, ручной вывод принятых данных ------------------------- +// конец----------------------- Прием данных в командном режиме, ручной вывод принятых данных ------------------------- +// конец----------------------- Прием данных в командном режиме, ручной вывод принятых данных ------------------------- + diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..7886926 --- /dev/null +++ b/modular.json @@ -0,0 +1,22 @@ +{ + "dep": [ + { + "type": "git", + "provider": "GONEC", + "repo": "AsciiStringAssemblingUtils" + }, + { + "type": "git", + "provider": "GONEC", + "repo": "AtGsmCommon" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file