OneNET HTTP协议的使用

匿名 (未验证) 提交于 2019-12-02 23:49:02
转自https://blog.csdn.net/Sanjay_Wu/article/details/84870419

前言

OneNET的EDP协议讲解与应用有贴出。本文只POST、GET一个数据流或一个数据点,读者若想实现多个数据流或数据点的POST、GET,可参考本文代码,并参考OneNET HTTP协议开发文档

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

2、连接服务器

183.230.40.33,端口为:80

(2)点击连接

3、POST数据流

  1. POST /devices/505619290/datapoints HTTP/1.1
  2. api-key:SlxhH3MCLvuuvXJ0N=a14Yo6EAQ=
  3. Host:api.heclouds.com
  4. Content-Length:66
  5. {"datastreams":[{"id":"test_stream","datapoints":[{"value":28}]}]}

设备ID:505619290
api-key:SlxhH3MCLvuuvXJ0N=a14Yo6EAQ=

Content-Length:66 下面一定要换行。
数据流名称:test_stream
数据流值:28

最后结束也需要换行。

4、GET数据流

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

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

由下图可在成功GET数据:

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

1、连接OneNET平台

183.230.40.33,端口为:80。代码如下:

  1. typedef enum
  2. {
  3. HTTP_SRV_CONNECT_OK = 0,
  4. HTTP_SRV_CONNECT_ERROR = 1
  5. }http_srv_connect_t;
  6. char *g_onenet_http_srv_ip_addr = "183.230.40.33";
  7. int g_onenet_http_srv_ip_port = 80;
  8. /* socket id */
  9. int g_onenet_http_socket_id = -1;
  10. /**************************************************************
  11. 函数名称 : onenet_http_service_connect
  12. 函数功能 : 连接OneNET平台
  13. 输入参数 : ip_addr:ip地址,ip_port:端口
  14. 返回值 : HTTP_SRV_CONNECT_OK:连接成功,
  15. HTTP_SRV_CONNECT_ERROR:连接失败
  16. 备注 : 无
  17. **************************************************************/
  18. http_srv_connect_t onenet_http_service_connect(char *ip_addr, int ip_port)
  19. {
  20. g_onenet_http_socket_id = socket_create();
  21. if(g_onenet_http_socket_id < 0)
  22. {
  23. ONENET_HTTP_LOG("connect failed, g_onenet_mqtt_socket_id < 0");
  24. return HTTP_SRV_CONNECT_ERROR;
  25. }
  26. if(CONNECT_ERROR == socket_connect_service(g_onenet_http_socket_id, ip_addr, ip_port))
  27. {
  28. ONENET_HTTP_LOG("connect failed, connect error");
  29. return HTTP_SRV_CONNECT_ERROR;
  30. }
  31. else
  32. {
  33. ONENET_HTTP_LOG("connect success");
  34. return HTTP_SRV_CONNECT_OK;
  35. }
  36. }
  37. /* 连接OneNET平台 */
  38. if(HTTP_SRV_CONNECT_OK == onenet_http_service_connect(g_onenet_http_srv_ip_addr, g_onenet_http_srv_ip_port))
  39. {
  40. ONENET_HTTP_LOG("connect success");
  41. }
  42. else
  43. {
  44. ONENET_HTTP_LOG("connect failed");
  45. }

2、POST数据流到设备

代码如下:

  1. typedef enum
  2. {
  3. HTTP_POST_OK = 0,
  4. HTTP_POST_ERROR = 1
  5. }http_post_t;
  6. char *g_onenet_http_pro_api_key = "SlxhH3MCLvuuvXJ0N=a14Yo6EAQ=";
  7. char *g_onenet_http_dev_id = "505619290";
  8. /* 数据流 */
  9. int data_point = 18;
  10. char *data_stream_name = "temperature";
  11. /**************************************************************
  12. 函数名称 : onenet_http_post_data_stream
  13. 函数功能 : post OneNET平台
  14. 输入参数 : 无
  15. 返回值 : HTTP_POST_OK:发送POST成功,
  16. HTTP_POST_ERROR:发送POST失败
  17. 备注 : 无
  18. **************************************************************/
  19. http_post_t onenet_http_post_data_stream(char *dev_id, char *api_key)
  20. {
  21. char post_buf[ONENET_HTTP_POST_MAX_LEN];
  22. char post_content[ONENET_HTTP_POST_CONTENT_MAX_LEN];
  23. char post_content_len[4];
  24. memset(post_content, 0, sizeof(post_content));
  25. memset(post_buf, 0, sizeof(post_buf));
  26. sprintf(post_content,"{\"datastreams\":[{\"id\":\"%s\",\"datapoints\":[{\"value\":%d}]}]}",data_stream_name, data_point);
  27. sprintf(post_content_len,"%d",strlen(post_content));
  28. strcat(post_buf, "POST /devices/");
  29. strcat(post_buf, dev_id);
  30. strcat(post_buf, "/datapoints HTTP/1.1\r\n");
  31. strcat(post_buf, "api-key:");
  32. strcat(post_buf, api_key);
  33. strcat(post_buf, "\r\n");
  34. strcat(post_buf, "Host:api.heclouds.com\r\n");
  35. strcat(post_buf, "Content-Length:");
  36. strcat(post_buf, post_content_len);
  37. strcat(post_buf, "\r\n\r\n");
  38. strcat(post_buf, post_content);
  39. strcat(post_buf, "\r\n\r\n");
  40. if(socket_send(g_onenet_http_socket_id, post_buf, strlen(post_buf)) > 0)
  41. {
  42. return HTTP_POST_OK;
  43. }
  44. else
  45. {
  46. return HTTP_POST_ERROR;
  47. }
  48. }
  49. /* POST数据流 */
  50. if(HTTP_POST_OK == onenet_http_post_data_stream(g_onenet_http_dev_id, g_onenet_http_pro_api_key))
  51. {
  52. ONENET_HTTP_LOG("post success");
  53. }
  54. else
  55. {
  56. ONENET_HTTP_LOG("post failed");
  57. }

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

