OneNET HTTP协议的使用

本文详细介绍如何使用OneNET平台的HTTP协议进行数据上报和获取,包括使用TCP&UDP测试工具进行调试的方法,以及使用C语言代码实现数据流的POST和GET操作。通过实际案例,读者可以了解到如何连接OneNET平台,POST数据流,以及如何GET数据流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

        在OneNET平台的HTTP协议可以说是最简单的一种协议,使用的是HTTP的RESTful风格接口,可以作为新手用来入门OneNET各类协议的协议。在OneNET它是一种短连接协议,只能用于数据上报,不能下发命令,如果你想要实现命令下发可以用EDP协议或者MQTT协议。本文向将用工具调试方法,再用C语言代码讲解,用socket来通信,不贴出socket代码,代码在另外一篇博客OneNET的EDP协议讲解与应用有贴出。本文只POST、GET一个数据流或一个数据点,读者若想实现多个数据流或数据点的POST、GET,可参考本文代码,并参考OneNET HTTP协议开发文档

一、用TCP&UDP测试工具调试 

 1、工具下载

可以到TCPUDP测试工具下载,或者直接百度搜索“TCP&UDP测试工具”下载。

2、连接服务器

(1)打开工具,输入服务器IP地址和端口,OneNET HTTP协议 对应的服务器IP为:183.230.40.33,端口为:80

(2)点击连接

3、POST数据流

POST /devices/505619290/datapoints HTTP/1.1
api-key:SlxhH3MCLvuuvXJ0N=a14Yo6EAQ=
Host:api.heclouds.com
Content-Length:66

{"datastreams":[{"id":"test_stream","datapoints":[{"value":28}]}]}

设备ID:505619290
api-key:SlxhH3MCLvuuvXJ0N=a14Yo6EAQ=
Content-Length:66,66的长度为:{"datastreams":[{"id":"test_stream","datapoints":[{"value":28}]}]}  的长度
Content-Length:66 下面一定要换行。
数据流名称:test_stream
数据流值:28

 成功之后,在对应设备可以看到:

 

4、GET数据流

GET http://api.heclouds.com/devices/505619290/datapoints?datastream_id=test_stream HTTP/1.1
api-key:SlxhH3MCLvuuvXJ0N=a14Yo6EAQ=
Host:api.heclouds.com


设备ID:505619290
api-key:SlxhH3MCLvuuvXJ0N=a14Yo6EAQ=
Host:api.heclouds.com之后要有两个换行\r\n\r\n

由下图可在成功GET数据:

 

二、用C语言讲解OneNET HTTP协议的使用

1、连接OneNET平台

OneNET HTTP协议 对应的服务器IP为:183.230.40.33,端口为:80。代码如下:

typedef enum
{
	HTTP_SRV_CONNECT_OK = 0,
	HTTP_SRV_CONNECT_ERROR = 1
}http_srv_connect_t;

char *g_onenet_http_srv_ip_addr = "183.230.40.33";
int   g_onenet_http_srv_ip_port = 80;

/* socket id */
int g_onenet_http_socket_id = -1;

/**************************************************************
函数名称 : onenet_http_service_connect
函数功能 : 连接OneNET平台
输入参数 : ip_addr:ip地址,ip_port:端口
返回值  	 : HTTP_SRV_CONNECT_OK:连接成功,
		   HTTP_SRV_CONNECT_ERROR:连接失败
备注		 : 无
**************************************************************/
http_srv_connect_t onenet_http_service_connect(char *ip_addr, int ip_port)
{
	g_onenet_http_socket_id = socket_create();
	
	if(g_onenet_http_socket_id < 0)
	{
		ONENET_HTTP_LOG("connect failed, g_onenet_mqtt_socket_id < 0");
		return HTTP_SRV_CONNECT_ERROR;
	}

	if(CONNECT_ERROR == socket_connect_service(g_onenet_http_socket_id, ip_addr, ip_port))
	{
		ONENET_HTTP_LOG("connect failed, connect error");
		return HTTP_SRV_CONNECT_ERROR;
	}
	else
	{
		ONENET_HTTP_LOG("connect success");
		return HTTP_SRV_CONNECT_OK;
	}
	
}

/* 连接OneNET平台 */
if(HTTP_SRV_CONNECT_OK == onenet_http_service_connect(g_onenet_http_srv_ip_addr, g_onenet_http_srv_ip_port))
{
    ONENET_HTTP_LOG("connect success");
}
else
{
    ONENET_HTTP_LOG("connect failed");
}

2、POST数据流到设备

代码如下:

typedef enum
{
	HTTP_POST_OK = 0,
	HTTP_POST_ERROR = 1
}http_post_t;

char *g_onenet_http_pro_api_key = "SlxhH3MCLvuuvXJ0N=a14Yo6EAQ=";
char *g_onenet_http_dev_id = "505619290";

