首页 > 解决方案 > 如何在使用带有 SIM7000A 模块和 Arduino 的 HTTP AT 命令发送 POST 请求时包含正文?

问题描述

我将其从我在 Arduino 论坛上发布的地方交叉发布,希望这里的某个人有答案。我正在开展一个项目,该项目涉及使用 Arduino Uno 和使用 AT 命令的 SIMCOM SIM7000A 分线板向 Twilio 函数发送 POST 请求。到目前为止,使用 Uno,我只能发布一个包含标头但没有正文的空请求。以下代码是我发布到 RequestBin 存储库的测试草图。

#include <AltSoftSerial.h>

unsigned char data = 0;
AltSoftSerial SIM7000;
char incomingChar;


void setup() {

  Serial.begin(9600);
  SIM7000.begin(19200);

  // put your setup code here, to run once:
  SIM7000.print("AT+CMGF=1\r");  //put in text mode
  delay(100);
  SIM7000.print("AT+CGDCONT=1\"IP\",\"super\"\r"); //create profile.  "super" is APN for twilio super sim
  delay(1000);
  SIM7000.print("AT+COPS=1,2,\"310410\"\r"); //log on to AT&T network
  delay(5000);
  SIM7000.print("AT+SAPBR=3,1,\"APN\",\"super\"\r"); //create SAPBR profile.  same APN.
  delay(300);
  SIM7000.print("AT+SAPBR=1,1\r");
  delay(2000);
  Serial.println("Setup complete.  Module should be online and fast-blinking\n from successful SAPBR profile setup.\n Entering loop.  Send \"CHECK\" to test POST");
}

void loop() {


  SIM7000.print("AT+CMGL\r");

  if (SIM7000.available() > 0) {
    incomingChar = SIM7000.read();
    if (incomingChar == 'C') {
      delay(10);
      Serial.print(incomingChar);
      incomingChar = SIM7000.read();
      if (incomingChar == 'H') {
        delay(10);
        Serial.print(incomingChar);
        incomingChar = SIM7000.read();
        if (incomingChar == 'E') {
          delay(10);
          Serial.print(incomingChar);
          incomingChar = SIM7000.read();
          if (incomingChar == 'C') {
            delay(10);
            Serial.print(incomingChar);
            incomingChar = SIM7000.read();
            if (incomingChar == 'K') {
              delay(10);
              Serial.print(incomingChar);
              incomingChar = "";
              Serial.println(F("\nGOOD CHECK"));
              Serial.println(F("SENDING POST REQUEST NOW")) ;
              sendText();
              Serial.println("POST SENT");
              return;
            }
          }
        }
      }
    }
  }
  incomingChar = "";
  return;
}

void sendText()
{


  SIM7000.print("AT+HTTPINIT\r");
  delay(1000);
  getResponse();
  SIM7000.print("AT+HTTPPARA=\"CID\",1\r");
  delay(1000);
  getResponse();
  SIM7000.print("AT+HTTPPARA=\"URL\",\"http://engt62k9mgbgo.x.pipedream.net\"\r");
  delay(1000);
  getResponse();
  SIM7000.print("AT+HTTPPARA=\"CONTENT\",\"text/plain\"\r");
  delay(1000);
  getResponse();
  SIM7000.print("AT+HTTPDATA=100,5000\r\n");
  delay(100);
  getResponse();
  SIM7000.print("\"TEST MESSAGE\"\r\n");
  SIM7000.print("\r\n");
  delay(5000);
  getResponse();
  SIM7000.print("AT+HTTPACTION=1\r");
  delay(1000);
  getResponse();
  SIM7000.print("AT+HTTPTERM\r");
  getResponse();
}

void getResponse()
{
  if (SIM7000.available())
  {
    while (SIM7000.available())
    {
      data = SIM7000.read();
      Serial.write(data);
    }
    data = 0;
  }
}
//NOV 3 2020, note: need to include AT command AT+CMGD=0,4 for routinely deleting messages
//message storage limited and not automatically overwritten

我在下面的串行监视器上包含了输出。

串行监视器上的输出

我认为问题在于

SIM7000.print("AT+HTTPDATA=100,5000\r\n");

SIM7000.print("AT+HTTPACTION=1\r");

您可以在输出中看到提示下载的位置,但我尝试在此处插入的“测试消息”没有出现。我还附上了 RequestBin 输出的屏幕截图,以显示它显示为一个空 POST,只有标题和内容长度为 0。RequestBin 中的输出

当我通过 USB 在 PuTTY 上使用相同的 SIM7000A 模块和相同的 AT 命令完成类似的 POST 请求时,我所要做的就是在 AT+HTTPDATA 命令中指定的时间内输入我的文本并按回车键。在那段时间我输入的任何内容都显示为“下载”,显示为我的 POST 正文。但到目前为止,我还无法使用 Uno 做同样的事情。非常感谢您提供的任何帮助。

标签: c++httparduinoat-command

解决方案


在看到 DOWNLOAD 后,尝试将 ctrl-z 字符(十进制 26)添加到您发送的数据缓冲区的末尾。


推荐阅读