|
在某些环境,可能需要使用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] = 0;
- conn.proto.tcp->local_ip[1] = 0;
- conn.proto.tcp->local_ip[2] = 0;
- conn.proto.tcp->local_ip[3] = 0;
- // 连接HTTP服务器
- espconn_connect(&conn);
- // 构建HTTP请求头
- char requestHeader[512];
- 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);
复制代码
编译烧录,看一下请求得到的数据:
可以看见,成功返回了数据 |
|