195 lines
5.5 KiB
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;
|
|
} |