使用ESP8266获取北京燃油车限行信息并输出至Arduino IDE

ChangeCode
原创
发布时间: 2025-06-14 15:16:47 | 阅读数 0收藏数 0评论数 0
封面
随着城市交通管理的精细化,燃油车限行政策成为许多车主关注的重点。通过ESP8266等物联网设备实时获取限行信息,不仅能提升生活便利性,还能为智能交通系统提供数据支持。本文将详细介绍如何通过ESP8266发起HTTPS请求、解析网页数据,并通过Arduino IDE输出今日和明日的限行尾号。

准备工作:

材料:

  1. ESP8266开发板
  2. 推荐使用ESP8266MOD模块(model vendor)
  3. USB数据线
  4. 用于连接ESP8266与电脑,实现编程和调试。
TXT
demo4.txt
6.62KB
TXT
demo3.txt
3.20KB
TXT
demo1.txt
4.04KB
TXT
demo2.txt
2.64KB

工具:

万用表(检测电路)

1

整体步骤概述

要实现利用ESP8266获取北京燃油车限行尾号数据并通过Arduino IDE输出,主要包含以下几个关键步骤:

  1. 连接WiFi:使用ESP8266WiFi库建立与WiFi网络的连接。
  2. 发起HTTPS请求:通过WiFiClientSecure以GET方法请求目标URL,获取网页数据。
  3. 解析响应数据:从HTML响应内容中提取今日和明日的限行尾号信息。
  4. 串口输出结果:将解析后的结果通过串口打印出来。
2

在线环境搭建

  1. 装Arduino IDE 下载并安装最新版Arduino IDE(官网链接)。
  2. 添加ESP8266开发支持
  3. 打开Arduino IDE,进入 文件 > 首选项
  4. 在“附加开发板管理器网址”中添加:http://arduino.esp8266.com/stable/package_esp8266com_index.json
  5. 进入 工具 > 开发板 > 开发板管理器,搜索并安装“ESP8266 by ESP8266 Community”。
  6. 安装必要库
  7. 安装 ESP8266WiFiWiFiClientSecure 库(默认已包含)。
  8. 安装 ArduinoJson 库(用于JSON解析,可选)。
3

离线环境搭建

ESP8266离线包为开发者提供了完整的本地开发解决方案,包含最新固件和开发工具,支持离线编译和烧录,无需依赖网络连接。

离线包简化了开发流程,尤其适合网络受限或需要高效开发的场景。确保文件与开发板型号匹配,并仔细阅读官方文档以获得最佳使用体验。助力您的ESP8266开发项目更高效、更便捷!



截止目前,esp8266离线安装包最新版为ESP8266 3.0.0,原文链接:ESP8266 3.0.0 离线包下载



配置 Arduino IDE(Windows 系统)

  1. 设置附加开发板管理器地址
  2. 打开 Arduino IDE,点击菜单栏:文件 → 首选项
  3. 在“附加开发板管理器网址”中输入以下地址:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
  1. 点击“确定”保存。
  2. 手动复制离线安装包
  3. 解压下载的 ESP8266 离线安装包(如 esp8266-3.0.2.zip)。
  4. 将解压后的文件夹(如 esp8266)复制到以下路径:
C:\Users$$用户名]\AppData\Local\Arduino15\packages
  1. 注意AppData 是隐藏文件夹,需在文件资源管理器中启用“查看隐藏项目”。
  2. 删除旧版本(可选) 如果之前安装过其他版本的 ESP8266 开发板包,需先删除旧版本以避免冲突:
  3. 在地址栏输入以下路径并回车:
%LOCALAPPDATA%\Arduino15\packages
  1. 删除 esp8266 文件夹(如果存在)。
  2. 验证安装
  3. 在 Arduino IDE 中点击菜单栏:工具 → 开发板 → 开发板管理器
  4. 搜索 esp8266,确认已显示为“已安装”。


ZIP
f768e-main.zip
35.12MB
4

连接ESP8266到WiFi网络

  1. 配置WiFi参数 在代码中定义WiFi名称(SSID)和密码:
const char* ssid = "your_SSID";     // 替换为你的WiFi名称
const char* password = "your_PASSWORD";    // 替换为你的WiFi密码
  1. 编写WiFi连接代码 使用 WiFi.begin() 函数连接网络,并通过 Serial.print 显示连接状态:
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
}
5

发起HTTPS GET请求

  1. 设置目标URL和主机名 根据需求定义目标URL和主机名:
const char* host = "m.bj.bendibao.com";
const String url = "/news/xianxingchaxun/index.php?category=%E7%87%83%E6%B2%B9%E8%BD%A6";
  1. 创建安全客户端 使用 WiFiClientSecure 类建立HTTPS连接,并忽略SSL证书验证(降低安全性但简化流程):
WiFiClientSecure client;
client.setInsecure(); // 忽略证书验证
if (!client.connect(host, 443)) {
Serial.println("Connection to server failed");
return;
}
6

计算限行尾号

  1. 获取当前日期和星期几
  2. ESP8266无内置实时时钟(RTC),需通过网络时间协议(NTP)获取当前时间。
  3. 手动计算星期几。
  4. 示例代码(基于DEMO4的限行规则):
// 根据当前星期几返回今日和明日限行尾号
void getLimitRules(int dayOfWeek, String& todayRule, String& tomorrowRule) {
switch (dayOfWeek) {
case 1: // 周一
todayRule = "4和9";
tomorrowRule = "5和0";
break;
case 2: // 周二
todayRule = "5和0";
tomorrowRule = "1和6";
break;
case 3: // 周三
todayRule = "1和6";
tomorrowRule = "2和7";
break;
case 4: // 周四
todayRule = "2和7";
tomorrowRule = "3和8";
break;
case 5: // 周五
todayRule = "3和8";
tomorrowRule = "不限行";
break;
default: // 周六、周日
todayRule = "不限行";
tomorrowRule = "不限行";
}
}
7

输出结果到串口监视器

  1. 示例代码
void loop() {
int dayOfWeek = getDayOfWeek(); // 获取当前星期几
String todayRule, tomorrowRule;
getLimitRules(dayOfWeek, todayRule, tomorrowRule);

Serial.print("今日限行: ");
Serial.println(todayRule);
Serial.print("明日限行: ");
Serial.println(tomorrowRule);
delay(60000); // 每分钟刷新一次
}
8

扩展功能(可选)

  1. 连接OLED显示屏
  2. 使用I2C接口连接OLED屏,显示限行信息:
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("今日限行: " + todayRule);
display.println("明日限行: " + tomorrowRule);
display.display();
}
  1. 添加蜂鸣器提醒
  2. 当限行尾号匹配当前车辆尾号时触发蜂鸣器报警。
9

基础代码版本(参考demo1.txt)

功能

  1. 实现基本请求与简单解析。

特点

  1. 使用indexOf搜索关键词定位信息。
  2. 仅提取限行尾号数字,未处理复杂HTML结构。

局限

  1. 依赖固定文本位置,网页改版后易失效。
  2. 未处理HTML实体(如&nbsp;)。
// 示例:提取限行尾号数字
String extractNumbers(String str, int index) {
String result = "";
for (int i = index; i < str.length(); i++) {
char c = str.charAt(i);
if (isdigit(c) || c == '和') result += c;
else if (result.length() > 0) break;
}
return result;
}
10

优化版本(参考demo2.txt与demo3.txt)

改进点

  1. 精准定位:通过HTML标签<div class="today"><div class="tomorrow">定位区块。
  2. 层级解析:在区块内进一步提取日期和限行规则。
  3. 处理HTML实体:替换&nbsp;为空格。
void parseLimitInfo(String content) {
// 提取今日信息
int todayIndex = content.indexOf("<div class=\"today\">");
if (todayIndex != -1) {
// 提取日期
int dateStart = content.indexOf("<div class=\"date", todayIndex);
int dateTextStart = content.indexOf('>', dateStart) + 1;
int dateTextEnd = content.indexOf('<', dateTextStart);
String todayDate = content.substring(dateTextStart, dateTextEnd);
todayDate.replace("&nbsp;", " ");

// 提取限行规则并输出
Serial.print("今日限行[");
Serial.print(todayDate);
Serial.print("]: ");
Serial.println(todayRule);
}
}
11