/* 数据流 */
int data_point = 18;
char *data_stream_name = "temperature";

/**************************************************************
函数名称 : onenet_http_post_data_stream
函数功能 : post OneNET平台
输入参数 : 无
返回值  	 : HTTP_POST_OK:发送POST成功,
		   HTTP_POST_ERROR:发送POST失败
备注		 : 无
**************************************************************/
http_post_t onenet_http_post_data_stream(char *dev_id, char *api_key)
{
	char post_buf[ONENET_HTTP_POST_MAX_LEN];
	char post_content[ONENET_HTTP_POST_CONTENT_MAX_LEN];
	char post_content_len[4];
	
	memset(post_content, 0, sizeof(post_content));
	memset(post_buf, 0, sizeof(post_buf));
	
	sprintf(post_content,"{\"datastreams\":[{\"id\":\"%s\",\"datapoints\":[{\"value\":%d}]}]}",data_stream_name, data_point);
	sprintf(post_content_len,"%d",strlen(post_content));
		
	strcat(post_buf, "POST /devices/");
	strcat(post_buf, dev_id);
	strcat(post_buf, "/datapoints HTTP/1.1\r\n");
	strcat(post_buf, "api-key:");
	strcat(post_buf, api_key);
	strcat(post_buf, "\r\n");
	strcat(post_buf, "Host:api.heclouds.com\r\n");
	strcat(post_buf, "Content-Length:");
	strcat(post_buf, post_content_len);
	strcat(post_buf, "\r\n\r\n");
	strcat(post_buf, post_content);
	strcat(post_buf, "\r\n\r\n");

	if(socket_send(g_onenet_http_socket_id, post_buf, strlen(post_buf)) > 0)
	{
		return HTTP_POST_OK;
	}
	else
	{
		return HTTP_POST_ERROR;
	}
}

/* POST数据流 */
if(HTTP_POST_OK == onenet_http_post_data_stream(g_onenet_http_dev_id, g_onenet_http_pro_api_key))
{
    ONENET_HTTP_LOG("post success");
}
else
{
    ONENET_HTTP_LOG("post failed");
}

POST成功之后,在拼平台对应设备可以查看到:

 

3、获取平台下发的结果

代码如下:

TaskHandle_t g_onenet_http_device_recv_pro_task_handle = NULL;	

/**************************************************************
函数名称 : onenet_http_device_recv_pro
函数功能 : 平台返回数据检测处理
输入参数 : data:平台返回的数据
返回值  	 : 无
备注		 : 无
**************************************************************/
void onenet_http_device_recv_pro(unsigned char *dataPtr)
{
	uart_printf("%s", dataPtr);/* 将平台下发的结果通过串口打印出来 */
}

#define ONENET_MQTT_RECV_MAX_SIZE	1024
/**************************************************************
函数名称 : onenet_http_device_recv_pro_task
函数功能 : 接收onenet下发数据处理任务函数
输入参数 : pvParameter:任务入口参数
返回值  	 : 无
备注		 : 无
**************************************************************/
void onenet_http_device_recv_pro_task(void *pvParameter)
{
	unsigned char data_ptr[ONENET_MQTT_RECV_MAX_SIZE];
		
	memset(data_ptr, 0, sizeof(data_ptr));
	
	while(1)
	{
		if(socket_receive(g_onenet_http_socket_id, data_ptr, ONENET_MQTT_RECV_MAX_SIZE) > 0)	//使用MSG_DONTWAIT会比较稳定
		{
			onenet_http_device_recv_pro(data_ptr);	//集中处理
			memset(data_ptr, 0, sizeof(data_ptr));
		}	
		vTaskDelay(1);	
	}
}
/**************************************************************
函数名称 : onenet_http_device_recv_pro_task_init
函数功能 : 创建接收onenet下发数据处理任务
输入参数 : 无
返回值  	 : 无
备注		 : 无
**************************************************************/
void onenet_http_device_recv_pro_task_init(void)
{
	if(g_onenet_http_device_recv_pro_task_handle == NULL) {
            xTaskCreate(onenet_http_device_recv_pro_task,
                            "onenet_http_device_recv_pro_task",
                            1024 * 4 / sizeof(portSTACK_TYPE),
                            NULL,
                            TASK_PRIORITY_NORMAL,
                            &g_onenet_http_device_recv_pro_task_handle);
            ONENET_HTTP_LOG("onenet_http_device_recv_pro_task");
        }

}

串口打印POST的结果如下:

4、GET数据流

代码如下:

char *g_onenet_http_pro_api_key = "SlxhH3MCLvuuvXJ0N=a14Yo6EAQ=";
char *g_onenet_http_dev_id = "505619290";

char *get_data_stream_name = "test_stream";

