HTTP/HTTPS¶
作者:闫国梁 最后修改时间:2020年8月11日
关键词:HTTP,服务器,请求服务器,下载数据
1 概述:¶
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型(AT模式模块仅能作为客户端)。HTTP是一个无状态的协议。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS,所以HTTPS相关的指令只需要参考SSL部分配置连接,其他和http都是一样的。
2 相关AT指令介绍¶
2.1 初始化 HTTP 服务:AT+HTTPINIT¶
语法规则:
命令类型 |
语法 |
返回 |
---|---|---|
执行命令 |
AT+HTTPINIT |
OK |
测试命令 |
AT+HTTPINIT=? |
OK |
注意事项 |
在使用HTTP服务前,应该先用AT+HTTPINIT命令来初始化HTTP协议栈 |
2.2 启用 SSL:AT+HTTPSSL¶
语法规则:
命令类型 |
语法 |
返回 |
|
---|---|---|---|
设置命令 |
AT+HTTPSSL= |
OK |
|
读取命令 |
AT+HTTPSSL? |
|
|
测试命令 |
AT+HTTPSSL=? |
+HTTPSSL: (0-1) OK |
|
参数 |
定义 |
取值 |
对取值的说明 |
HTTP SSL 功能开关 |
0 |
关闭 SSL 功能 |
|
1 |
开启 SSL 功能 |
2.3 设置 HTTP 参数值:AT+HTTPPARA¶
语法规则:
命令类型 |
语法 |
返回 |
---|---|---|
设置命令 |
AT+HTTPPARA= , |
OK |
查询命令 |
AT+HTTPPARA? |
+HTTPPARA: list of :) OK |
测试命令 |
AT+HTTPPARA=? |
+HTTPPARA: “HTTPParamTag”,” HTTPParamValue” OK |
参数定义:
参数 |
定义 |
取值 |
对取值的说明 |
---|---|---|---|
:H TTP参数,包括: |
|||
“CID” |
承载上 下文号码(必选参 数) |
1~3 |
|
“URL” |
HTTP 或 HTTPS URL(必选参数) 注:同时支持 HTTPS 和 HTTP URL |
“http://serve r/path:tcpPort” 或: “https://serve r/path:tcpPort” |
Server: FQDN or IP-address Path: path of file or directory tcpPort: 如果参数省略 ,将服务连接到 HTTP 默认端口 80。 参考”IETF-RFC 261 |
“UA” |
应用程序必须 设置用户代理来 识别移动终端。 通常操作系统和 软件版本信息在 设置时都会携带 浏览器标识符。 |
默认值为:合宙 module |
|
“PROIP” |
HTTP 代理服务器的 IP 地址 |
||
“PROPORT” |
HTTP 代 理 服 务 器 的 PORT |
||
“REDIR” |
作为 HTTP 客户端 时用此标志控制 重定向机制。如 果此标记设置为 1,当服务器发 送重定向码(范围 30x)时,客户 端自动发送新的 HTTP 请求 |
默认值为 0(无定向) |
|
“BREAK” |
HTTP 方法 ”GET” 的参数,整数型 |
获取从断点 到结束点的部分 数据,注意不是 所 有 的 HTTP 服 务 器 都 支 持 参数。BREAK 最小值是 0。 |
|
“BREAKEND” |
和 “BREAK”一起使用 ,用于断点续传 功能。整数型。 |
如果“ BREAKEND”大于“B REAK”,续传的范 围从“BREAKEND” 到“BREAK”。如果 “BREAKEND”小于 “BREAK”,续传的 范围从“BREAK”到 文件结尾。如果 “BREAKEN D”和“BREAK”均为 0,将不 会续传。 |
|
“USER_DEFINED” |
用户自定义参数 ,为了兼容合宙 2G 模块 |
用户自定义参数 的取值。例如: AT+HTTPPARA= “USER_DEFINED”, “Content-type: js on-user-define” 注:如果需 要设置多条用户 自定义参数,则 一条一条地输入 。后面输入的不 会覆盖以前的。 |
|
“USERDATA” |
用户自定 义参数,作用同 “USER _DEFINED”,为了 |
用户自定义参数 的取值。例如: AT+HTTPPARA= “USERDATA”,”Con |
|
兼容 SIMCOM 模块 |
tent-type: js on-user-define” 注:如果想 设置多条用户定 义参数,则多条 参数之间可以用 :raw-latex:`\r\ n `连接。例如: AT+HTTPPARA= “USERDATA”,“Con tent-Type :application/js on:raw-latex:`rnAPP KEY:FW” 在 MCU 程序中需要将: raw-latex:rn
<file://r/n>`__ 值 得一提的是有些 PC 串口工具,例如 SSCOM,会将 :raw-latex:`r
n `当做控制字 符处理,所以也 需要将:raw-late x:rn 写成\rn <file:// r/n>`__而另外 一些工具,例如 XCO M,不会将:raw-l atex:r 和:ra w-latex:n `当 做控制字符处理 ,所以直接输入 :r aw-latex:rn` |
||
: 的取值。 注: “USER_DEFINED” 和“USERDA TA”中内嵌的双引 号,用22表达。 |
举例:
命令(→) /返回(←) |
实例 |
解 释和 说明 |
---|---|---|
→ |
AT+HTTPPARA? |
|
← |
+HTTPPARA: CID: 1 URL: UA: AM_MODULE PROIP: 0.0.0.0 PROPORT: 0 REDIR: 0 BREAK; 0 BREAKEND: 0 TIMEOUT: 120 CONTENT: USERDATA: OK |
2.4 写数据:AT+HTTPDATA¶
语法规则:
命令类型 |
语法 |
返回 |
---|---|---|
设置命令 |
AT+HTTPDATA=, |
DOWNLOAD OK |
测试命令 |
AT+HTTPDATA=? |
+HTTPDATA: (取值列表),(取值列表) OK |
参数定义:
参数 |
定义 |
取值 |
对取值的说明 |
---|---|---|---|
POST 数据的大小 |
1-102400 |
最大长度为 102400 |
|
0 |
后面一个参 数不判断,相当 于把内容清除掉 |
||
输入 数据的最长时间 |
1000-120000 |
单位:ms |
|
注: 强烈建议设置的 时间要能够全部 输入所有的数据 ,下载数据的真 实大小不能大于 |
2.5 HTTP 方式激活:AT+HTTPACTION¶
语法规则:
命令类型 |
语法 |
返回 |
---|---|---|
设置命令 |
AT+HTT PACTION= |
OK 后面紧跟 Unsolicited Result Code: +HTTPACTION: ,, |
或如果错误与 ME 功能相关,则返回: +CME ERROR: 后面紧跟 Unsolicited Result Code: +HTTPACTION: ,, |
||
测试命令 |
AT+HTTP ACTION=? |
+HTTPACTION: (0-2) OK |
参数定义:
参数 |
定义 |
取值 |
对取值的说明 |
---|---|---|---|
HTTP 方法说明 |
0 |
GET |
|
1 |
POST |
||
2 |
HEAD |
||
得到的数据长度 |
整数型 |
||
HTTP 状 态码,由远端服务器响应, 参考 TTP1.1(RFC2616) |
100 |
继续(Continue) |
|
101 |
交换协议(Switching Protocols) |
||
200 |
确定(OK) |
||
201 |
已创建(Created) |
||
202 |
已接受(Accepted) |
||
203 |
非权 威消息(Non-Authoritative Information) |
||
204 |
无内容(No Content) |
||
205 |
重置内容(Reset Content) |
||
206 |
部分内容(Partial Content) |
||
300 |
多重选择(Multiple Choices) |
||
301 |
永久删除(Moved Permanently) |
||
302 |
找到(Found ) |
||
303 |
参考其他(See Other) |
||
304 |
未修改(Not Modified) |
||
305 |
使用代理服务器(Use Proxy) |
||
307 |
临时重定向(Temporary Redirect ) |
||
400 |
错误请求(Bad Request) |
||
401 |
未授权(Unauthorized) |
||
402 |
付费请求(Payment Required) |
||
403 |
禁止(Forbidden) |
||
404 |
找不到(Not Found) |
||
405 |
方法不被允许(Method not Allowed) |
||
406 |
不可接受(Not Acceptable) |
||
407 |
要 求 进 行 代 理 身 份 认 证 (Proxy AuthenticationRequired) |
||
408 |
请求超时 (Request Time-out) |
||
409 |
冲突(Conflict) |
||
410 |
所 请求资源不在服务器上有效 ,且不知道转发地址(Gone) |
||
411 |
需要输入长度(Length Required) |
||
412 |
前提条件失败 (Precondition Failed) |
||
413 |
请求实体太大(Request Entity Too Large) |
||
414 |
请求URI太长(Request-URI Too Large) |
||
415 |
媒 体类型不支持(Unsupported Media Type) |
||
416 |
所 请 求 的 范 围 无 法 满 足(Requested range notsatisfiable) |
||
417 |
执行失败(Expectation Failed) |
||
500 |
内部服务器错误(Internal Server Error) |
||
501 |
未执行 (Not Implemented) |
||
502 |
网关错误(Bad Gateway) |
||
503 |
服务不可用(Service Unavailable) |
||
504 |
网关超时(Gateway Time-out) |
||
505 |
HTTP 版本不支持(HTTP Version not supported) |
||
600 |
非 HTTP PDU 格式(Not HTTP PDU) |
||
601 |
网络错误(Network Error) |
||
602 |
内存不足(No memory) |
||
603 |
DNS 错误(DNS Error) |
||
604 |
栈忙(Stack Busy) |
||
605 |
SSL建立通道失败 |
||
606 |
SSL通讯警告错误 |
2.6 查询 HTTP 服务响应:AT+HTTPREAD¶
语法规则:
命 令 类 型 |
语法 |
返回 |
---|---|---|
设 置 命 令 |
AT+HTTPREAD= , |
+HTTPREAD: OK |
执 行 命 令 |
AT+HTTPREAD |
+HTTPREAD: OK 读取 AT+HTTPACTION=0 或 AT+HTTPDATA 命令的所有响 应数据。 执行命令用来将 HTTP 服务器的响应输出到 UART 或者输出准备好 POST 到服务器的数据。 |
测 试 命 令 |
AT+HTTPREAD=? |
+HTTPREAD: (list of supported s),( list of supporteds) OK |
参数定义:
参数 |
定义 |
取值 |
对取值的说明 |
---|---|---|---|
实际输出数据长度 |
|||
HTTP 服务器对AT+HTTPACTION=0命令 的响应数据 |
|||
输出数据的起点 |
0~319488 |
单位:字节 |
|
输出数据的长度 |
1~319488 |
单位:字节 |
2.7 查询 HTTP 头信息:AT+HTTPHEAD¶
语法规则:
命令类型 |
语法 |
返回 |
---|---|---|
执行命令 |
AT+HTTPHEAD |
+HTTPREAD: OK |
测试命令 |
AT+HTTPHEAD=? |
OK |
参数定义:
参数 |
定义 |
取值 |
对取值的说明 |
---|---|---|---|
头信息的实际长度 |
|||
头信息 |
2.8 保存 HTTP 应用上下文:AT+HTTPSCONT¶
执行命令保存包含 AT 命令参数的 HTTP 应用上下文,当系统重启时,参数将自动载入。
查询命令返回 HTTP 应用上下文。语法规则:
命令 类型 |
语法 |
返回 |
---|---|---|
执行 命令 |
AT+H TTPSCONT |
+HTTPREAD: (list of supported s),( list of supporteds) OK |
查询 命令 |
AT+HT TPSCONT? |
+HTTPSCONT: CID: URL: UA: PROIP: PROPORT: REDIR: BREAK: BREAKEND: USERDATA: OK |
参数定义:
参数 |
定义 |
取值 |
对取值的说明 |
---|---|---|---|
HTTP 上下文保存模式 |
0 |
保存,值取自 NVRAM |
|
1 |
未保存,值取自 RAM |
2.10 HTTP 错误码:ERROR:¶
HTTP 错误码会以 ERROR:形式上报。
定义:
取值 |
英文说明 |
中文说明 |
---|---|---|
0 |
Unknown session id |
未知的会话 ID |
1 |
File is too short |
文件的内容太短 |
2 |
DNS is fail |
域名解析失败 |
3 |
HTTP is busy |
HTTP 任务正忙 |
4 |
Socket is wrong |
套接字失败 |
5 |
Connect fail |
连接失败 |
6 |
File is error |
文件错误 |
7 |
Connection is closed |
连接已关闭 |
8 |
Connection is destroyed |
连接已销毁 |
9 |
HTTP header is not found |
HTTP 头不存在 |
10 |
HTTP authentication scheme is not supported |
HTTP 认证机制不支持 |
11 |
PDP active is wrong |
PDP 激活失败 |
12 |
Param is wrong |
参数有误 |
13 |
No buffer |
缓冲区不足 |
14 |
PDP deactive is wrong |
PDP 去激活失败 |
3 AT指令示例¶
实例说明:实例内容为使用AT进行POST请求
3.1 连接网络¶
3.1.1 开机¶
通过拉低powerkey2秒进行开机,开机以后通过串口循环发送AT直到收到OK,如果90秒没有收到OK请拉低 RESET_IN_N 引脚 150ms 以上。或使用其他方法见开关机章节
3.1.2 查询卡状态¶
AT+CPIN?查询卡状态,直到收到+CPIN: READY,如果10s内没有收到建议重启模块
3.1.3 查询网络注册情况¶
AT+CGATT?查询是否注册网络收到+CGATT: 1值是1即为注册成功,正常情况下注册时间不会超过两分钟,如果超过两分钟没有注册可以进入飞行模式五秒后退出再查询,或者直接重启模块。
3.1.4 激活网络¶
AT+CSTT配置网络,非私有APN以外Cat1的固件支持根据卡自动配置APN,直接输入AT+CSTT即可,模块会按照自动获取的APN设置CSTT的APN。
AT+CIICR激活网络,在IP START的状态使用AT+CIICR激活网络,激活以后通过AT+CIFSR查询是否获取IP,如果成功就可以开始配置TCP连接了,如果不成功使用AT+CIPSHUT关闭移动网络,从AT+CSTT重新进行
3.2 HTTP请求¶
AT+SAPBR=3,1,“CONTYPE”,“GPRS” |
设置HTTP功能的承载类型 SAPBR是为了激活PDP上下文 |
---|---|
OK |
|
AT+SAPBR=3,1,“APN”,”” |
设置 APN 模 块注册网络后会从网络自动获取并激 活一个PDP上下文,用于RNDIS上网使 用。此可以通过AT+CGDCONT?来查询。 V980之前(不含V980 ),需要AT+CGDCONT?查询得到并设置 : AT+SAPBR=3,,“APN”, V980之后(包含 V980),输入AT+SAPBR=3,,“APN”,”” 即可, 模块内部会按照自动获取的来设置APN |
OK |
|
AT+SAPBR=1,1 |
激活该承载的GPRS PDP上下文 |
OK |
|
AT+SAPBR=2,1 |
查询下承载的状态 |
+SAPBR: 1,1,010.169.179.213 OK |
第一个参数1表示cid 第二个参数1表示已经连接 第三个参数表示模块获取的IP地址 |
AT+HTTPINIT |
HTTP协议栈初始化 |
OK |
|
AT+HTTPSSL=1 |
设置使用SSL连接(不需要验证证书) |
OK |
|
AT+SSLCFG =“hostname”,153,“fanyi.baidu.com” |
|
OK |
|
AT+HTTPPARA=“CID”,1 |
设置HTTP会话参数:CID |
OK |
|
AT+HTTPPAR A=“URL”,“https://fanyi.baidu.com” |
设置HTTP会话参数:URL |
OK |
|
AT+HTTPDATA=4,100000 |
输入4个字节,等待时间是10S,输入 时间要设定的足够大以保证数据输入 |
DOWNLOAD 中国 OK |
DOWNLOAD表示已经准备好输入数据 输入中国(中国两个字占用4个字节) OK出现表示输入结束 |
AT+HTTPACTION=1 |
POST开始 |
OK |
|
+HTTPACTION:1,200,207751 |
表示POST成功 |
AT+HTTPREAD |
读取内容 |
| +HTTPREAD: 207751 <!DOCTYPE html>
鐧惧害缈昏瘧
<meta name=“description” content=“鐧惧害缈昏瘧鎻愪緵鍗虫椂 ……”https://fex.bdstatic.com“+d:”http://fex.bdstatic.com“+d,k&&l&&l>k||(g(function(){alog(”speed.set“,”lt“,+new Date),e=b.createElement(c),e.async=!0,e.src=d+”?v=“+~(new Date/864e5)+~(new Date/864e5),f=b.getElementsByTagName(c)[0],f.parentNode.insertBefore(e,f)}),j())}}(window,document,”script“,”/hunter/alog/dp.min.js”); }(); !function(){ require(‘translation:widget/translate/common/sectrans’); }();
OK | | | AT+HTTPTERM | 结束HTTP服务 | | OK | 下载HTTP会话从AT+SAPBR=2,1开始,如果此命令查询IP地址还在,则HTTPINIT HTTPPARA依次执行下去 |
5 常见问题¶
Q:为什么我只发了10字节消息,100次却消耗了那么多流量?
A:因为还有HTTP自带的请求头。
Q:为什么频繁请求会失败?
A:支持的http连接总数有限数量为tcp连接数量8个,建议一个http连接返回请求结果之后,再去请求下一个连接;不要使用循环定时器方式不断的发起新的http请求。
Q:如何POST文件?
A: 主要是使用AT+HTTPDATA命令录入文件数据【最长支持100KB】后,发送AT+HTTPACTION=1利用post上传
数据接收缓存问题
AT版本:有缓存机制,内存中有一个的缓冲区(2G模块300KB,4G模块319499字节),收到数据后,插入此缓冲区,然后通过AT口输出urc,提示收到的数据长度;缓冲区满之后,再收到新数据,会丢弃新收到的数据,并通过AT口输出urc提示出错;需要读取数据时,发送AT+HTTPREAD命令读取,可分段读取,也可全部读取
注意:缓冲区位于内存中,断电或者重启后,缓存表中的数据会被清空;虽然缓冲区可以缓存很多数据,但是建议收到数据时,通过AT+HTTPREAD及时读取出来,以防缓冲区满出错
AT版本如何设计HTTP应用逻辑
见文章https://luatdoc.papapoi.com/626/