PC机使用网络调试助手获取onenet的数据

在上一篇博客中,我写了如何向onenet发送数据,本文主要介绍通过http协议GET到之前上传的数据。

http://blog.csdn.net/qq_29219435/article/details/78471448

报文如下:

GET /devices/6523751/datastreams/ADC_1 HTTP/1.1
api-key:4pjuTJRDF1jFiH5y6uj5zN7UKH4=
Host:api.heclouds.com
Connection:close

第一行的ADC_1是我的数据流,6523751、4pjuTJRDF1jFiH5y6uj5zN7UKH4=换成你的设备号和API_KEY。
最后一行Connection:close 后面要有空行 。
使用TCP网络调试助手连接onenet并发送报文。
PC机使用网络调试助手获取onenet的数据_第1张图片
如上图,由于软件问题导致的GET与后面的看上去像是分行了,实际上没有。报文一定是要跟上面的格式或者说排版一样。
获取到的信息当中,第一行应该是软件自带的提示。
后面的是一些HTTP报文的首部信息,里面包含了一些很重要的信息,但暂时不用理会。
重要的

{“errno”:0,”data”:{“update_at”:”2017-11-07
19:18:49”,”unit”:”浼忕壒”,”id”:”ADC_1”,”unit_symbol”:”V”,”current_value”:15},”error”:”succ”}

现在暂时不对时间进行说明。“unit”后面的乱码其实是软件本身的原因,我的应该是中文的  伏特  。          
真正有用的信息是"id":"ADC_1"和"current_value":15     
从这里可以看出上一次发送过去的ADC_1是15,这次接收到的也是15,说明没错。        
下面是如何在不使用cjson的情况下简单获取报文里面的内容。

首先定义数据存放的缓冲区和数据流结构体。
typedef struct {
char name[32];
float value;
}STREAM;

char buffer[128];

extern char rebuffer[1024]
rebuffer是数据接收缓冲区,buffer是用来存放{}之间的数据。

“`
/*
** @author siyuan
** @edition 1.0
* @param char jsondatapoint 存放字符串数据的字符数组指针
** @return
** 如果jsondatapoint
* 有‘{’和‘}’则返回 char 全局变量 buffer[128] 的指针
** 否则
** 返回 NULL
*/

char * checkjson(char* jsondatapoint){
memset(buffer, 0, sizeof(buffer));
if(!jsondatapoint)return NULL;
char *bufferpoint = buffer;
jsondatapoint = strstr(jsondatapoint,”{“);
if(jsondatapoint&&strstr(jsondatapoint,”}”)){
do{
*bufferpoint++ = *jsondatapoint;
}while(*jsondatapoint++ != ‘}’);
return jsondatapoint;
}
return NULL
;
}

“` 。

首先将{}之间的数据存到buffer数组
可以不转存直接获取数据。
然后是
/*
** @author siyuan
** @edition 1.0
* @param STREAM stream STREAM结构体句柄指针
** @param char streampoint[] 字符串指针
** @return
** 如果字符串满足格式 “id”:”(任意字符串)”(任意字符串)value”:(数字)[,}]
* 则返回 @param STREAM stream
** 如果不满足
** 则返回空指针,必须检测返回值
*/

STREAM* getstreamdata(STREAM* stream,char streampoint[]){
if((!stream)||(!streampoint))return NULL;
memset(stream->name, 0, sizeof(stream->name));
char *datapoint = NULL;
if(NULL == (datapoint = strstr(streampoint,”\”id\”:”)))return NULL;
datapoint+=6;
char i = 0;
int j = 10;
do{
stream->name[i++] = *datapoint++;
}while(*datapoint !=’”’);
if(NULL == (datapoint = strstr(streampoint,”value\”:”)))return NULL;
datapoint += 7;
_Bool flag = false;
stream->value = 0;
do{
if(*datapoint == ‘.’){flag = true;datapoint++;}
else if(*datapoint<’0’||*datapoint>’9’)return NULL;
if(flag){
stream->value += (float)(*datapoint++-48)/j;
j *=10;
}
else{
stream->value = stream->value*10-48+*datapoint++;
}
}while((*datatapoint != ‘,’)&&(*datapoint != ‘}’));
return stream;
}
其实思路很简单,如果搜索到了”id”:” 就将后面的字符串视为数据流名称。如果搜索到了value”:就将后面的数据存放到float变量里面。如果数据流名称以及值都获取到就返回STREAM结构体的指针,否则返回NULL。

你可能感兴趣的:(onenet)