/**************************************************************
函数名称 : onenet_http_get_data_stream
函数功能 : GET OneNET平台数据流
输入参数 : 无
返回值  	 : HTTP_GET_OK:发送GET成功
		   HTTP_GET_ERROR:发送GET失败
备注		 : 无
**************************************************************/
http_get_t onenet_http_get_data_stream(char *dev_id, char *api_key)
{
	char get_buf[ONENET_HTTP_GET_MAX_LEN];
	
	memset(get_buf, 0, sizeof(get_buf));
		
	strcat(get_buf, "GET http://api.heclouds.com/devices/");
	strcat(get_buf, dev_id);
	strcat(get_buf, "/datapoints?datastream_id=");
	strcat(get_buf, get_data_stream_name);
	strcat(get_buf, " HTTP/1.1\r\n");
	strcat(get_buf, "api-key:");
	strcat(get_buf, api_key);
	strcat(get_buf, "\r\n");
	strcat(get_buf, "Host:api.heclouds.com\r\n");
	strcat(get_buf, "\r\n\r\n");

	if(socket_send(g_onenet_http_socket_id, get_buf, strlen(get_buf)) > 0)
	{
		return HTTP_GET_OK;
	}
	else
	{
		return HTTP_GET_ERROR;
	}
}

/* GET数据流 */
if(HTTP_GET_OK == onenet_http_get_data_stream(g_onenet_http_dev_id, g_onenet_http_pro_api_key))
{
    ONENET_HTTP_LOG("get success");
}
else
{
    ONENET_HTTP_LOG("get failed");
}

串口打印GET的结果如下:

### HTTP协议OneNet平台上进行数据上报的方法 #### 一、基本原理 OneNet平台支持多种通信方式,其中包括HTTP协议。通过HTTP POST请求可以将传感器采集的数据上传至云端服务器[^1]。这种方式适用于不具备复杂网络协议栈的嵌入式设备或者基于单片机的应用场景。 #### 二、实现步骤说明 ##### 1. 注册并创建应用 登录OneNet官网完成账号注册后,在控制台新建一个项目,并记录下该项目对应的`Product ID``Device API Key`等必要参数[^2]。 ##### 2. 配置URL地址 构建用于提交数据的目标URL形式如下所示: ``` http://api.heclouds.com/devices/{device_id}/datapoints?datastream_id={datastream_name} ``` 其中 `{device_id}` 是指代目标装置唯一标识符;而 `datastream_name` 则代表特定类型传感数值流的名字标签[^3]。 ##### 3. 准备JSON格式负载体 按照官方文档定义的标准结构化我们的传输包内容样例代码片段展示于此处: ```json { "datastreams": [ { "id": "temperature", "datapoints": [ {"value": 25} ] }, { "id": "humidity", "datapoints": [ {"value": 60} ] } ] } ``` 此处我们假设温度(`temperature`)读数为25度 Celsius ,湿度 (`humidity`)百分比值设定了60%作为演示用途。 ##### 4. 设置Header头部字段 为了验证身份合法性以及指定媒体类别属性,需附加两个关键头项分别是Authorization (携带前面提到过的 Device API key 加密字符串) 及 Content-Type ("application/json") 。例如: ```bash Authorization: Bearer {your_device_api_key_here} Content-Type: application/json ``` ##### 5. 发送POST 请求 利用任意一种能够发起RESTful风格调用的技术手段执行上述组装完毕后的完整请求操作即可成功达成目的。以下是采用cURL命令行工具的一个简单例子供参考学习之用: ```bash curl -X POST \ -H 'Authorization:Bearer YOUR_DEVICE_API_KEY' \ -H 'Content-Type:application/json' \ --data '{"datastreams":[{"id":"temperature","datapoints":[{"value":25}]},{"id":"humidity","datapoints":[{"value":60}]}]}' \ https://api.heclouds.com/devices/YOUR_DEVICE_ID/datapoints ``` 请注意替换占位符部分的实际有效信息前缀分别为YOUR_开头的各项变量名所指示的具体取值。 --- ### 示例程序清单 下面给出一段Python脚本用来自动化这一过程的例子: ```python import requests import json def upload_data(device_id, api_key, data): url = f"http://api.heclouds.com/devices/{device_id}/datapoints" headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } response = requests.post(url=url, headers=headers, data=json.dumps(data)) if response.status_code == 200: print("Data uploaded successfully.") else: print(f"Failed to upload data with status code:{response.status_code}") if __name__ == "__main__": device_id = "Your_Device_Id_Here" api_key = "Your_Api_Key_Here" temperature_value = 27 humidity_value = 58 payload = { "datastreams":[ {"id":"temperature", "datapoints":[{"value":temperature_value}]}, {"id":"humidity", "datapoints":[{"value":humidity_value}]} ] } upload_data(device_id=device_id, api_key=api_key, data=payload) ``` 此段脚本实现了从本地计算机向远程OneNet服务端推送两条独立维度测量结果的功能示范。 ---
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值