高级版本(参考demo4.txt)

功能增强

  1. 结构化存储:分别存储日期、规则文本、限行数字和不限行标识。
  2. 规则解析:支持多种格式(如1,63和8不限行)。

核心代码

// 解析限行规则文本
void parseRule(String ruleText, int &digit1, int &digit2, String &unlimited) {
if (ruleText.indexOf("不限行") != -1) {
unlimited = "不限行";
return;
}
ruleText.replace("和", ",");
int firstComma = ruleText.indexOf(',');
if (firstComma != -1) {
digit1 = ruleText.substring(0, firstComma).toInt();
digit2 = ruleText.substring(firstComma + 1).toInt();
} else {
digit1 = ruleText.toInt();
}
}
12

demo1代码开发中遇到的问题

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

// 替换为你的WiFi信息
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";

// 目标主机和URL
const char* host = "m.bj.bendibao.com";
const String url = "/news/xianxingchaxun/index.php?category=%E7%87%83%E6%B2%B9%E8%BD%A6";

void setup() {
Serial.begin(115200);
delay(10);

// 连接WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");

// 创建安全客户端
WiFiClientSecure client;
client.setInsecure(); // 忽略证书验证

// 连接服务器
if (!client.connect(host, 443)) {
Serial.println("Connection to server failed");
return;
}

// 发送HTTP请求
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"User-Agent: ESP8266\r\n" +
"Connection: close\r\n\r\n");

// 跳过响应头
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") break;
}

// 读取响应内容
String content = client.readString();
client.stop();

// 解析限行信息(根据实际网页结构调整)
parseLimitInfo(content);
}

void parseLimitInfo(String content) {
// 示例解析逻辑(需根据实际HTML结构调整)
int todayIndex = content.indexOf("今日限行尾号");
int tomorrowIndex = content.indexOf("明日限行尾号");

if (todayIndex != -1) {
String today = extractNumbers(content, todayIndex);
Serial.print("今日限行尾号: ");
Serial.println(today);
} else {
Serial.println("未找到今日限行信息");
}

if (tomorrowIndex != -1) {
String tomorrow = extractNumbers(content, tomorrowIndex);
Serial.print("明日限行尾号: ");
Serial.println(tomorrow);
} else {
Serial.println("未找到明日限行信息");
}
}

String extractNumbers(String str, int index) {
String result = "";
// 从指定位置开始查找数字
for (int i = index; i < str.length(); i++) {
char c = str.charAt(i);
if (isdigit(c) || c == '和') { // 包含'和'字符(例如"3和8")
result += c;
} else if (result.length() > 0) {
break; // 遇到非数字/和字符时停止
}
}
return result;
}

void loop() {
// 无需重复执行
}


  1. WiFi连接问题:在实际开发中,可能会遇到ESP8266无法连接到WiFi网络的情况。这可能是由于WiFi名称或密码错误、网络信号弱等原因导致的。通过在代码中添加Serial.print(".")来显示连接过程,方便调试人员观察连接状态。
  2. 服务器连接失败:使用WiFiClientSecure连接服务器时,可能会因为网络问题、服务器故障或证书验证问题导致连接失败。这里使用client.setInsecure()忽略证书验证,虽然简化了连接过程,但降低了安全性。
  3. 解析逻辑不准确:使用indexOf方法查找限行信息,依赖于网页中特定的文本内容。如果网页结构发生变化,或者文本内容有调整,可能会导致解析失败。

优化部分

  1. 添加调试信息:在代码中添加Serial.println()语句,输出连接状态和响应内容,方便调试和定位问题。
  2. 忽略证书验证:在测试环境中,为了简化连接过程,使用client.setInsecure()忽略证书验证。但在生产环境中,建议使用正确的证书进行验证,以提高安全性。

