天气时钟-ESP8266通过wifi获取api并解析测试

Posted 凯思奥教育科技乔治老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了天气时钟-ESP8266通过wifi获取api并解析测试相关的知识,希望对你有一定的参考价值。

        由于要做一个天气时钟,天气数据肯定要通过互联网获得,其中涉及到时钟的部分也用互联网去解决省掉一个ds1302时钟模块,并可以测试 学习api获取并解析的效果。

        但是在学习过程中大量的百度搜索资料发现都是按照博主自己的情况写没有适合我的,因此将这次学习情况记录下来,经供参考。

        硬件:ESP8266-12f

        开发板:ESP8266 D1 mini

        开发环境:arduino IDE 

        基础硬件配置不做分享,百度一大把,关键词:“如何在arduino上开发esp8266”。

        软件部分:1.测试wifi拉取功能,从示例中拉取BasicHttpClient例程,

WiFiMulti.addAP("SSID", "PASSWORD"); //修改wifi账号密码
if (http.begin(client, "http://jigsaw.w3.org/HTTP/connection.html")) 
//将其中双引号部分替换成自己的api的网址
//如http://quan.suning.com/getSysTime.do,苏宁时间api

 上传后即可打开串口获得数据,一般情况会获得如下信息,

{"sysTime2":"2021-08-17 13:52:49","sysTime1":"20210817135249"}

 即代表单片机成功从网络上获取到信息。

2.解析数据

通过arduino库安装器,安装arduinoJson库(不会装的百度“如何安装arduinoJson库”),拉取例程

 

 

char json[] =
      "{\\"sensor\\":\\"gps\\",\\"time\\":1351824120,\\"data\\":[48.756080,2.302038]}";
//此为要解析的Json格式数据,

 这边有个坑,直接将api获得数据替换到里面发现编译错误,如{"sysTime2":"2021-08-17 13:52:49","sysTime1":"20210817135249"},猜测是多个双引号发生了识别错误,因此这个库函数的作者在每个”之前加了\\。

  const char* sensor = doc["sensor"];
  long time = doc["time"];
  double latitude = doc["data"][0];
  double longitude = doc["data"][1];
  //这是解析中最重要的部分,
  /*JSON格式一般为
       * {
       * "XXXXX1":"xxxxxxx1",
       * "XXXXX2":"xxxxxxx2",
       * "XXXXX3":"xxxxxxx3",
       * "XXXXX4":"xxxxxxx4",
       * }
(重要)* 解析需要xxxxxxx1数据的话,仅需const char* value = doc["XXXXX1"];
       * 变量value中就存放着xxxxxxx1
       * 
       */

 3.api信息获取程序叠加Json解析程序

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>

ESP8266WiFiMulti WiFiMulti; //ESP8266WiFiMulti 库函数实例化 可以允许简写WiFiMulti.xxx


void setup(void) {
  Serial.begin(115200);
 //wifi初始化
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP("kidscoding", "kidscoding123");
}

void loop() {
·
   if ((WiFiMulti.run() == WL_CONNECTED)) {//无线连接中...
    WiFiClient client; //初始化客户端
    HTTPClient http;  //HTTPClient库函数实例化 可以允许简写http.xxx
    
    if (http.begin(client, "http://quan.suning.com/getSysTime.do")) {  
      http.GET(); //拉取网站信息
      String payload = http.getString(); //拉取成字符串
      StaticJsonDocument<200> doc; //json格式解析设置字符串长度
      deserializeJson(doc, payload);//json格式解析设置
      const char* sysTime1 = doc["sysTime1"];
      /*JSON格式一般为
       * {
       * "XXXXX1":"xxxxxxx1",
       * "XXXXX2":"xxxxxxx2",
       * "XXXXX3":"xxxxxxx3",
       * "XXXXX4":"xxxxxxx4",
       * }
       * 解析需要xxxxxxx1数据的话,仅需const char* value = doc["XXXXX1"];
       * 变量value中就存放着xxxxxxx1
       * 
       */
      Serial.println(sysTime1);
      http.end(); 
      }
     delay(1000);
     }
}

正常上传的话就可以获取当前时间信息,不过是一串的,还需要一个个分开。

以上是关于天气时钟-ESP8266通过wifi获取api并解析测试的主要内容,如果未能解决你的问题,请参考以下文章

基于STM32的ESP8266天气时钟--------MCU获取天气数据

基于STM32与ESP8266的太空人WiFi天气时钟(代码开源)

STM32天气数据获取

基于STM32的ESP8266天气时钟---------AT指令获取天气数据

基于STM32的ESP8266天气时钟---------AT指令获取天气数据

基于STM32F的ESP8266天气时钟--------MCU获取时间及显示(完结)