SMART_COMPONENTS_SOCKET/Gsm_SockInt_SSL_Open.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;
}