前面两节说了MQTT协议的简单用法,本意是希望你们多练习,结果今天登陆平台,收到了系统提示:
这是要收费了么,so sad!
算了,尽人事听天命吧!
前面两节的内容,实现的效果都是设备和设备之间的通信,物联网平台只是作为一个传输的媒介。但如果我想把数据传回物联网平台,应该怎么搞?
这就是这次要说的内容,TCP的POST操作!如何实现?先看一下官网的文档:
https://open.iot.10086.cn/doc/book/application-develop/api/TCP/15.%E4%B8%8A%E4%BC%A0%E6%95%B0%E6%8D%AE%E7%82%B9.html
该链接中说了上传数据点的方法,示例如下:
POST http://api.heclouds.com/devices/device_id/datapoints HTTP/1.1
device_id:需要替换为设备ID
上传的数据内容如下:
数据内容比较多,我就截了一部分,只要知道上传的数据是JSON格式即可。那么具体如何实现呢?和第15节内容类似,需要先对链接进行解析,得到主机、端口和路径等参数,然后结合API_KEY等其他信息,组成特定的数据格式,上传给平台即可。
如果忘了15节的内容,建议先复习一下。
开始之前,还是要以多协议接入的方式添加产品、添加设备,但这次要使用HTTP的方式。
除了要选择HTTP,其它内容没什么变化。
1、接下来是具体的操作流程,简单来说,过程分四步:
对URL链接进行解析
链接上面说了,格式如下:
http://api.heclouds.com/devices/535407318/datapoints
其中的535407318是我的设备ID。解析函数和第15节一样,使用的是:
http_parse_request_url( )
解析后,得到主机、端口、路径信息。
2、整理要上传的数据
前面说了,数据是以JSON格式上传的,为了方便演示,我这里只写一个简单的数据:
{
"datastreams":[{
"id": "temperature",
"datapoints": [
{
"value": %d
}
]
}
]
}
对上面的格式进行整理,得到C语言下的内容:
{\r\n\"datastreams\":[{\r\n\"id\": \"temperature\",\r\n\"datapoints\": [\r\n{\r\n\"value\": %d\r\n}\r\n]\r\n}\r\n]\r\n}
3、整理要上传的POST信息
信息格式如下:
"POST " + filename+ " HTTP/1.1\r\n" +
"Accept: */*\r\n" +
"Content-Length:"+ %d+"\r\n"+ //JSON数据长度
"Content-Type: application/json\r\n"+
"Host: "+%s+"\r\n"+ //主机名
%s+"\r\n"+ //API_KEY
"Connection: Keep-Alive\r\n\r\n"+
%s //第2步整理好的数据
这样看起来可能有点乱,建议大家在用的时候整理成宏定义的形式,直接调用,比较方便。
4、发送数据
这一步就比较简单了,在WIFI已经连接好的情况下,将第3步整理好的信息通过TCP的方式发出去。
程序修改完成,保存、清理、编译、下载一条龙,然后重新上电。这里借助串口助手来查看效果。效果如下所示:
如图所示,红色框住的信息是物联网平台返回的信息,0错误,说明发送成功。我这里一直在发送固定值50.我在程序里做了一个软件定时器,每隔10秒发送一次。
然后打开ONENET物联网平台,查看是否收到数据。在设备列表页面,点击“数据流”:
点开之后,效果如下:
如上所示,显示了上传的数据名称,最新的数据值,点击temperature右上角的省略号,可以看到数据值随时间变化的曲线:
如图,前面7月份的数据是我之前做测试的时候上传的值。这次的值都显示在2019年10月29日,伴随着上传的时间。
至此,TCP方式下的POST上传数据聊完了,感兴趣的可以下载源码试一下。
完整工程源码,请关注公众号:单片机爱好者,回复关键字:ESP8266,即可获取。