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: 公平锁与非公平锁 可重入锁的应用场景&…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...