代码逻辑分析

  1. setup()函数:初始化串口通信,连接WiFi网络,创建安全客户端并连接到服务器,发送HTTP请求,读取响应内容,最后调用parseLimitInfo()函数解析限行信息。
  2. parseLimitInfo()函数:通过indexOf方法查找“今日限行尾号”和“明日限行尾号”的位置,调用extractNumbers()函数提取限行尾号,并通过串口输出。
  3. extractNumbers()函数:从指定位置开始查找数字,遇到非数字或“和”字符时停止,返回提取到的数字字符串。
优化解析代码版本


13

demo2代码开发中遇到的问题

void parseLimitInfo(String content) {
// 提取今日限行信息
int todayStart = content.indexOf("<div class=\"today\">");
if(todayStart != -1){
int ruleStart = content.indexOf("<div class=\"rule", todayStart);
int textStart = content.indexOf('>', ruleStart) + 1;
int textEnd = content.indexOf('<', textStart);
String today = content.substring(textStart, textEnd);
today.replace("&nbsp;", " "); // 处理可能的HTML空格
Serial.print("今日限行: ");
Serial.println(today);
}

// 提取明日限行信息
int tomorrowStart = content.indexOf("<div class=\"tomorrow\">");
if(tomorrowStart != -1){
int ruleStart = content.indexOf("<div class=\"rule", tomorrowStart);
int textStart = content.indexOf('>', ruleStart) + 1;
int textEnd = content.indexOf('<', textStart);
String tomorrow = content.substring(textStart, textEnd);
tomorrow.replace("&nbsp;", " "); // 处理可能的HTML空格
Serial.print("明日限行: ");
Serial.println(tomorrow);
}
}


  1. HTML结构变化:如果网页的HTML结构发生变化,例如<div class="today"><div class="tomorrow">标签的位置或属性发生改变,可能会导致解析失败。
  2. HTML实体处理:网页中可能会包含HTML实体,如&nbsp;,需要进行处理才能得到正确的限行信息。

优化部分

  1. 精准定位:通过<div class="today"><div class="tomorrow">标签精准定位限行信息所在的区块,提高解析的准确性。
  2. 层级解析:在限行区块内进一步查找<div class="rule标签,确保提取到的是准确的限行规则。
  3. 安全截取:使用indexOf的第二个参数限定搜索范围,避免误匹配,提高解析的稳定性。
  4. HTML解码:处理了常见的HTML空格实体&nbsp;,确保提取到的信息是正确的。

代码逻辑分析

  1. 首先通过indexOf方法查找<div class="today"><div class="tomorrow">标签的位置,确定限行信息的起始位置。
  2. 然后在每个区块内查找<div class="rule标签,确定限行规则的起始位置。
  3. 最后通过substring方法提取限行规则,并使用replace方法处理HTML实体。
同时提取日期和限行信息代码版本


14

demo3代码开发中遇到的问题

void parseLimitInfo(String content) {
// 提取今日信息
int todayIndex = content.indexOf("<div class=\"today\">");
if(todayIndex != -1){
// 提取日期
int dateStart = content.indexOf("<div class=\"date", todayIndex);
int dateTextStart = content.indexOf('>', dateStart) + 1;
int dateTextEnd = content.indexOf('<', dateTextStart);
String todayDate = content.substring(dateTextStart, dateTextEnd);
todayDate.replace("&nbsp;", " ");
// 提取限行规则
int ruleStart = content.indexOf("<div class=\"rule", todayIndex);
int ruleTextStart = content.indexOf('>', ruleStart) + 1;
int ruleTextEnd = content.indexOf('<', ruleTextStart);
String todayRule = content.substring(ruleTextStart, ruleTextEnd);
todayRule.replace("&nbsp;", " ");

Serial.print("今日限行[");
Serial.print(todayDate);
Serial.print("]: ");
Serial.println(todayRule);
}

// 提取明日信息
int tomorrowIndex = content.indexOf("<div class=\"tomorrow\">");
if(tomorrowIndex != -1){
// 提取日期
int dateStart = content.indexOf("<div class=\"date", tomorrowIndex);
int dateTextStart = content.indexOf('>', dateStart) + 1;
int dateTextEnd = content.indexOf('<', dateTextStart);
String tomorrowDate = content.substring(dateTextStart, dateTextEnd);
tomorrowDate.replace("&nbsp;", " ");
// 提取限行规则
int ruleStart = content.indexOf("<div class=\"rule", tomorrowIndex);
int ruleTextStart = content.indexOf('>', ruleStart) + 1;
int ruleTextEnd = content.indexOf('<', ruleTextStart);
String tomorrowRule = content.substring(ruleTextStart, ruleTextEnd);
tomorrowRule.replace("&nbsp;", " ");

Serial.print("明日限行[");
Serial.print(tomorrowDate);
Serial.print("]: ");
Serial.println(tomorrowRule);
}
}


  1. 日期和规则提取不准确:如果网页的HTML结构发生变化,可能会导致日期和限行规则提取不准确。
  2. 内存占用问题:对于长响应内容,一次性读取和处理可能会导致内存占用过高,影响程序的稳定性。

