首页 » 智能 » ESP8266获取气候预告信息并运用CJSON解析气候预告数据_对象_合肥

ESP8266获取气候预告信息并运用CJSON解析气候预告数据_对象_合肥

雨夜梧桐 2024-11-28 23:56:42 0

扫一扫用手机浏览

文章目录 [+]

心知景象是一家专业的气候数据做事供应商,致力于为环球用户供应高质量、定制化的气候数据做事。
其紧张产品包括景象API、空气质量API、磨难预警API等。
用户可以通过心知景象的API接口,获取准确、实时的景象数据,从而为各种运用处景供应支持,例如智能家居、出行、电商等。
心知景象的数据覆盖环球200多个国家和地区,逐日处理超过10亿次API要求,是业内领先的气候数据做事供应商之一。

二、硬件准备1. ESP8266模块

ESP8266是一款WiFi模块,它具有强大的网络连接功能,可以轻松地连接到互联网。
将利用ESP8266模块来获取景象数据,并将其发送给STM32掌握器。
详细来说,我们将利用正点原子ATK-ESP8266模块,这是一款集成ESP8266芯片的小板子。

ESP8266获取气候预告信息并运用CJSON解析气候预告数据_对象_合肥 智能

2. STM32微掌握器

STM32是一款强大的32位微掌握器,具有多种接口和功能。
将利用STM32F103C8T6掌握器,这是一款非常盛行的型号,易于得到且价格较为合理。

3. OLED显示屏

OLED是一种非常盛行的显示技能,具有高比拟度、低功耗、快速相应等优点。
将利用0.96英寸128x64像素的OLED显示屏。

三、CJSON解析景象预报数据3.1 接口返回的数据

{ "results": [ { "location": { "id": "WTEMH46Z5N09", "name": "合肥", "country": "CN", "path": "合肥,合肥,安徽,中国", "timezone": "Asia/Shanghai", "timezone_offset": "+08:00" }, "now": { "text": "阴", "code": "9", "temperature": "12", "feels_like": "18", "pressure": "1000", "humidity": "89", "visibility": "12.0", "wind_direction": "西南", "wind_direction_degree": "245", "wind_speed": "19.0", "wind_scale": "3", "clouds": "85", "dew_point": "" }, "last_update": "2023-04-04T14:20:13+08:00" } ]}3.2 CJSON是什么

CJSON是一款轻量级的C措辞JSON解析器,其全称是“cJSON”,由Dave Gamble编写。
它大略易用,可嵌入到C运用程序中,既支持JSON字符串的解析,也支持JSON工具的创建及操作。
CJSON不依赖于任何其他的库或组件,利用它只须要引入其头文件即可。

CJSON的利用办法相对来说比较大略,须要进行以下几个步骤:

1. 在运用程序中包含cJSON的头文件:#include "cJSON.h"。
2. 调用cJSON_Parse函数,将JSON字符串转换为CJSON工具。
3. 利用cJSON供应的API函数对CJSON工具进行操作,包括读取、修正、删除、添加等。
4. 在程序结束时,记得开释cJSON工具的内存空间,避免内存泄露。

CJSON的解析速率相对较快,占用的内存开销也比较小,因此非常适用于资源有限的嵌入式系统中利用。

3.3 解析数据

利用CJSON解析上述JSON数据非常大略,只须要按照以下步骤操作:

引入CJSON库文件

#include <cJSON.h>解析JSON数据并创建cJSON工具

char json_data = "{\"results\":[{\"location\":{\"id\":\"WTEMH46Z5N09\",\"name\":\"合肥\",\"country\":\"CN\",\"path\":\"合肥,合肥,安徽,中国\",\"timezone\":\"Asia/Shanghai\",\"timezone_offset\":\"+08:00\"},\"now\":{\"text\":\"阴\",\"code\":\"9\",\"temperature\":\"12\",\"feels_like\":\"18\",\"pressure\":\"1000\",\"humidity\":\"89\",\"visibility\":\"12.0\",\"wind_direction\":\"西南\",\"wind_direction_degree\":\"245\",\"wind_speed\":\"19.0\",\"wind_scale\":\"3\",\"clouds\":\"85\",\"dew_point\":\"\"},\"last_update\":\"2023-04-04T14:20:13+08:00\"}]}";cJSON root = cJSON_Parse(json_data);

在这个代码片段中,首先定义了一个字符串类型的变量json_data,用于存储上述JSON数据。
然后,调用cJSON_Parse()函数来解析JSON数据,并将解析结果保存在root指针所指向的cJSON工具中。

