收藏官网首页
查看: 1285|回复: 0

[经验分享] esp8266 non-os sdk 通过openapi获取设备数据

106

主题

107

帖子

7261

积分

论坛元老

Rank: 8Rank: 8

积分
7261
跳转到指定楼层
楼主
 楼主| 发表于 2023-10-9 00:45:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
免费使用STM32、APP自动代码生成工具
    在某些环境,可能需要使用8266作为数据透传,获取其他设备数据或者使用设备数据进行联动,为此,我们可以使用机智云的openapi提供的获取设备数据接口,通过http请求得到设备数据。

首先,我们定义设备的请求接口,appid和token

  1. #define API_URL "http://api.gizwits.com/app/devices/did"
  2. #define API_HOST "api.gizwits.com"
  3. #define API_APP_ID "id"
  4. #define API_USER_TOKEN "token"
复制代码


接下来,我们实现http请求代码:

  1. void ICACHE_FLASH_ATTR send_api_request(void *arg) {
  2.     struct espconn conn;
  3.     espconn_create(&conn);

  4.     // 设置服务器地址和端口
  5.     ip_addr_t ip;
  6.     espconn_gethostbyname(&conn, API_HOST, &ip, http_request_callback);
  7.     os_memcpy(conn.proto.tcp->remote_ip, &ip, sizeof(ip));
  8.     conn.proto.tcp->remote_port = 80;  // HTTP默认端口

  9.     // 配置连接选项
  10.     conn.type = ESPCONN_TCP;
  11.     conn.proto.tcp->local_port = espconn_port();
  12.     conn.proto.tcp->local_ip[0] = 0;
  13.     conn.proto.tcp->local_ip[1] = 0;
  14.     conn.proto.tcp->local_ip[2] = 0;
  15.     conn.proto.tcp->local_ip[3] = 0;

  16.     // 连接HTTP服务器
  17.     espconn_connect(&conn);

  18.     // 构建HTTP请求头
  19.     char requestHeader[512];
  20.     os_sprintf(requestHeader, "GET %s HTTP/1.1\r\n"
  21.                               "Host: %s\r\n"
  22.                               "User-Agent: esp8266\r\n"
  23.                               "Connection: close\r\n"
  24.                               "X-Gizwits-Application-Id: %s\r\n"
  25.                               "X-Gizwits-User-token: %s\r\n"
  26.                               "\r\n",
  27.                API_URL, API_HOST, API_APP_ID, API_USER_TOKEN);

  28.     // 发送HTTP请求头
  29.     espconn_send(&conn, (uint8_t *)requestHeader, os_strlen(requestHeader));
  30. }
复制代码


编写数据接收回调代码:

  1. static void ICACHE_FLASH_ATTR http_request_callback(void *arg, char *data, unsigned short len) {
  2.     // 处理响应
  3.     if (data != NULL && len > 0) {
  4.         os_printf("Received data: %s\n", data);
  5.     } else {
  6.         os_printf("No data received or an error occurred.\n");
  7.     }

  8.     // 关闭连接
  9.     struct espconn *conn = (struct espconn *)arg;
  10.     espconn_disconnect(conn);
  11.     espconn_delete(conn);
  12. }
复制代码


接下来,我们使用一个10秒的定时器定时获取,当然只是作为演示,实际使用可以使用事件响应代替。

  1. os_timer_t request_timer;
  2. os_timer_disarm(&request_timer);
  3.     os_timer_setfn(&request_timer, (os_timer_func_t *)send_api_request, NULL);
  4.     os_timer_arm(&request_timer, 10000, 1);
复制代码



编译烧录,看一下请求得到的数据:



可以看见,成功返回了数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表