使用 AT 命令执行 POST 时如何自定义 HTML headers?

How do I customize HTML headers when doing a POST using AT commands?

附加信息:

我正在以 9600 波特率使用带有 SoftwareSerial 库的 Arduino Nano 与来自 Micro Elektronika 的(基于 QUECTEL M95 的)GSM2 Click 模块通信。我想 POST 使用自定义 HTML headers 在线数据。当我尝试使用 QHTTPPOST 命令添加自定义 headers 时,我无法成功将 QUECTEL 模块设置为 POST。

这是我找到的第一个 semi-useful HTTP AT 命令指南: http://www.quectel.com/UploadImage/Downlad/Quectel_WCDMA_UGxx_HTTP_AT_Commands_Manual_V1.2.pdf

这里是 QUECTEL M95 的官方命令手册:http://www.quectel.com/product/prodetail.aspx?id=7

总结:

1) 网络注册正常。

2) 不使用自定义请求时发布数据 headers 工作正常。

3) QHTTPCFG 命令不在该模块的官方文档中,但在联系 QUECTEL 支持热线时被建议使用。

4) 收到 AT 错误代码:CME 错误:3804 "HTTP get no request"

M95 AT指令格式要求:

Command < CR >


我的代码

//Set the correct URL
mySerial.print("AT+QHTTPURL=34,1\r")
mySerial.print("http://posttestserver.com/post.php\r");

响应:

OK

//Set custom request headers
mySerial.print("AT+QHTTPCFG=\"requestheader\",1\r")

响应:

OK

//Initiate post requst (length 187 characters, 60s to write, 7s to read)
mySerial.print("AT+QHTTPPOST=187,60,7\r");

响应:

CONNECT

//SEND REQUEST HEADER
mySerial.print("POST/post.php HTTP/1.1\r\n");//25 chars
mySerial.print("HOST: posttestserver.com\r\n");//26 chars
mySerial.print("Accept: */*\r\n");//13 chars
mySerial.print("User-Agent: QUECTEL_MODULE2\r\n");//29 chars
mySerial.print("Connection: Keep-Alive\r\n");//24 chars
mySerial.print("Content-Type: application/x-www-form-urlencoded\r\n");//49 chars
mySerial.print("Content-Length: 0\r\n");//19 chars
mySerial.print("\r\n");//2 chars

... MISSING:60 秒后应该有一个 OK 响应表明发送成功。

mySerial.print("AT+QHTTPREAD=5\r");

响应:

+CME ERROR: 3804

一些可能有帮助的事情:

  1. 您应该等到 GSM 模块 returns Connect 收到 mySerial.print("AT+QHTTPPOST=187,60,7\r"); 命令。之后你应该发送 post 数据。

  2. 当您使用 AT+QHTTP 命令时,您使用的是在 Quectel 模块中实现的 HTTP 层。因此,您只需发送 post 数据,而不是 POST HTTP 的整个 TCP 消息。您发送的消息是实现 HTTP 协议的 TCP 数据包。有关更多信息,您可以查看 this

从2开始,你只需要发送你想要的数据到post。从我添加的 link 你可以看到这个 HTTP POST 数据包示例:

POST /bin/login HTTP/1.1
Host: 127.0.0.1:8000
Accept: image/gif, image/jpeg, */*
Referer: http://127.0.0.1:8000/login.html
Accept-Language: en-us
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Content-Length: 37
Connection: Keep-Alive
Cache-Control: no-cache

User=Peter+Lee&pw=123456&action=login

如果你想这样做 POST 你应该这样做:

mySerial.print("AT+QHTTPPOST=37,60,7\r");

CONNECT

mySerial.print("User=Peter+Lee&pw=123456&action=login");

然后阅读回复什么的。

使用 AT TCPIP 命令而不是 AT HTTP 命令我能够解决我自己的问题。我现在已经成功发布了数据以及自定义 headers。

这是有效的代码:

mySerial.print("AT+QIOPEN=\"TCP\",\"64.90.48.15\",80\r"); 

WAIT for "CONNECT" response

mySerial.print("AT+QISEND\r");//

WAIT for ‘>’ response

//The HTML Header
mySerial.print("POST /post.php?dir=WPCN HTTP/1.1\r\n");
mySerial.print("HOST: posttestserver.com\r\n");
mySerial.print("Accept: application/json\"\r\n");
mySerial.print("User-Agent: QUECTEL_MODULE2\r\n");
mySerial.print("Content-Length: 7\r\n");
//Signifies end of Header
mySerial.print("\r\n");
//Data:
mySerial.print(“[hello]\r”);
//This is the <CTRL+Z> character which signifies end of transmission
mySerial.print("\x1A");

Response "SEND OK"

//End Data Mode
delay(1000);
mySerial.print("+++");
delay(1000);
//Close connection
mySerial.print("AT+QCLOSE\r");