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