一、STM32+AT指令+HTTP协议连接ONENET
移值了安信可官方的例程,可保证稳定连接,不过需要注意每次上电连接后,复位并不能使用8266断开连接,因为8266供电还在,依然保持在透传模式和ONENET服务器的连接,若要重新连接,需要断电后重新上电。加入了串口1来看ESP8266的连接状态。
发送的AT指令顺序为
AT+RESTORE 初始化ESP8266
AT+CWMODE=1 配置为STA模式
AT+CWJAP=“XXX”,"123456789" 连接网络
AT+CIPMUX=0 配置为单连接
AT+CIPSTART="TCP","183.230.40.33",80 连接ONENET服务器
AT+CIPMODE=1
AT+CIPSEND 进入透传模式
随后即可向服务器发HTTP报文来实现向服务器传数据,HTTP协议一般用于简单的实时数据上传
HTTP报文说明
名词:①数据流:就是要上传的数据名字,比如temp,可以再ONENET创建,也可以在报文发送,ONENET会自动创建没有的数据流。②数据点:就是数据流的值, 数据点中的value表示具体的值,其值为JSON对象,可以为整型、字符串多种类型。如果value部分用双引号括起来,则其在设备云存储为字符串,如果不用双引号括起来,则其表示数字。
报文格式如下
HTTP报文由请求行、请求头部、报文数据组成
请求行包含HTTP方法、URL和协议版本组成
下面的实例
POST /devices/7058xxx72/datapoints?type=3 HTTP/1.1
api-key:XNmVBSWyYSxxxxxxxxxxxLXA3KM=
Host:api.heclouds.com
Content-Length:59
{"hum":25,"temp":65}
POST就是HTTP方法(新增资源信息),/devices/7058xxx72/datapoints?type=3是URL,HTTP/1.1是协议版本,如果是1.0版本,发送完数据后会断开连接,但1.1版本不会。
api-key:XNmVBSWyYSxxxxxxxxxxxLXA3KM=
Host:api.heclouds.com
Content-Length:59
是请求头部,包含api-key和Host请求主机名。Content-Length是数据内容长度
报文数据完整写法如下
{"datastreams":[{"id":"val1", "datapoints":[{"value":10}]},{"id":"val2", "datapoints":[{"value":20}]},{"id":"val3", "datapoints":[{"value":30}]}]}
即发送三个数据流datastreams,分别是val1,值为10;val2,值为20;val3,值为30
也有简写的方式,有三种简写的方式,对应URL最后的type=3,4,5
/<API_ADDRESS>/devices/<device_id>/datapoints?type=3
{"temperature":22.5,"humidity":"95.2%"}
表示在数据流temperature中增加一个数据点22.5,在humidity中增加一个数据点95.2%。
//<API_ADDRESS>/devices/<device_id>/datapoints?type=4
{"temperature":{"2015-03-22T22:31:12":22.5}}
表示在数据流temperature中加一个数据点,在2015年2月22日22点31分12秒的值为22.5
//<API_ADDRESS>/devices/<device_id>/datapoints?type=5
,;temperature,2015-03-22T22:31:12,22.5;102;pm2.5,89;10
消息中最前面两位为用户自定义的域中分隔符和域间分隔符,这两个分隔符不能相同。比如采用逗号作为域中分隔符,分号作为域间分隔符的格式如下:
,;feild0;feild1;…;feildn
其中,每个field格式支持3种,下面以逗号作为域中分隔符进行说明:
field格式1: 3个子字段,分别是数据流ID,时间戳,数据值。通用格式:
Datastream_id,datetime,value
field格式2: 2个子字段,分别是数据流ID和数据值,省略时间戳。通用格式:
Datastream_id,value
field格式3: 1个子字段,省略了数据ID和时间戳,只传输数据值,平台将用该域所在的位置号(从0开始)作为数据流ID。
示例:
(1),;temperature,2015-03-22T22:31:12,22.5;102;pm2.5,89
此段数据一共包括3个数据点,改写为基本格式为:
{ "datastreams": [ { "id": "temperature", "datapoints": { "at": "2015-03-22T22:31:12", "value": "22.5" } }, { "id": "1", "datapoints": { "value": "102" } }, { "id": "pm2.5", "datapoints": { "value": "89" } } ] } |
在移值中遇到的问题:处理串口接收中断,未限制好数组的可行域范围,导致访问越界,进入HardFault。