使用 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"
- 移动运营商:南非 Vodacom
- CSQ信号强度:26
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
一些可能有帮助的事情:
您应该等到 GSM 模块 returns Connect
收到 mySerial.print("AT+QHTTPPOST=187,60,7\r");
命令。之后你应该发送 post 数据。
当您使用 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");
附加信息:
我正在以 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"
- 移动运营商:南非 Vodacom
- CSQ信号强度:26
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
一些可能有帮助的事情:
您应该等到 GSM 模块 returns
Connect
收到mySerial.print("AT+QHTTPPOST=187,60,7\r");
命令。之后你应该发送 post 数据。当您使用
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");