从cJSON工具中提取数据

cJSON location = cJSON_GetObjectItem(root, "location");char city = cJSON_GetObjectItem(location, "name")->valuestring;cJSON now = cJSON_GetObjectItem(root, "now");int temperature = cJSON_GetObjectItem(now, "temperature")->valueint;char text = cJSON_GetObjectItem(now, "text")->valuestring;

在这个代码片段中,利用cJSON_GetObjectItem()函数从root指针所指向的cJSON工具中提取一个名为location的JSON工具,并从该JSON工具中获取名为name的字符串类型变量。
类似地,也可以从root指针所指向的cJSON工具中提取名为now的JSON工具,并从该JSON工具中获取名为temperature和text的整型和字符串类型变量。

开释cJSON工具

cJSON_Delete(root);

末了,须要开释之前创建的cJSON工具,以开释内存空间。

完全的代码示例如下:

#include <cJSON.h>#include <stdio.h>int main() { char json_data = "{\"results\":[{\"location\":{\"id\":\"WTEMH46Z5N09\",\"name\":\"合肥\",\"country\":\"CN\",\"path\":\"合肥,合肥,安徽,中国\",\"timezone\":\"Asia/Shanghai\",\"timezone_offset\":\"+08:00\"},\"now\":{\"text\":\"阴\",\"code\":\"9\",\"temperature\":\"12\",\"feels_like\":\"18\",\"pressure\":\"1000\",\"humidity\":\"89\",\"visibility\":\"12.0\",\"wind_direction\":\"西南\",\"wind_direction_degree\":\"245\",\"wind_speed\":\"19.0\",\"wind_scale\":\"3\",\"clouds\":\"85\",\"dew_point\":\"\"},\"last_update\":\"2023-04-04T14:20:13+08:00\"}]}"; cJSON root = cJSON_Parse(json_data); cJSON location = cJSON_GetObjectItem(root, "location"); char city = cJSON_GetObjectItem(location, "name")->valuestring; cJSON now = cJSON_GetObjectItem(root, "now"); int temperature = cJSON_GetObjectItem(now, "temperature")->valueint; char text = cJSON_GetObjectItem(now, "text")->valuestring; printf("City: %s\n", city); printf("Temperature: %d\n", temperature); printf("Weather: %s\n", text); cJSON_Delete(root); return 0;}

在这个代码示例中,利用了cJSON_Parse()、cJSON_GetObjectItem()、cJSON_Delete()等函数来解析和处理JSON数据。

3.4 获取数据

下面是ESP8266访问HTTP接口要求的代码:

#include <SoftwareSerial.h>// 定义ESP8266串口工具SoftwareSerial esp8266(PA10, PA9); // RX, TXvoid setup() { Serial.begin(9600); // 初始化ESP8266串口通信波特率为9600 esp8266.begin(9600); // 发送AT指令测试ESP8266是否正常事情 esp8266.println("AT"); delay(500); if (esp8266.find("OK")) { Serial.println("ESP8266 is working properly."); } else { Serial.println("ESP8266 is not working properly."); }}void loop() { // 向ESP8266发送HTTP要求 esp8266.println("AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80"); if (esp8266.find("OK")) { Serial.println("TCP connection established."); } else { Serial.println("TCP connection failed."); } String url = "/v3/weather/now.json?key=your_API_KEY&location=your_LOCATION"; String request = "GET " + url + " HTTP/1.1\r\n" + "Host: api.seniverse.com\r\n" + "User-Agent: STM32/1.0\r\n" + "Connection: close\r\n\r\n"; int length = request.length(); String cmd = "AT+CIPSEND=" + String(length); esp8266.println(cmd); if (esp8266.find(">")) { Serial.println("Sending HTTP request..."); esp8266.print(request); } else { Serial.println("Failed to send HTTP request."); } // 吸收HTTP相应 while (esp8266.available()) { String response = esp8266.readStringUntil('\n'); Serial.println(response); } // 关闭TCP连接 esp8266.println("AT+CIPCLOSE"); delay(1000);}

在这个示例代码中,初始化了ESP8266串口工具,并通过发送AT指令测试ESP8266是否正常事情。
然后,在loop()函数中,向ESP8266发送一个HTTP要求,包括要求头和要求体。
发送完毕后,等待ESP8266返回HTTP相应并将其打印出来。
末了,关闭TCP连接并等待一秒钟,然后重复上述步骤。

标签:

相关文章