本帖最后由 冒险武者 于 2018-3-1 17:15 编辑
由于这次我想用http协议数据来控制LED的亮灭
但是HTTP不支持平台数据下发,这就需要我们获取平台数据,采用的是GET
相对上传数据,数据的获取与解析比较复杂,因此留在上传数据后讲解。
先简单看看协议,如下图所示:
HTTP方法 | | | //api.heclouds.com/devices/device_id/datapoints | URL参数
| datastream_id=a,b,c //查询的数据流,多个数据流之间用逗号分隔(可选) start=2015-01-10T08:00:35 //提取数据点的开始时间(可选) end=2015-01-10T08:00:35 //提取数据点的结束时间(可选) duration=3600 //查询时间区间(可选,单位为秒) start+duration:按时间顺序返回从start开始一段时间内的数据点 end+duration:按时间倒序返回从end回溯一段时间内的数据点
limit=100 //限定本次请求最多返回的数据点数,0<n<=6000(可选,默认1440) cursor= //指定本次请求继续从cursor位置开始提取数据(可选) sort=DESC | ASC //值为DESC|ASC时间排序方式,DESC:倒序,ASC升序,(不带任何参数或仅携带limit参数-默认降序,其他情况-默认升序) | | api-key: 242RprHyALimOZLCKiXeT7IRdLM= //masterkey 或者 该设备的设备apikey |
根据协议,我们需要上传数据到平台
- void sendGetCmd(void)
- {
- char TXbuf[256];
- memset(TXbuf, 0, sizeof(TXbuf));
- sprintf(TXbuf, "GET /devices/%s/datapoints?datastream_id=num&type=3 HTTP/1.1\r\napi-key:%s\r\nHost:api.heclouds.com\r\n\r\n\r\n",
- DEVID, APIKEY); //Temperature,Humidity
- client.print(TXbuf);
- }
代码主要上传的数据是:
- GET /devices/DEVID/datapoints?datastream_id=num&type=3 HTTP/1.1
- api-key:APIKEY
- Host:api.heclouds.com
- Connection:close
DEVID,是设配ID号
APIKEY,是产品密钥
替换上去就可以了
通过sendGetCmd到ONENET平台后,需要ESP32获取平台的数据
我设置的缓冲数据有点大,主要是担心溢出,因为平台下发的数据是cjson格式的,
对于cjson格式的讲解,有需要很大篇幅,在后面简介一下。
反复获取服务器发来的数据
- while (client.available())
- {
- char c = client.read();
- if (c == '{')
- ResponseBegin = true;
-
- if (ResponseBegin)
- {
- //returnValue += c
- if (bufCount >= BUFNUM) bufCount = 0;
- TCPBUF[bufCount++] = c;
- }
- }
数据获取后就是对数据的解析:
先来看看完整的数据
- HTTP/1.1 200 OK
- Date: Wed, 28 Feb 2018 14:11:21 GMT
- Content-Type: application/json
- Content-Length: 132
- Connection: close
- Server: Apache-Coyote/1.1
- Pragma: no-cache
- {"errno":0,"data":{"count":1,"datastreams":[{"datapoints":[{"at":"2018-02-14 20:17:37.000","value":1}],"id":"num"}]},"error":"succ"}
前面一段时HTTP格式响应GET的报文数据
后面一段{}包括起来的数据才是我们需要分析的数据,可以看到,我们仅仅获取了一个数据单元num就有这么复杂,
这一段就是cjson格式数据流
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。(来自“开源中国”资料)。
cJSON从名字可知,整个项目都是以极标准的C来写的,意思说,可以跨各种平台使用了。cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。
附上cjson库函数,直接可以调用来解析数据
cJSONFiles.zip
(24.83 KB, 下载次数: 0)
下面自己编写printCjson解析数据流,仅供参考
|