c++ - 如何在使用带有 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 做同样的事情。非常感谢您提供的任何帮助。
解决方案
在看到 DOWNLOAD 后,尝试将 ctrl-z 字符(十进制 26)添加到您发送的数据缓冲区的末尾。
推荐阅读
- python - 我收到一个属性错误:'' AttributeError: 'Grid' object has no attribute 'board'''
- pyspark - 从 pyspark 数据帧插入数据时,雪花中的锁定问题
- android - 当元素添加到数组状态时,反应原生 FlatList 重新渲染
- java - Spring Boot + Infinispan Embedded - 当要缓存的对象已被修改时如何防止 ClassCastException?
- python - Python 谷歌地理定位错误地址
- javascript - 如何使用 javascript 按卡片正确过滤项目?
- java - Scanner.skip() NoSuchElementException
- apache-kafka - Kafka 序列化/反序列化复杂对象
- r - 如何使用基于现有目标的 `targets::tar_target()` 创建新目标时使用迭代
- c - 如何解决模式?