ESP32使用TCP HTTP访问API接口JSON解析获取数据

news2024/11/14 15:27:09

ESP32使用TCP HTTP访问API接口JSON解析获取数据

  • API接口
  • 代码解析
  • 获取时间
  • 代码烧录效果
    • 总结

API接口

       单片机常用的API接口基本都是返回的一串JSON格式的数据,这里以ESP32联网获取时间信息作为获取API数据的示例,以便后续移植使用。
       很多功能性的API接口都可以直接百度找到,这里也是直接搜索 时间API接口 找到不少接口有下面几个

淘宝时间服务器时间接口:
http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp
返回json数据格式:
{"api":"mtop.common.getTimestamp","v":"*","ret":["SUCCESS::接口调用成功"],"data":{"t":"1586519130440"}}

苏宁时间服务器接口api:
http://quan.suning.com/getSysTime.do
返回json数据格式:
{"sysTime2":"2020-04-10 19:46:50","sysTime1":"20200410194650"}

腾讯获取当前时间API:
http://vv.video.qq.com/checktime?otype=json
返回数据格式:
QZOutputJson={"s":"o","t":1678083300,"ip":"xxx.xxx.xxx.xxx","pos":"---","rand":"B2Pg8mOVaTTJAA94YMiZzA=="};

       测试下来这里比较推荐使用 淘宝的时间接口 ,相对来说稳定一些,缺点是获取的是UTC时间的毫秒数需要进行计算得到具体时间。

       需要代码可以在下方留言邮箱。

代码解析

       下面是初始化以及主函数的主要功能代码

       需要代码可以在下方留言或者私信邮箱,不要只留需要代码哦,没地方发。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);  //启动串口通信,波特率为115200
  WifiConfiguration();
}

void loop() {
  // put your main code here, to run repeatedly:
  int Circle;
  AgainStart:if(WiFi.status() == WL_CONNECTED)   //如果wifi连接成功才执行一下操作
  {
    /*HTTP请求API函数并返回值给JSON函数进行解析,JSON函数取出来的需要的信息返回到 变量 JsonInformation 中*/
    ApiInformation = HTTPRequestApi();
    JsonInformation = ApiJSONAnalysis(ApiInformation);
    Circle = 3;
    while(JsonInformation=="null" && Circle--)   //如果JsonInformation返回值为null那么循环3次请求时间的操作
    {
      ApiInformation = HTTPRequestApi();
      JsonInformation = ApiJSONAnalysis(ApiInformation);
      if(JsonInformation=="null" && Circle==0) goto AgainStart;
    }
    Serial.print("\r\nApi Information:\r\n");
    Serial.print(ApiInformation);
    Serial.print("\r\nJson Information:\r\n");
    Serial.print(JsonInformation);
  }
  else
  {
    Serial.print("\r\nwifi Reconnect...");
    WifiConfiguration();
  }
  
  delay(10000);
  //delay(10000);
}

头部宏定义

/*存储多个WiFi的连接信息*/
String WifiSSID="YXDZ";   //定义wifi名称
String WifiPassword="YXDZ1234";   //定义wifi密码

/*定义获取北京时间需要访问的IP地址、端口以及网址子页或参数*/
const char* ApiHost = "api.m.taobao.com";
uint16_t ApiPort=80;
const char* GetSysApi = "/rest/api3.do?api=mtop.common.getTimestamp";

/*存放最终API接口获取数据以及JSON解析转换后的信息*/
String ApiInformation = "";
String JsonInformation = "";


void WifiConfiguration(void);   //wifi初始化并连接
String HTTPRequestApi(void);  //请求API
String ApiJSONAnalysis(String JsonData);  //Api Json解析函数

       定义的参数比较简单,用户如果需要访问其他的API接口,只需要修改 wifi的名称与密码API接口的地址端口以及子页地址

       如果刚好也是需要获取时间的话那么只需要将 wifi的名称与密码 修改为自己使用的即可

       如果你需要的是访问其他的API或者网页,那么可以参考下面的示例进行修改,当然JSON解析的函数肯定是无效的了,由于参数不同后面JSON解析的函数需要另外编写并修改。

       如下所示,如果我们需要访问其他的网页,例如:http://www.jxl.wiki:8082/test.txt (自己临时做的测试网页,不一定能一直访问),将宏定义中的参数修改为如下所示,即可变更为访问上面的网页了

/*定义获取北京时间需要访问的IP地址、端口以及网址子页或参数*/
const char* ApiHost = "www.jxl.wiki";
uint16_t ApiPort=8082;
const char* GetSysApi = "/test.txt";

网页显示结果如下所示,简单显示一个 Hello World!...
在这里插入图片描述
       ESP32获取网页打印信息如下
在这里插入图片描述

获取时间

       需要代码可以在下方留言或者私信邮箱,不要只留需要代码哦,没地方发。

       由于时间是计算的从1970年1月1日到现在的毫秒数,不能直观的展示给人看,因此示例代码中 String ApiJSONAnalysis(String JsonData); 这个函数中不仅做了json数据的解析,另外还对时间做了处理,可以看成以下两个部分

String ApiJSONAnalysis(String JsonData)  //Api Json解析函数
{
  /*从JSON数据中提取时间数据,但是是JSON格式的,需要转换成data time格式的,JSON格式时间是从1970年到现在的时间毫秒数*/
  String JSONTime,JsonAnalysisInformation;
  unsigned int Year,Month,Day,Hour,Minute,Second,MonthSecond,DaySecond,JSONTime_1_6,JSONTime_7_13;  //Month存储第几月的时间,MonthSecond存储当年度过所有月的秒数,其他类似
  bool LeapYearFlag = 0;   //闰年标志位,0为平年,1位闰年,默认参数为0
  
  const size_t capacity = JSON_OBJECT_SIZE(4) + JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 130;
  DynamicJsonDocument JsonDataObject(capacity);
  deserializeJson(JsonDataObject,JsonData);
  JsonAnalysisInformation = JsonDataObject["data"]["t"].as<String>();
  

  /*由于是获取的时间才有下面这部分,如果是其他的API接口可以不需要,直接返回获取到的JsonAnalysisInformation就可以*/
  JSONTime = JsonAnalysisInformation;
  /*
    unsigned int型无法存取这么大的数字,将string型拆分之后再转换为unsigned int型
    substring(N,M) 函数可以将第N个开始到第M个的字符串截取出来,之后再用toInt()转换成整形
  */
  JSONTime_1_6 = (JSONTime.substring(0,6)).toInt()*10000;  //从第1个数到第6个截取出来,第一个数的标号是0,最后一个不截取,并转化为unsigned int型数据,顺便*10000,以便节约后续计算资源
  JSONTime_7_13 = (JSONTime.substring(6,13)).toInt()/1000;   //从第7个数到第13个截取出来,第一个数的标号是0,最后一个不截取,并转化为unsigned int型数据,顺便/1000把单位转换成秒,以便节约后续计算资源
 ...
 ...
 ...

       其中只有下面这部分的代码是用来做json数据解析的,只需要把定义的变量JsonAnalysisInformation加上即可,其余的如果不需要可以全部删掉

  const size_t capacity = JSON_OBJECT_SIZE(4) + JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 130;
  DynamicJsonDocument JsonDataObject(capacity);
  deserializeJson(JsonDataObject,JsonData);
  JsonAnalysisInformation = JsonDataObject["data"]["t"].as<String>();

代码烧录效果

       这里使用的是一块C3的板子,ESP32、S2、C3都有过测试代码完全可以通用

请添加图片描述

总结

       代码主要针对API接口的访问,JSON函数以及时间转换等功能可以参照进行修改,时间转换部分的代码过于臃肿,勿喷,勿喷。实在是一下没想到有什么好的办法只好硬着头皮去做转换了,功能看起来没什么问题索性就这样了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UML-活动图以及PlantUML绘制

介绍 活动图&#xff08;英语&#xff1a;activity diagram&#xff09;是工作流的图形化表示。活动图主要由活动和动作构成&#xff0c;也可以支持分支选择、迭代、并行。在 UML 中&#xff0c;活动图主要用于为计算性和组织性过程&#xff08;即工作流&#xff09;建模&…

PaddlePaddle本地环境安装(windows11系统)

写在前面: 这里是关于win11安装PaddlePaddle的步骤和方法,建议参考官方的方法。截止2023年3月份,PaddlePaddle的版本是2.4.2。 官方参考:飞桨PaddlePaddle快速安装使用方法 建议使用Anaconda安装 ,关于Anaconda创建环境的可以借鉴:深度学习Anaconda环境搭建(比较全面)…

Exposure X7胶片滤镜调色插件免费版下载

ps是我们为图片进行调色的一种必要手法&#xff0c;我们可以通过添加滤镜、使用曲线、调整色相、饱和度等ps手法来对图片加以修饰。下面这篇文章就来为大家介绍一下ps调色方法主要有&#xff0c;ps调色插件怎么用的相关知识。 Exposure X7是一款特别好用的胶片滤镜模拟软件&am…

ESP32设备驱动-MicroSD Card驱动

MicroSD Card驱动 1、SDCard介绍 SD卡是Secure Digital Card卡的简称,直译成汉语就是“安全数字卡”,是由日本松下公司、东芝公司和美国SANDISK公司共同开发研制的全新的存储卡产品。SD存储卡是一个完全开放的标准(系统),多用于MP3、数码摄像机、数码相机、电子图书、AV器…

代码看不懂?ChatGPT 帮你解释,详细到爆!

偷个懒&#xff0c;用ChatGPT 帮我写段生物信息代码如果 ChatGPT 给出的的代码不太完善&#xff0c;如何请他一步步改好&#xff1f;网上看到一段代码&#xff0c;不知道是什么含义&#xff1f;输入 ChatGPT 帮我们解释下。生信宝典 1: 下面是一段 Linux 代码&#xff0c;请帮…

开学季平价好用电容笔有哪些?ipadpro触控笔推荐

众所周知&#xff0c;苹果原装的Pencil的售价由于比较高&#xff0c;所以很多用户都无法入手。那么&#xff0c;市场上会不会有一款价格上只有苹果Pencil五分之一左右、但功能几乎相同的电容笔&#xff1f;事实上&#xff0c;确实存在。国内的平替电容笔&#xff0c;不管是压感…

二点回调测买 源码

如图所示&#xff0c;两点回调测买点的效果图&#xff0c;这是我们常见的一种预测买点计算方法。 现将源码公布如下&#xff1a; DRAWKLINE(H,O,L,C); N:13; A1:REF(HIGH,N)HHV(HIGH,2*N1); B1:FILTER(A1,N); C1:BACKSET(B1,N1); D1:FILTER(C1,N); A2:REF(LOW,N)LLV(LOW,2*N1…

正交采样

文章目录【 1、欧拉公式的频谱 】【 2、模拟正交采样 】【 3、数字正交采样 】【 1、欧拉公式的频谱 】 对于余弦信号 cos(2πf0t)12ej2πf0t12e−j2πf0tcos(2\pi f_0 t)\frac{1}{2}e^{j2\pi f_0 t}\frac{1}{2}e^{-j2\pi f_0 t}cos(2πf0​t)21​ej2πf0​t21​e−j2πf0​t&a…

Shell基础 (一)

目录 一、关于shell 1、什么是shell&#xff1f; 2、shell入门 二、shell进阶&#xff08;重点&#xff09; 1、变量 2、条件判读语句 3、运算符 一、关于shell 1、什么是shell&#xff1f; Shell&#xff08;外壳&#xff09;是一个用C语言编写的程序&#xff0c;它是用…

《程序员面试金典(第6版)》面试题 02.08. 环路检测

题目描述 给定一个链表&#xff0c;如果它是有环链表&#xff0c;实现一个算法返回环路的开头节点。若环不存在&#xff0c;请返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xf…

如果想了解营销的最高境界,请看如何开创新品类?

如果想了解营销的最高境界&#xff0c;请看 如何开创新品类&#xff1f; 中国奶粉第一品牌飞鹤奶粉&#xff5e; 品牌策划人王博总结的方法 趣讲大白话&#xff1a;看看高手怎么想 【安志强趣讲信息科技95期】 ******************************* 不懂品牌营销的程序员不是好厨师…

第一次使用Python for Qt中的问题

在创建带有form的python for qt的时候&#xff0c;使用的库是pySide6&#xff0c;而不是pyqt。 因此&#xff0c;需要安装pyside6。 Running "/usr/bin/python3 -m pip install PySide6 --user" to install PySide6. ERROR: Could not find a version that satisfi…

hivesql实现不同的求和需求【分组求和、帕累托累计求和、滑动求和】

hivesql求和&#xff0c;分组求和&#xff0c;帕累托累计求和&#xff0c;滑动求和 实现功能如下示例&#xff1a; 列s1&#xff1a;分组求和&#xff0c;这里以sku_id分组求和&#xff0c;E5单元格对应sku_ida01时的C列求和&#xff1b; 列s2&#xff1a;帕累托求和&#x…

X264简介-Android使用(一)

X264 简介及使用 1、简介 2、环境搭建 3、使用 4、小结 简介 官网连接&#xff1a;https://www.videolan.org/developers/x264.html 官方文档&#xff1a;https://wiki.videolan.org/Category:X264/ x264是用于编码H.264/MPEG-4 AVC视频流的免费软件库。它世界上最流行的…

每天一个linux命令:性能监控和优化命令之top

top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止…

将fluentMeshing网格转换为openFoam网格

简介 fluentMeshing是一个绘制源生多面体网格的强大工具&#xff0c;其生成的网格可以进一步导出&#xff0c;转换为OpenFoam格式&#xff0c;供OpenFoam计算。 本文将介绍如何把fluentMeshing网格转换为openFoam网格&#xff0c;以及其注意事项 步骤 &#xff08;1&#x…

【QML】锚布局

文章目录1、锚&#xff08;Anchors&#xff09;2、一些示例Qt Quick中有两套与布局管理相关的类库&#xff0c;一种是Item Positioner&#xff08;定位器&#xff09;&#xff0c;一种是Item Layout&#xff08;布局&#xff09; 定位器&#xff1a;Row&#xff08;行定位器&am…

【NLP经典论文阅读】Efficient Estimation of Word Representations in Vector Space(附代码)

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

UE4 c++ Mediaplayer取消自动播放,运行时首帧为黑屏的问题

0&#xff0c;前言 工作需要使用C制作一个ue4的视频插件&#xff0c;其中一个功能是能够选择 运行时是否自动播放 视频的功能。 在实现时遇见了一个问题&#xff0c;取消自动播放之后&#xff0c;运行时首帧是没有取到的&#xff0c;在场景里面看是黑色的。就这个问题我想到了使…

Kubernetes k8s 笔记

核心功能 容器编排和管理&#xff1a;Kubernetes可以自动化容器的部署、管理和扩展&#xff0c;使得应用程序可以在多个容器之间进行平滑的切换。自动化负载均衡&#xff1a;Kubernetes可以通过将请求分配到不同的容器来平衡负载&#xff0c;以确保应用程序的高可用性和性能。…