110 lines
3.6 KiB
C
110 lines
3.6 KiB
C
//
|
|
// Created by cfif on 05.07.23.
|
|
//
|
|
#include <SystemDelayInterface.h>
|
|
#include "GsmWithGnss.h"
|
|
#include "AtGsmSimComA7600.h"
|
|
#include "Gsm_SockInt.h"
|
|
#include "Gsm_SockInt.h"
|
|
|
|
#define LOG_SIGN "GSM SSL"
|
|
#define LOGGER &env->slog->logger
|
|
|
|
tGsmSocketSlot *Gsm_SSL_getFreeSlot(tGsmWithGnss *env) {
|
|
for (uint8_t i = 0; i < GSM_SLOTS_COUNT; ++i) {
|
|
if (GsmSocketSlot_IsClear(env->slots + i)) {
|
|
return env->slots + i;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
static bool Gsm_StayConnected_SSL_socket(
|
|
tGsmWithGnss *env, uint8_t idx, eSocketType type, eAtGsmSimComA7600_SSL_Type clientType, char *addr, size_t addrSize, uint16_t port
|
|
) {
|
|
bool connected = false;
|
|
AtCommandResult result = AtGsmSimComA7600_SSL_HasConnection(env->gsmAt, idx, &connected);
|
|
|
|
if (result != AT_OK) {
|
|
result = AtGsmSimComA7600_SSL_HasConnection(env->gsmAt, idx, &connected);
|
|
}
|
|
|
|
if (connected) {
|
|
return true;
|
|
} else {
|
|
// if (AtGsmSimComA7600_SSL_HasIp(&env->gsmAt) != AT_OK) {
|
|
AtGsmSimComA7600_SSL_StartSocketService(env->gsmAt);
|
|
AtGsmSimComA7600_SSL_SetContext(env->gsmAt, idx, 2);
|
|
// }
|
|
|
|
env->codeResultOpen = 0;
|
|
|
|
AtCommandResult resultOpen = AtGsmSimComA7600_SSL_EstablishConnection(
|
|
env->gsmAt,
|
|
idx,
|
|
addr,
|
|
addrSize,
|
|
port,
|
|
clientType,
|
|
&env->codeResultOpen
|
|
//eAtGsmSimComA7600_SslType_TCP
|
|
// eAtGsmSimComA7600_SslType_TLS
|
|
) == AT_OK;
|
|
|
|
|
|
return resultOpen;
|
|
}
|
|
}
|
|
|
|
uint8_t Gsm_Socket_SSL_open(tGsmWithGnss *env, eSocketType type, eAtGsmSimComA7600_SSL_Type clientType, char *addr, size_t addrSize, uint16_t port, uint32_t timeout) {
|
|
uint8_t res = SOCKET_WRONG_CONTEXT;
|
|
|
|
if (osMutexAcquire(env->gsmAt->access, timeout) == osOK) {
|
|
tGsmSocketSlot *slot = Gsm_SSL_getFreeSlot(env);
|
|
if (slot) {
|
|
if (Gsm_StayConnected_SSL_socket(env, slot->contextId, type, clientType, addr, addrSize, port)) {
|
|
GsmSocketSlot_Set(slot, type, addr, addrSize, port);
|
|
res = slot->contextId;
|
|
} else {
|
|
res = SOCKET_WRONG_CONTEXT;
|
|
}
|
|
}
|
|
osMutexRelease(env->gsmAt->access);
|
|
} else {
|
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка доступа (Gsm_Socket_SSL_open)")
|
|
}
|
|
return res;
|
|
}
|
|
|
|
void Gsm_Socket_SSL_close(tGsmWithGnss *env, uint8_t contextId) {
|
|
if (osMutexAcquire(env->gsmAt->access, defaultSocketTimeout) == osOK) {
|
|
if ((contextId != SOCKET_WRONG_CONTEXT) /*&& (contextId != 0)*/) {
|
|
AtGsmSimComA7600_SSL_CloseConnection(env->gsmAt, contextId);
|
|
GsmSocketSlot_Clear(env->slots + contextId);
|
|
} else {
|
|
asm("nop");
|
|
}
|
|
osMutexRelease(env->gsmAt->access);
|
|
} else {
|
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка доступа (Gsm_Socket_SSL_close)")
|
|
}
|
|
}
|
|
|
|
|
|
eSocketStatus Gsm_Socket_SSL_status(tGsmWithGnss *env, uint8_t contextId) {
|
|
bool connected = false;
|
|
if (osMutexAcquire(env->gsmAt->access, defaultSocketTimeout) == osOK) {
|
|
AtCommandResult result = AtGsmSimComA7600_SSL_HasConnection(env->gsmAt, contextId, &connected);
|
|
|
|
if (result != AT_OK) {
|
|
result = AtGsmSimComA7600_SSL_HasConnection(env->gsmAt, contextId, &connected);
|
|
}
|
|
|
|
osMutexRelease(env->gsmAt->access);
|
|
} else {
|
|
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка доступа (Gsm_Socket_SSL_status)")
|
|
}
|
|
|
|
return connected ? eSocketStatus_Connected : eSocketStatus_Disconnected;
|
|
}
|