ESP32/ESP8266通过HTTP使用Arduino_JSON获取并解析json数据

ESP32/ESP8266通过HTTP使用Arduino_JSON获取并解析json数据


  • ✨本示例所调用的为yytianqi API数据接口.
  • 📌相关API数据接口::http://www.yytianqi.com/api.html
    在这里插入图片描述
🏁请求方式:HTTP GET
  • 🌿城市ID请求地址: http://api.yytianqi.com/aqi?city=CH010100&key=pb7276fgpr5bki02
  • 🌿城市IP请求地址: http://api.yytianqi.com/aqi?city=123.113.202.176&key=pb7276fgpr5bki02
  • 🌿城市经纬度请求地址: http://api.yytianqi.com/aqi?city=39.93,116.40&key=pb7276fgpr5bki02

🛠所需库

  • 🔖Arduino_JSON是基于cJSON,和ArduinoJson不同,ArduinoJson是一个C++的JSON库。
  • 🔧Arduino_JSONhttps://github.com/arduino-libraries/Arduino_JSON

📝程序代码

/*
  * 所需库
  * Arduino_JSON -点击这里会自动打开管理库页面: http://librarymanager/All#Arduino_JSON
  */
#ifdef ESP32
  #include <WiFi.h>
  #include <HTTPClient.h>
#else
  #include <ESP8266WiFi.h>
  #include <WiFiClient.h>//3.0.2新增
  #include <ESP8266HTTPClient.h>
#endif

#include <Arduino_JSON.h>


//修改WIFI名称以及密码
const char* ssid = "######";//WIFI名称
const char* password = "*******";//WIFI密码
//填入你获得的API Key
String YYWeatherApiKey = "填写API Key";
// 填写你的城市代码:http://www.yytianqi.com/citys/2.html
String cityCode = "CH250303";//所在区城市代码

unsigned long lastTime = 0;
//设置每32秒获得一次天气数据(普通帐号访问频率30s/次)
unsigned long timerDelay = 32000;
String jsonBuffer;

void setup() {
  Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);//仅开启串口输出
   WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  //判断WIFI是否连接
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
   Serial.print("IP address:   ");
  Serial.println(WiFi.localIP());

}

void loop() {
//发送HTTP获取请求
  if ((millis() - lastTime) > timerDelay) {
    //检测WIFI是否已经连接
    if(WiFi.status()== WL_CONNECTED){
      //http://api.yytianqi.com/observe?city=CH010100&key=pb7276fgpr5bki02
      String serverPath = "http://api.yytianqi.com/observe?city=" + cityCode + "&key=" + YYWeatherApiKey;
      //将组合好的URL放入httpGETRequest函数中通过HTTP获取请求以获得文本
      jsonBuffer = httpGETRequest(serverPath.c_str());
      //Serial.println(jsonBuffer);
      //将解析的Json对象值储存在Jsonu缓冲区中
      JSONVar myObject = JSON.parse(jsonBuffer);
      //判断解析是否成功
      if (JSON.typeof(myObject) == "undefined") {
        Serial.println("Parsing input failed!");
        return;
      }
      Serial.print("JSON object = ");
      Serial.println(myObject);
      Serial.print("City: ");//城市
      Serial.println((const char*)myObject["data"]["cityName"]);    
      Serial.print("Temperature: "); //温度
      Serial.print((const char*)myObject["data"]["qw"]);
      Serial.println("°C");       
      Serial.print("Humidity: ");//湿度
      Serial.print((const char*)myObject["data"]["sd"]);
      Serial.println(" %");     
      Serial.print("Weather: ");//天气
      Serial.println((const char*)myObject["data"]["tq"]);     
      Serial.print("Wind: ");//风力
      Serial.println((const char*)myObject["data"]["fl"]);     
      Serial.print("Wind Direction: ");//风向
      Serial.println((const char*)myObject["data"]["fx"]);
      Serial.println("");
    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}

String httpGETRequest(const char* serverName) {
  
  WiFiClient client;
  HTTPClient http;
  String payload = "";
  //连接目标网址
  http.begin(client, serverName);
  //发送HTTP站点请求
  int httpCode = http.GET();
  if (httpCode>0) {
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
    payload = http.getString();
  }
  else {
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
  }
  
  http.end();//关闭连接
  //返回获得的数据用于Json处理
  return payload;
}
  • 📜esp8266编译信息
使用 1.0  版本的库 ESP8266WiFi 在文件夹: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.1\libraries\ESP8266WiFi 
使用 1.2  版本的库 ESP8266HTTPClient 在文件夹: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.1\libraries\ESP8266HTTPClient 
使用 0.2.0  版本的库 Arduino_JSON 在文件夹: C:\Users\Administrator\Documents\Arduino\libraries\Arduino_JSON 
  • 🔖esp32编译信息:
使用 2.0.0  版本的库 WiFi 在文件夹: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.7\libraries\WiFi 
使用 2.0.0  版本的库 HTTPClient 在文件夹: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.7\libraries\HTTPClient 
使用 2.0.0  版本的库 WiFiClientSecure 在文件夹: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.7\libraries\WiFiClientSecure 
使用 0.2.0  版本的库 Arduino_JSON 在文件夹: C:\Users\Administrator\Documents\Arduino\libraries\Arduino_JSON 
"C:\\Users\\Administrator\\AppData\\Local\\Arduino15\\packages\\esp32\\tools\\riscv32-esp-elf-gcc\\esp-2021r2-patch5-8.4.0/bin/riscv32-esp-elf-size" -A "d:\\arduino\\MyHexDir/YYweather.ino.elf"
项目使用了 746662 字节,占用了 (56%) 程序存储空间。最大为 1310720 字节。
全局变量使用了39868字节,(12%)的动态内存,余留287812字节局部变量。最大为327680字节。

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值