优化部分

  1. 精准定位:通过<div class="today"><div class="tomorrow">定位区块,在区块内分别查找日期和限行规则,提高提取的准确性。
  2. 层级解析:先查找<div class="date获取日期,再查找<div class="rule获取限行规则,确保信息提取的准确性。
  3. 安全截取:使用indexOf时指定搜索起点,避免跨区块匹配,提高解析的稳定性。
  4. HTML解码:处理了&nbsp;等常见HTML实体,确保提取到的信息是正确的。

代码逻辑分析

  1. 与优化解析代码版本类似,先通过indexOf方法定位<div class="today"><div class="tomorrow">标签,确定今日和明日信息的起始位置。
  2. 在每个区块内,分别查找<div class="date<div class="rule标签,提取日期和限行规则。
  3. 最后通过串口输出日期和限行规则。
优化存储和解析代码版本


15

demo4代码开发中遇到的问题

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

// WiFi配置
const char* ssid = "nayun4Gwifi";
const char* password = "nayunzhixiang";

// 目标服务器信息
const char* host = "m.bj.bendibao.com";
const String url = "/news/xianxingchaxun/index.php?category=%E7%87%83%E6%B2%B9%E8%BD%A6";

// 存储今日限行信息
String todayDate = ""; // 今日日期(如:05月19日(周一))
String todayRuleText = ""; // 原始限行规则文本(如:1,6 或 不限行)
int todayDigit1 = -1; // 今日第一个限行尾号(-1表示无)
int todayDigit2 = -1; // 今日第二个限行尾号(-1表示无)
String todayUnlimited = ""; // 今日是否不限行(非空表示不限行)

// 存储明日限行信息
String tomorrowDate = ""; // 明日日期(如:05月20日(周二))
String tomorrowRuleText = ""; // 原始限行规则文本(如:2,7 或 不限行)
int tomorrowDigit1 = -1; // 明日第一个限行尾号(-1表示无)
int tomorrowDigit2 = -1; // 明日第二个限行尾号(-1表示无)
String tomorrowUnlimited = ""; // 明日是否不限行(非空表示不限行)

void setup() {
Serial.begin(115200);
delay(10);

// WiFi连接
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");

// 创建安全连接
WiFiClientSecure client;
client.setInsecure(); // 忽略证书验证

// 连接服务器
if (!client.connect(host, 443)) {
Serial.println("Connection to server failed");
return;
}

// 发送HTTP请求
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"User-Agent: ESP8266\r\n" +
"Connection: close\r\n\r\n");

// 跳过响应头
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") break;
}

// 读取响应内容
String content = client.readString();
client.stop();

// 解析限行信息
parseLimitInfo(content);
}

