AtGsmSimCom7600E/Src/AtGsmSimComA7600_Http.c

195 lines
5.5 KiB
C

//
// Created by cfif on 10.07.23.
//
#include <SystemDelayInterface.h>
#include "AtGsmSimComA7600_Http.h"
#include "AtCmdCommonProtected.h"
#include "AsciiStringParsingUtils.h"
#include "stdlib.h"
AtCommandResult AtGsmSimComA7600_HttpInit(tAtCmd *env) {
AtCmdPrepare(env);
AtCmdRxClear(env);
AtCmdSendStatic(env, "AT+HTTPINIT\r\n");
return AtCmdOkErrAnswer(env, 10000);
}
AtCommandResult AtGsmSimComA7600_HttpHead(tAtCmd *env) {
AtCmdPrepare(env);
AtCmdRxClear(env);
AtCmdSendStatic(env, "AT+HTTPHEAD\r\n");
return AtCmdOkErrAnswer(env, env->stdRxTimeout);
}
AtCommandResult AtGsmSimComA7600_HttpTerminate(tAtCmd *env) {
AtCmdPrepare(env);
AtCmdRxClear(env);
AtCmdSendStatic(env, "AT+HTTPTERM\r\n");
return AtCmdOkErrAnswer(env, env->stdRxTimeout);
}
AtCommandResult AtGsmSimComA7600_HttpSetUrl(tAtCmd *env, char *url, size_t urlSize) {
AtCmdPrepare(env);
AtCmdRxClear(env);
AtCmdTxClear(env);
AtCmdTxAddStatic(env, "AT+HTTPPARA=\"URL\",");
AtCmdTxAddChar(env, '"');
AtCmdTxAdd(env, url, urlSize);
AtCmdTxAddChar(env, '"');
AtCmdTxSendLn(env);
return AtCmdOkErrAnswer(env, env->stdRxTimeout);
}
AtCommandResult AtGsmSimComA7600_HttpSetCid(tAtCmd *env, uint8_t cid) {
AtCmdPrepare(env);
AtCmdRxClear(env);
AtCmdTxClear(env);
AtCmdTxAddStatic(env, "AT+HTTPPARA=\"CID\",");
AtCmdTxAddDecimalIntWithLimit(env, cid, 2);
AtCmdTxSendLn(env);
return AtCmdOkErrAnswer(env, env->stdRxTimeout);
}
AtCommandResult AtGsmSimComA7600_HttpMethodAction(
tAtCmd *env,
eAtGsmSimComA7600_HttpMethod method,
uint16_t *resultCode,
size_t *responseLen,
uint32_t timeout
) {
AtCmdPrepare(env);
AtCmdRxClear(env);
AtCmdTxClear(env);
AtCmdTxAddStatic(env, "AT+HTTPACTION=");
AtCmdTxAddChar(env, method);
AtCmdTxSendLn(env);
// uint32_t timeout = env->stdRxTimeout * 5;
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);
} else if (AtCmdRxBeginWithStatic(env, "+HTTPACTION: ")) {
char *blockBeginPos = env->rxBuffer.data + (sizeof("+HTTPACTION: ") - 1) - 1;
char *blockDividerPos = blockBeginPos;
char *strEnd = env->rxBuffer.data + env->rxBuffer.len;
iAsciiStringMoveToNextParsingBlock(&blockBeginPos, &blockDividerPos, strEnd, ',');
eAtGsmSimComA7600_HttpMethod methodRes = (eAtGsmSimComA7600_HttpMethod) *((char *) blockBeginPos);
iAsciiStringMoveToNextParsingBlock(&blockBeginPos, &blockDividerPos, strEnd, ',');
*resultCode = iAsciiStringParseUnsignedLongDecimalNumber(blockBeginPos, blockDividerPos);
iAsciiStringMoveToNextParsingBlock(&blockBeginPos, &blockDividerPos, strEnd, ',');
*responseLen = iAsciiStringParseUnsignedLongDecimalNumber(blockBeginPos, blockDividerPos);
AtCmdRxClear(env);
return methodRes == method ? AT_OK : AT_ERROR;
} else if (AtCmdRxBeginWithStatic(env, "ERROR")) {
AtCmdRxClear(env);
return AT_ERROR;
} else {
AtCmdProcessUnresolvedLine(env);
AtCmdRxClear(env);
continue;
}
}
return AT_TIMEOUT;
}
AtCommandResult AtGsmSimComA7600_HttpRead(
tAtCmd *env,
uint8_t *data,
size_t dataOffset,// непонятный параметр,
size_t dataLimit,
size_t *readLen
) {
AtCmdPrepare(env);
AtCmdRxClear(env);
AtCmdTxClear(env);
AtCmdTxAddStatic(env, "AT+HTTPREAD=");
AtCmdTxAddDecimalIntWithLimit(env, dataOffset, 16);
AtCmdTxAddChar(env, ',');
AtCmdTxAddDecimalIntWithLimit(env, dataLimit, 16);
AtCmdTxSendLn(env);
uint32_t timeout = 20000;
uint32_t endMs = SystemGetMs() + timeout;
uint32_t leftMs = timeout;
bool dataOk = false;
while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) {
leftMs = endMs - SystemGetMs();
if (AtCmdRxBeginWithStatic(env, "OK")) {
AtCmdRxClear(env);
// return dataOk ? AT_OK : AT_ERROR;
} else if (AtCmdRxBeginWithStatic(env, "+HTTPREAD: ")) {
*readLen = iAsciiStringParseUnsignedLongDecimalNumber(
env->rxBuffer.data + sizeof("+HTTPREAD: DATA,") - 1, env->rxBuffer.data + env->rxBuffer.len - 1
);
uint16_t bufferLen = SerialPortReceive(env->io, data, *readLen, timeout);
/*
char *blockBeginPos = env->rxBuffer.data + (sizeof("+HTTPREAD: ") - 1) - 1;
char *blockDividerPos = blockBeginPos;
char *strEnd = env->rxBuffer.data + env->rxBuffer.len;
// DATA word
// iAsciiStringMoveToNextParsingBlock(&blockBeginPos, &blockDividerPos, strEnd, ',');
iAsciiStringMoveToNextParsingBlock(&blockBeginPos, &blockDividerPos, strEnd, ',');
*readLen = iAsciiStringParseUnsignedLongDecimalNumber(blockBeginPos, blockDividerPos);
AtCmdRxReadRAW(env, data, *readLen, timeout);
*/
dataOk = true;
AtCmdRxClear(env);
return AT_OK;
} else if (AtCmdRxBeginWithStatic(env, "ERROR")) {
AtCmdRxClear(env);
return AT_ERROR;
} else {
AtCmdProcessUnresolvedLine(env);
AtCmdRxClear(env);
continue;
}
}
return AT_TIMEOUT;
}