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?

  • HTTPSSL: OK

测试命令

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(必选参数) 注:同时支持 HTTPSHTTP 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

写成\rn

<file://r/n>`__ 值 得一提的是有些 PC 串口工具,例如 SSCOM,会将 :raw-latex:`r

和`:raw-latex:

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.9 终止 HTTP 任务:AT+HTTPTERM

语法规则:

命令类型

语法

返回

设置命令

AT+HTTPTERM

OK

测试命令

AT+HTTPTERM=?

OK

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>

<p>鐧惧害缈昏瘧</p>

<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依次执行下去 |

4 相关资料以及购买链接

《AT指令手册》

相关开发板购买链接 Air724UG开发板 Air724 开发板使用说明

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://doc.luatos.wiki/626/