Init
This commit is contained in:
commit
1545ae9834
|
|
@ -0,0 +1,175 @@
|
|||
//
|
||||
// Created by cfif on 25.01.23.
|
||||
//
|
||||
|
||||
#ifndef GONEC_GSM_ATGGMSIM800F_H
|
||||
#define GONEC_GSM_ATGGMSIM800F_H
|
||||
|
||||
#include <SystemDelayInterface.h>
|
||||
#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
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
// конец----------------------- Прием данных в командном режиме, ручной вывод принятых данных -------------------------
|
||||
// конец----------------------- Прием данных в командном режиме, ручной вывод принятых данных -------------------------
|
||||
// конец----------------------- Прием данных в командном режиме, ручной вывод принятых данных -------------------------
|
||||
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"dep": [
|
||||
{
|
||||
"type": "git",
|
||||
"provider": "GONEC_NEW",
|
||||
"repo": "AsciiStringAssemblingUtils"
|
||||
},
|
||||
{
|
||||
"type": "git",
|
||||
"provider": "GONEC_NEW",
|
||||
"repo": "AtGsmCommon"
|
||||
}
|
||||
],
|
||||
"cmake": {
|
||||
"inc_dirs": [
|
||||
"Inc"
|
||||
],
|
||||
"srcs": [
|
||||
"Src/**.c"
|
||||
]
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue