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

news/2024/11/28 23:43:55/

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);  //启动串口通信,波特率为115200WifiConfiguration();
}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位闰年,默认参数为0const 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.ppmy.cn/news/30390.html

相关文章

编写http workshop脚本从网页缓存里解析音乐

前一篇文章 编写http workshop脚本从网站下载音乐 示范了如何使用HttpClient访问API,以及Json数据的解析; 今天我们通过解析一个网页展示如何使用内置的LibXml2的功能解析HTML,提取我们关心的内容。 这里随便搜了2个资源类的网站,竟然使用的格式是一模一样的: https://www…

[Linux入门篇]一篇博客解决C/C++/Linux System Call文件操作接口的使用

目录 0.前言 1.C / C ->文件操作 1.1 C语言文件操作 1.1.1 C语言文件打开/关闭/写入 1.1.2 C语言文件的追加操作 1.1.3 C语言文件的读取 1.2 C语言文件操作 1.2.1 C文件打开 / 关闭 / 写入 1.2.2 C文件读取 1.2.3 文件追加 2.三个默认输入输出流 2.1 C语言中的三…

js-DOM03-事件

事件&#xff08;Event&#xff09; - 事件对象 - 当响应函数被调用时&#xff0c;浏览器每次都会将一个事件对象作为实参传递进响应函数中&#xff0c; 这个事件对象中封装了当前事件的相关信息&#xff0c;比如&#xff1a;鼠标的坐标&#xff0c;键盘的按键…

C语言 猜名次、猜凶手、杨辉三角题目详解

猜名次题目&#xff1a;5位运动员参加了10米台跳水比赛&#xff0c;有人让他们预测比赛结果&#xff1a;A选手说&#xff1a;B第二&#xff0c;我第三&#xff1b;B选手说&#xff1a;我第二&#xff0c;E第四&#xff1b;C选手说&#xff1a;我第一&#xff0c;D第二&#xff…

C语言练习 | 初学者经典练习汇(2)

目录 1、编写一个程序从1到100中&#xff0c;所有出现9的个数 2、分数求和 3、10个整形数字中选出最大值 4、打印9*9的乘法口诀 5、字符串逆序 6、计算一个数的每位之和(递归实现) 7、递归实现n的K次方 8、写个冒泡排序&#xff0c;把一个整形数组变成升序。 9、二进制…

【JavaEE】基于mysql与servlet自制简易的表白墙程序

文章目录1 表白墙页面构建2 Servlet 回顾3 表白墙后端程序实现3.1 我们需要做什么&#xff1f;3.2 实现细节4 实现结果写在最后1 表白墙页面构建 该页面由标题、文本、三个 input 输入框与一个提交按钮构成&#xff0c;整体比较简单&#xff0c;相关样式文件和页面代码会在后面…

【Vue】Vue的简单介绍与基本使用

一、什么是VueVue是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;Vue 都可以胜任。1.构建用户界面传统方…

2022年MathorCup数学建模C题自动泊车问题解题全过程文档加程序

2022年第十二届MathorCup高校数学建模 C题 自动泊车问题 原题再现 自动泊车是自动驾驶技术中落地最多的场景之一&#xff0c;自动泊车指在停车场内实现汽车的自动泊车入位过程&#xff0c;在停车空间有限的大城市&#xff0c;是一个比较实用的功能&#xff0c;减少了驾驶员将…