// // Created by cfif on 05.07.23. // #include #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; }