// 解析限行信息并提取关键数据
void parseLimitInfo(String content) {
// 提取今日信息
int todayIndex = content.indexOf("<div class=\"today\">");
if (todayIndex != -1) {
// 提取日期
int dateStart = content.indexOf("<div class=\"date", todayIndex);
int dateTextStart = content.indexOf('>', dateStart) + 1;
int dateTextEnd = content.indexOf('<', dateTextStart);
todayDate = content.substring(dateTextStart, dateTextEnd);
todayDate.replace("&nbsp;", " ");

// 提取限行规则
int ruleStart = content.indexOf("<div class=\"rule", todayIndex);
int ruleTextStart = content.indexOf('>', ruleStart) + 1;
int ruleTextEnd = content.indexOf('<', ruleTextStart);
todayRuleText = content.substring(ruleTextStart, ruleTextEnd);
todayRuleText.replace("&nbsp;", " ");
// 解析规则文本
parseRule(todayRuleText, todayDigit1, todayDigit2, todayUnlimited);
}

// 提取明日信息
int tomorrowIndex = content.indexOf("<div class=\"tomorrow\">");
if (tomorrowIndex != -1) {
// 提取日期
int dateStart = content.indexOf("<div class=\"date", tomorrowIndex);
int dateTextStart = content.indexOf('>', dateStart) + 1;
int dateTextEnd = content.indexOf('<', dateTextStart);
tomorrowDate = content.substring(dateTextStart, dateTextEnd);
tomorrowDate.replace("&nbsp;", " ");

// 提取限行规则
int ruleStart = content.indexOf("<div class=\"rule", tomorrowIndex);
int ruleTextStart = content.indexOf('>', ruleStart) + 1;
int ruleTextEnd = content.indexOf('<', ruleTextStart);
tomorrowRuleText = content.substring(ruleTextStart, ruleTextEnd);
tomorrowRuleText.replace("&nbsp;", " ");
// 解析规则文本
parseRule(tomorrowRuleText, tomorrowDigit1, tomorrowDigit2, tomorrowUnlimited);
}
}

// 解析限行规则文本,提取数字或"不限行"
void parseRule(String ruleText, int &digit1, int &digit2, String &unlimited) {
// 清空变量
digit1 = -1;
digit2 = -1;
unlimited = "";
// 处理"不限行"情况
if (ruleText.indexOf("不限行") != -1) {
unlimited = "不限行";
return;
}
// 替换中文"和"为逗号,统一处理分隔符
ruleText.replace("和", ",");
// 分割规则文本
int firstComma = ruleText.indexOf(',');
if (firstComma != -1) {
// 有多个数字的情况(如:1,6)
String firstDigitStr = ruleText.substring(0, firstComma);
String secondDigitStr = ruleText.substring(firstComma + 1);
digit1 = firstDigitStr.toInt();
digit2 = secondDigitStr.toInt();
} else {
// 单个数字的情况(如:5)
digit1 = ruleText.toInt();
}
}

void loop() {
// 主循环保留为空
}


  1. 规则解析复杂:限行规则可能有多种格式,如“1,6”、“5”、“3和8”、“不限行”等,需要对不同格式进行处理。
  2. 数据存储和管理:需要存储今日和明日的日期、限行规则、限行尾号等信息,需要合理设计数据结构。

优化部分

  1. 数据结构优化:新增今日/明日日期存储变量(todayDate, tomorrowDate),新增今日/明日原始规则文本(todayRuleText, tomorrowRuleText),新增今日/明日限行数字变量(todayDigit1, todayDigit2, tomorrowDigit1, tomorrowDigit2),新增今日/明日不限行标识(todayUnlimited, tomorrowUnlimited),方便数据的存储和管理。
  2. 功能增强:增加parseRule()函数专门处理规则解析,支持处理多种格式的限行规则,提高代码的灵活性和可扩展性。
  3. 状态标识:用 -1 表示无效数字,用空字符串表示非“不限行”状态,用非空字符串表示“不限行”状态,方便判断和处理。
  4. 代码结构:每个变量都添加了清晰的注释说明,保持原有网络通信逻辑不变,保留原始串口调试信息(可通过Serial.println()查看),提高代码的可读性和可维护性。

代码逻辑分析

  1. setup()函数:与基础版本类似,初始化串口通信,连接WiFi网络,创建安全客户端并连接到服务器,发送HTTP请求,读取响应内容,最后调用parseLimitInfo()函数解析限行信息。
  2. parseLimitInfo()函数:提取今日和明日的日期和限行规则,调用parseRule()函数解析规则文本,将解析结果存储在相应的变量中。
  3. parseRule()函数:处理不同格式的限行规则,将规则文本解析为数字或“不限行”状态,存储在相应的变量中。


阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载