连接OneNET平台HTTP设备流程
该文档介绍了A900E连接 OneNET HTTP平台设备的例程,包括在终端自动创建设备和上传数据流。
[1.AM900E_HTTP的AT命令](https://easydoc.xyz/?#/doc/20664339/D5sNAlbL/c40SFln5)
[2.AM900E连接ONENET HTTP设备例程](https://github.com/AmaziotDemo/AM900E_ALIYUN_MQTT)
## 1.HTTP协议连接ONEENT流程

## 2.连接ONENET平台HTTP设备实例
### 2.1 [登录ONENET平台](http://open.iot.10086.cn/)创建产品
进入[开发者中心](http://open.iot.10086.cn/product),选择公共协议产品,根据实际情况创建自己的产品(此文档以AM900EHTTP为例),如下图所示。

### 2.2 创建设备
在终端发送AT命令,自动创建产品下的设备
```
AT+CGATT=1 //挂接 GPRS 网络
OK
AT+CGDCONT=1,"IP","cmmtm" //设置 PDP 上下文
OK
AT+CGACT=1,1 //激活PDP 上下文
OK
AT+HTTPINIT //初始化HTTP
OK
AT+HTTPPARA = "CID","1" //设置承载上下文标识
OK
```
下图红色方框中为设备注册码

```
AT+HTTPPARA = "URL","http://api.heclouds.com/register_de?register_code=W9cBpEOL3ZZrrKuH"
OK //设置要访问的url,在onenet上创建HTTP设备,“register_code=”后面为设备注册码
AT+HTTPPARA="CONTENT","application/json" //设置内容为json格式
OK
AT+HTTPPARA="API_KEY","jnabYv67umQptNP3gvyZPv9fcl8=" //设置API key
OK
AT+HTTPDATA //输入HTTP数据
>
{"sn","201903"} //设备编号
AT+HTTPACTION=1 //执行put命令
OK
1 200 96 //执行成功返回26字节数据
AT+HTTPREAD = "0","96" //读取返回数据
OK //显示创建成功
+HTTPREAD: 96
{"errno":0,"data":{"device_id":"537721723","key":"QhYo1auW57sF39rvHV4Xd=Pf9HI="},"error":"succ"}
AT+HTTPTERM //终止HTTP
OK
```
下图红色方框中表示创建的设备ID与设备APIKEY

### 2.3上传设备信息(温度,MP2.5)
```
AT+HTTPINIT //重新初始化HTTP
OK
AT+HTTPPARA = "CID","1" //设置承载上下文标识
OK
AT+HTTPPARA = "URL","http://api.heclouds.com/devices/ 537721723 /datapoints?type=5"
OK //设置要访问的url,设定设备数据流格式
AT+HTTPPARA="CONTENT","application/json" //设置内容为json格式
OK
AT+HTTPPARA="API_KEY"," QhYo1auW57sF39rvHV4Xd=Pf9HI="//设置API key
OK
AT+HTTPDATA //输入HTTP数据
>
,;temperature,24.5;PM2.5,129 //上传数据流信息
AT+HTTPACTION=1//执行put命令
OK
1 200 26 //执行成功返回26字节数据
AT+HTTPREAD = "0","26" //读取返回数据
OK
+HTTPREAD: 26
{"errno":0,"error":"succ"} //显示上传成功
AT+HTTPTERM //终止HTTP
ok
```
下图中红色方框中表示上传的数据(PM2.5,temperature)

## FAQ
### 1.AM900E向ONENET云平台发送HTTP协议的数据上传报文
POST /devices/537721723/datapoints HTTP/1.1
api-key:QhYo1auW57sF39rvHV4Xd=Pf9HI=
Host:api.heclouds.com
Connection:on
Content-Length:66
{"datastreams":[{"id":"temperature","datapoints":[{"value":34}]}]}
发送完成1分钟之后,连接断开,是因为HTTP协议只能维持1分钟连接,如果想维持连接,需要再1分钟之内发送数据上传报文。如果将上述报文的Connection:on改为Connection:close,发送报文完成之后连接就会中断,即成为短连接。
### 2. 长连接
长连接,也叫持久连接,在TCP层握手成功后,不立即断开连接,并在此连接的基础上进行多次消息(包括心跳)交互,直至连接的任意一方(客户端OR服务端)主动断开连接,此过程称为一次完整的长连接。HTTP 1.1相对于1.0最重要的新特性就是引入了长连接。
### 3. 短连接
短连接,顾名思义,与长连接的区别就是,客户端收到服务端的响应后,主动释放连接。也有服务端主动断连的情况,凡是在一次消息交互(发请求-收响应)之后立刻断开连接的情况都称为短连接。
注:短连接是建立在TCP协议上的,有完整的握手挥手流程,区别于UDP协议;
HTTP协议是基于TCP的;
### 4. 如何快速区分当前连接使用的是长连接还是短连接?
1. 凡是在一次完整的消息交互(发请求-收响应)之后,立刻断开连接(有一方发送FIN消息)的情况都称为短连接;
2. 长连接的一个明显特征是会有心跳消息(也有没有心跳的情况),且一般心跳间隔都在30S或者1MIN左右,用wireshark抓包可以看到有规律的心跳消息交互(可能会存在毫秒级别的误差)。
### 5. 什么时候用长连接,短连接?
1. 需要频繁交互的场景使用长连接, 点对点的通讯,而且连接数不能太多情况 ,相反则使用短连接,比如普通的web网站,ttp服务一般都用短链接(http1.0只支持短连接,1.1keep alive 带时间,操作次数限制的长连接),只有当浏览器发起请求时才会建立连接,服务器返回相应后,连接立即断开。
2. 维持长连接会有一定的系统开销,用户量少不容易看出系统瓶颈,一旦用户量上去了,就很有可能把服务器资源(内存/CPU/网卡)耗尽,所以使用需谨慎。