3、获取平台下发的结果

代码如下:

  1. TaskHandle_t g_onenet_http_device_recv_pro_task_handle = NULL;
  2. /**************************************************************
  3. 函数名称 : onenet_http_device_recv_pro
  4. 函数功能 : 平台返回数据检测处理
  5. 输入参数 : data:平台返回的数据
  6. 返回值 : 无
  7. 备注 : 无
  8. **************************************************************/
  9. void onenet_http_device_recv_pro(unsigned char *dataPtr)
  10. {
  11. uart_printf("%s", dataPtr);/* 将平台下发的结果通过串口打印出来 */
  12. }
  13. #define ONENET_MQTT_RECV_MAX_SIZE 1024
  14. /**************************************************************
  15. 函数名称 : onenet_http_device_recv_pro_task
  16. 函数功能 : 接收onenet下发数据处理任务函数
  17. 输入参数 : pvParameter:任务入口参数
  18. 返回值 : 无
  19. 备注 : 无
  20. **************************************************************/
  21. void onenet_http_device_recv_pro_task(void *pvParameter)
  22. {
  23. unsigned char data_ptr[ONENET_MQTT_RECV_MAX_SIZE];
  24. memset(data_ptr, 0, sizeof(data_ptr));
  25. while(1)
  26. {
  27. if(socket_receive(g_onenet_http_socket_id, data_ptr, ONENET_MQTT_RECV_MAX_SIZE) > 0) //使用MSG_DONTWAIT会比较稳定
  28. {
  29. onenet_http_device_recv_pro(data_ptr); //集中处理
  30. memset(data_ptr, 0, sizeof(data_ptr));
  31. }
  32. vTaskDelay(1);
  33. }
  34. }
  35. /**************************************************************
  36. 函数名称 : onenet_http_device_recv_pro_task_init
  37. 函数功能 : 创建接收onenet下发数据处理任务
  38. 输入参数 : 无
  39. 返回值 : 无
  40. 备注 : 无
  41. **************************************************************/
  42. void onenet_http_device_recv_pro_task_init(void)
  43. {
  44. if(g_onenet_http_device_recv_pro_task_handle == NULL) {
  45. xTaskCreate(onenet_http_device_recv_pro_task,
  46. "onenet_http_device_recv_pro_task",
  47. 1024 * 4 / sizeof(portSTACK_TYPE),
  48. NULL,
  49. TASK_PRIORITY_NORMAL,
  50. &g_onenet_http_device_recv_pro_task_handle);
  51. ONENET_HTTP_LOG("onenet_http_device_recv_pro_task");
  52. }
  53. }

串口打印POST的结果如下:

4、GET数据流

代码如下:

  1. char *g_onenet_http_pro_api_key = "SlxhH3MCLvuuvXJ0N=a14Yo6EAQ=";
  2. char *g_onenet_http_dev_id = "505619290";
  3. char *get_data_stream_name = "test_stream";
  4. /**************************************************************
  5. 函数名称 : onenet_http_get_data_stream
  6. 函数功能 : GET OneNET平台数据流
  7. 输入参数 : 无
  8. 返回值 : HTTP_GET_OK:发送GET成功
  9. HTTP_GET_ERROR:发送GET失败
  10. 备注 : 无
  11. **************************************************************/
  12. http_get_t onenet_http_get_data_stream(char *dev_id, char *api_key)
  13. {
  14. char get_buf[ONENET_HTTP_GET_MAX_LEN];
  15. memset(get_buf, 0, sizeof(get_buf));
  16. strcat(get_buf, "GET http://api.heclouds.com/devices/");
  17. strcat(get_buf, dev_id);
  18. strcat(get_buf, "/datapoints?datastream_id=");
  19. strcat(get_buf, get_data_stream_name);
  20. strcat(get_buf, " HTTP/1.1\r\n");
  21. strcat(get_buf, "api-key:");
  22. strcat(get_buf, api_key);
  23. strcat(get_buf, "\r\n");
  24. strcat(get_buf, "Host:api.heclouds.com\r\n");
  25. strcat(get_buf, "\r\n\r\n");
  26. if(socket_send(g_onenet_http_socket_id, get_buf, strlen(get_buf)) > 0)
  27. {
  28. return HTTP_GET_OK;
  29. }
  30. else
  31. {
  32. return HTTP_GET_ERROR;
  33. }
  34. }
  35. /* GET数据流 */
  36. if(HTTP_GET_OK == onenet_http_get_data_stream(g_onenet_http_dev_id, g_onenet_http_pro_api_key))
  37. {
  38. ONENET_HTTP_LOG("get success");
  39. }
  40. else
  41. {
  42. ONENET_HTTP_LOG("get failed");
  43. }

串口打印GET的结果如下:

转自https://blog.csdn.net/Sanjay_Wu/article/details/84870419
文章来源: https://blog.csdn.net/leo_navy/article/details/96850661
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!