ESP32使用TCP HTTP访问API接口JSON解析获取数据
API接口
单片机常用的API接口
基本都是返回的一串JSON格式
的数据,这里以ESP32
联网获取时间信息
作为获取API数据的示例,以便后续移植使用。
很多功能性的API接口
都可以直接百度找到,这里也是直接搜索 时间API接口
找到不少接口有下面几个
淘宝时间服务器时间接口:
http:
返回json数据格式:
{"api":"mtop.common.getTimestamp","v":"*","ret":["SUCCESS::接口调用成功"],"data":{"t":"1586519130440"}}
苏宁时间服务器接口api:
http:
返回json数据格式:
{"sysTime2":"2020-04-10 19:46:50","sysTime1":"20200410194650"}
腾讯获取当前时间API:
http:
返回数据格式:
QZOutputJson={"s":"o","t":1678083300,"ip":"xxx.xxx.xxx.xxx","pos":"---","rand":"B2Pg8mOVaTTJAA94YMiZzA=="};
测试下来这里比较推荐使用 淘宝的时间接口
,相对来说稳定一些,缺点是获取的是UTC时间的毫秒数需要进行计算得到具体时间。
需要代码可以在下方留言邮箱。
代码解析
下面是初始化以及主函数的主要功能代码
需要代码可以在下方留言或者私信邮箱,不要只留需要代码哦,没地方发。
void setup() {
Serial.begin(115200);
WifiConfiguration();
}
void loop() {
int Circle;
AgainStart:if(WiFi.status() == WL_CONNECTED)
{
ApiInformation = HTTPRequestApi();
JsonInformation = ApiJSONAnalysis(ApiInformation);
Circle = 3;
while(JsonInformation=="null" && Circle--)
{
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);
}
头部宏定义
String WifiSSID="YXDZ";
String WifiPassword="YXDZ1234";
const char* ApiHost = "api.m.taobao.com";
uint16_t ApiPort=80;
const char* GetSysApi = "/rest/api3.do?api=mtop.common.getTimestamp";
String ApiInformation = "";
String JsonInformation = "";
void WifiConfiguration(void);
String HTTPRequestApi(void);
String ApiJSONAnalysis(String JsonData);
定义的参数比较简单,用户如果需要访问其他的API接口,只需要修改 wifi的名称与密码
、API接口的地址
、端口
以及子页地址
如果刚好也是需要获取时间的话那么只需要将 wifi的名称与密码
修改为自己使用的即可
如果你需要的是访问其他的API或者网页
,那么可以参考下面的示例进行修改,当然JSON解析
的函数肯定是无效的了,由于参数不同后面JSON解析的函数需要另外编写并修改。
如下所示,如果我们需要访问其他的网页,例如:http://www.jxl.wiki:8082/test.txt (自己临时做的测试网页,不一定能一直访问),将宏定义中的参数修改为如下所示,即可变更为访问上面的网页了
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)
{
String JSONTime,JsonAnalysisInformation;
unsigned int Year,Month,Day,Hour,Minute,Second,MonthSecond,DaySecond,JSONTime_1_6,JSONTime_7_13;
bool LeapYearFlag = 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>();
JSONTime = JsonAnalysisInformation;
JSONTime_1_6 = (JSONTime.substring(0,6)).toInt()*10000;
JSONTime_7_13 = (JSONTime.substring(6,13)).toInt()/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函数以及时间转换等功能可以参照进行修改,时间转换部分的代码过于臃肿,勿喷,勿喷。实在是一下没想到有什么好的办法只好硬着头皮去做转换了,功能看起来没什么问题索性就这样了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)