ESP32使用TCP HTTP访问API接口JSON解析获取数据
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函数以及时间转换等功能可以参照进行修改,时间转换部分的代码过于臃肿,勿喷,勿喷。实在是一下没想到有什么好的办法只好硬着头皮去做转换了,功能看起来没什么问题索性就这样了。
相关文章:
ESP32使用TCP HTTP访问API接口JSON解析获取数据
ESP32使用TCP HTTP访问API接口JSON解析获取数据API接口代码解析获取时间代码烧录效果总结API接口 单片机常用的API接口基本都是返回的一串JSON格式的数据,这里以ESP32联网获取时间信息作为获取API数据的示例,以便后续移植使用。 很多功能性的API接…...
spring security 实现自定义认证和登录(4):使用token进行验证
前面我们实现了给客户端下发token,虽然客户端拿到了token,但我们还没处理客户端下一次携带token请求时如何验证,我们想要实现拿得到token之后,只需要验证token,不需要用户再携带用户名和密码了。 1. 禁用 UsernamePass…...
戴眼镜检测和识别2:Pytorch实现戴眼镜检测和识别(含戴眼镜数据集和训练代码)
Pytorch实现戴眼镜检测和识别(含戴眼镜数据集和训练代码) 目录 Pytorch实现戴眼镜检测和识别(含戴眼镜数据集和训练代码) 1.戴眼镜检测和识别方法 2.戴眼镜数据集 3.人脸检测模型 4.戴眼镜分类模型训练 (1)项目安装 (2)准…...
信息收集之Google Hacking
Google HackingGoogleHacking作为常用且方便的信息收集搜索引擎工具,它是利用谷歌搜索强大,可以搜出不想被看到的后台、泄露的信息、未授权访问,甚至还有一些网站配置密码和网站漏洞等。掌握了Google Hacking基本使用方法,或许下一…...
【面试题】如何避免使用过多的 if else?
大厂面试题分享 面试题库前后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库一、引言相信大家听说过回调地狱——回调函数层层嵌套,极大降低代码可读性。其实,if-else层层嵌套,如下图…...
oneblog_justauth_三方登录配置【Gitee】
文章目录oneblog添加第三方平台gitee中创建三方应用完善信息oneblog添加第三方平台 1.oneblog管理端,点击左侧菜单 网站管理——>社会化登录配置管理 ,添加一个社会化登录 2.编辑信息如下,选择gitee平台后复制redirectUri,然后去gitee获取clientId和…...
33- PyTorch实现分类和线性回归 (PyTorch系列) (深度学习)
知识要点 pytorch最常见的创建模型的方式, 子类 读取数据: data pd.read_csv(./dataset/credit-a.csv, headerNone) 数据转换为tensor: X torch.from_numpy(X.values).type(torch.FloatTensor) 创建简单模型: from torch import nn model nn.Sequential(nn.Linear(15, 1…...
C++基础——Ubuntu下编写C++环境配置总结(C++基本简介、Ubuntu环境配置、编写简单C++例程)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…...
项目管理中,导致进度失控的五种错误
项目管理中对工期的控制主要是进度控制,在项目进行中中,由于项目时间跨度长,人员繁杂,如果管理不规范,就容易导致项目进度滞后,如何管理好施工进度是管理者需要解决的问题之一。 1、项目计划缺乏执行力 安…...
C# 中的abstract和virtual
重新理解了下关键字abstract,做出以下总结: 1.标记为abstract的类不能实例化,但是依然可以有构造函数,也可以重载构造函数,在子类中调用 2.abstract类中可以有abstract标记的方法和属性,也可以没有,被标记…...
第六十周总结——React数据管理
React数据管理 代码仓库 React批量更新 React中的批量更新就是将多次更新合并处理,最终只渲染一次,来获得更好的性能。 React18版本之前的批量更新 // react 17 react-dom 17 react-scripts 4.0.3 import * as ReactDOM from "react-dom"…...
Springboot之@Async异步指定自定义线程池使用
开发中会碰到一些耗时较长或者不需要立即得到执行结果的逻辑,比如消息推送、商品同步等都可以使用异步方法,这时我们可以用到Async。但是直接使用 Async 会有风险,当我们没有指定线程池时,他会默认使用其Spring自带的 SimpleAsync…...
视频知识点(23)- TS格式详解指南
*《音视频开发》系列-总览*(点我) 一、格式简介 TS视频封装格式,是一种被广泛应用的多媒体文件格式。它的全称是MPEG2-TS,其中TS是“Transport Stream”的缩写。TS(Transport Stream)流是一种传输流,它由固定长度(188 字节)的 TS 包组成,TS 包是对PES包的一种封装方式…...
linux篇【16】:传输层协议<后序>
目录 六.滑动窗口 (1)发送缓冲区结构 (2)滑动窗口介绍 (3)滑动窗口不一定只会向右移动。滑动窗口可以变大也可以变小。 (4)那么如果出现了丢包, 如何进行重传? 这里分两种情况…...
【C语言】动态内存管理
一.为什么存在动态内存分配? 我们已经掌握的内存开辟方式有:int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的方式有两个特点: 1. 空间开辟大小是固定的。 2. 数组在申明的…...
【Pytorch】AutoGrad个人理解
前提知识:[Pytorch] 前向传播和反向传播示例_友人小A的博客-CSDN博客 目录 简介 叶子节点 Tensor AutoGrad Functions 简介 torch.autograd是PyTorch的自动微分引擎(自动求导),为神经网络训练提供动力。torch.autograd需要对…...
华硕z790让独显和集显同时工作
系统用了一段时间,现在想让显卡主要做深度学习训练,集显用来连接显示器。却发现显示器接到集显接口无信号。 打售后客服也没有解决,现在把解决方案记录一下。 这是客服给的方案: 请开机后进BIOS---Advanced---System Agent (SA)…...
提高编程思维的python代码
1.通过函数取差。举例:返回有差别的列表元素 from math import floordef difference_by(a,b,fn):b set(map(fn, b))return [i for i in a if fn(i) not in b] print(difference_by([2.1, 1.2], [2.3, 3.4], floor))2.一行代码调用多个函数 def add(a, b):return …...
CSS背景background属性整理
1.background-color background-color属性:设置元素的背景颜色 2.background-position background-position属性:设置背景图像的起始位置,需要把 background-attachment 属性设置为 "fixed",才能保证该属性在 Firefo…...
AQS底层源码深度剖析-Lock锁
目录 AQS底层源码深度剖析-Lock锁 ReentrantLock底层原理 为什么把获取锁失败的线程加入到阻塞队列中,而不是采取其它方法? 总结:三大核心原理 CAS是啥? 代码模拟一个CAS: 公平锁与非公平锁 可重入锁的应用场景&…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
