mmuyu 发表于 2023-10-9 00:45:47

esp8266 non-os sdk 通过openapi获取设备数据

    在某些环境,可能需要使用8266作为数据透传,获取其他设备数据或者使用设备数据进行联动,为此,我们可以使用机智云的openapi提供的获取设备数据接口,通过http请求得到设备数据。

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

#define API_URL "http://api.gizwits.com/app/devices/did"
#define API_HOST "api.gizwits.com"
#define API_APP_ID "id"
#define API_USER_TOKEN "token"

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

void ICACHE_FLASH_ATTR send_api_request(void *arg) {
    struct espconn conn;
    espconn_create(&conn);

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

    // 配置连接选项
    conn.type = ESPCONN_TCP;
    conn.proto.tcp->local_port = espconn_port();
    conn.proto.tcp->local_ip = 0;
    conn.proto.tcp->local_ip = 0;
    conn.proto.tcp->local_ip = 0;
    conn.proto.tcp->local_ip = 0;

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

    // 构建HTTP请求头
    char requestHeader;
    os_sprintf(requestHeader, "GET %s HTTP/1.1\r\n"
                              "Host: %s\r\n"
                              "User-Agent: ESP8266\r\n"
                              "Connection: close\r\n"
                              "X-Gizwits-Application-Id: %s\r\n"
                              "X-Gizwits-User-token: %s\r\n"
                              "\r\n",
               API_URL, API_HOST, API_APP_ID, API_USER_TOKEN);

    // 发送HTTP请求头
    espconn_send(&conn, (uint8_t *)requestHeader, os_strlen(requestHeader));
}

编写数据接收回调代码:

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

    // 关闭连接
    struct espconn *conn = (struct espconn *)arg;
    espconn_disconnect(conn);
    espconn_delete(conn);
}

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

os_timer_t request_timer;
os_timer_disarm(&request_timer);
    os_timer_setfn(&request_timer, (os_timer_func_t *)send_api_request, NULL);
    os_timer_arm(&request_timer, 10000, 1);


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



可以看见,成功返回了数据
页: [1]
查看完整版本: esp8266 non-os sdk 通过openapi获取设备数据