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

随着城市交通管理的精细化,燃油车限行政策成为许多车主关注的重点。通过ESP8266等物联网设备实时获取限行信息,不仅能提升生活便利性,还能为智能交通系统提供数据支持。本文将详细介绍如何通过ESP8266发起HTTPS请求、解析网页数据,并通过Arduino IDE输出今日和明日的限行尾号。
准备工作:
材料:
- ESP8266开发板
- 推荐使用ESP8266MOD模块(model vendor)
- USB数据线
- 用于连接ESP8266与电脑,实现编程和调试。
demo4.txt
6.62KB
demo3.txt
3.20KB
demo1.txt
4.04KB
demo2.txt
2.64KB
工具:
万用表(检测电路)
1
整体步骤概述

要实现利用ESP8266获取北京燃油车限行尾号数据并通过Arduino IDE输出,主要包含以下几个关键步骤:
- 连接WiFi:使用ESP8266WiFi库建立与WiFi网络的连接。
- 发起HTTPS请求:通过WiFiClientSecure以GET方法请求目标URL,获取网页数据。
- 解析响应数据:从HTML响应内容中提取今日和明日的限行尾号信息。
- 串口输出结果:将解析后的结果通过串口打印出来。
2
在线环境搭建








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

ESP8266离线包为开发者提供了完整的本地开发解决方案,包含最新固件和开发工具,支持离线编译和烧录,无需依赖网络连接。
离线包简化了开发流程,尤其适合网络受限或需要高效开发的场景。确保文件与开发板型号匹配,并仔细阅读官方文档以获得最佳使用体验。助力您的ESP8266开发项目更高效、更便捷!
截止目前,esp8266离线安装包最新版为ESP8266 3.0.0,原文链接:ESP8266 3.0.0 离线包下载
配置 Arduino IDE(Windows 系统)
- 设置附加开发板管理器地址
- 打开 Arduino IDE,点击菜单栏:
文件 → 首选项
。 - 在“附加开发板管理器网址”中输入以下地址:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
- 点击“确定”保存。
- 手动复制离线安装包
- 解压下载的 ESP8266 离线安装包(如
esp8266-3.0.2.zip
)。 - 将解压后的文件夹(如
esp8266
)复制到以下路径:
C:\Users$$用户名]\AppData\Local\Arduino15\packages
- 注意:
AppData
是隐藏文件夹,需在文件资源管理器中启用“查看隐藏项目”。 - 删除旧版本(可选) 如果之前安装过其他版本的 ESP8266 开发板包,需先删除旧版本以避免冲突:
- 在地址栏输入以下路径并回车:
%LOCALAPPDATA%\Arduino15\packages
- 删除
esp8266
文件夹(如果存在)。 - 验证安装
- 在 Arduino IDE 中点击菜单栏:
工具 → 开发板 → 开发板管理器
。 - 搜索
esp8266
,确认已显示为“已安装”。
f768e-main.zip
35.12MB
4
连接ESP8266到WiFi网络

- 配置WiFi参数 在代码中定义WiFi名称(SSID)和密码:
const char* ssid = "your_SSID"; // 替换为你的WiFi名称
const char* password = "your_PASSWORD"; // 替换为你的WiFi密码
- 编写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请求




12
- 设置目标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";
- 创建安全客户端 使用
WiFiClientSecure
类建立HTTPS连接,并忽略SSL证书验证(降低安全性但简化流程):
WiFiClientSecure client;
client.setInsecure(); // 忽略证书验证
if (!client.connect(host, 443)) {
Serial.println("Connection to server failed");
return;
}
6
计算限行尾号

- 获取当前日期和星期几
- ESP8266无内置实时时钟(RTC),需通过网络时间协议(NTP)获取当前时间。
- 手动计算星期几。
- 示例代码(基于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
输出结果到串口监视器

- 示例代码
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
扩展功能(可选)




12
- 连接OLED显示屏
- 使用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();
}
- 添加蜂鸣器提醒
- 当限行尾号匹配当前车辆尾号时触发蜂鸣器报警。
9
基础代码版本(参考demo1.txt)

功能:
- 实现基本请求与简单解析。
特点:
- 使用
indexOf
搜索关键词定位信息。 - 仅提取限行尾号数字,未处理复杂HTML结构。
局限:
- 依赖固定文本位置,网页改版后易失效。
- 未处理HTML实体(如
)。
// 示例:提取限行尾号数字
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)




12
改进点:
- 精准定位:通过HTML标签
<div class="today">
和<div class="tomorrow">
定位区块。 - 层级解析:在区块内进一步提取日期和限行规则。
- 处理HTML实体:替换
为空格。
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(" ", " ");
// 提取限行规则并输出
Serial.print("今日限行[");
Serial.print(todayDate);
Serial.print("]: ");
Serial.println(todayRule);
}
}
11
高级版本(参考demo4.txt)

功能增强:
- 结构化存储:分别存储日期、规则文本、限行数字和不限行标识。
- 规则解析:支持多种格式(如
1,6
、3和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() {
// 无需重复执行
}
- WiFi连接问题:在实际开发中,可能会遇到ESP8266无法连接到WiFi网络的情况。这可能是由于WiFi名称或密码错误、网络信号弱等原因导致的。通过在代码中添加
Serial.print(".")
来显示连接过程,方便调试人员观察连接状态。 - 服务器连接失败:使用
WiFiClientSecure
连接服务器时,可能会因为网络问题、服务器故障或证书验证问题导致连接失败。这里使用client.setInsecure()
忽略证书验证,虽然简化了连接过程,但降低了安全性。 - 解析逻辑不准确:使用
indexOf
方法查找限行信息,依赖于网页中特定的文本内容。如果网页结构发生变化,或者文本内容有调整,可能会导致解析失败。
优化部分:
- 添加调试信息:在代码中添加
Serial.println()
语句,输出连接状态和响应内容,方便调试和定位问题。 - 忽略证书验证:在测试环境中,为了简化连接过程,使用
client.setInsecure()
忽略证书验证。但在生产环境中,建议使用正确的证书进行验证,以提高安全性。
代码逻辑分析:
setup()
函数:初始化串口通信,连接WiFi网络,创建安全客户端并连接到服务器,发送HTTP请求,读取响应内容,最后调用parseLimitInfo()
函数解析限行信息。parseLimitInfo()
函数:通过indexOf
方法查找“今日限行尾号”和“明日限行尾号”的位置,调用extractNumbers()
函数提取限行尾号,并通过串口输出。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(" ", " "); // 处理可能的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(" ", " "); // 处理可能的HTML空格
Serial.print("明日限行: ");
Serial.println(tomorrow);
}
}
- HTML结构变化:如果网页的HTML结构发生变化,例如
<div class="today">
和<div class="tomorrow">
标签的位置或属性发生改变,可能会导致解析失败。 - HTML实体处理:网页中可能会包含HTML实体,如
,需要进行处理才能得到正确的限行信息。
优化部分:
- 精准定位:通过
<div class="today">
和<div class="tomorrow">
标签精准定位限行信息所在的区块,提高解析的准确性。 - 层级解析:在限行区块内进一步查找
<div class="rule
标签,确保提取到的是准确的限行规则。 - 安全截取:使用
indexOf
的第二个参数限定搜索范围,避免误匹配,提高解析的稳定性。 - HTML解码:处理了常见的HTML空格实体
,确保提取到的信息是正确的。
代码逻辑分析:
- 首先通过
indexOf
方法查找<div class="today">
和<div class="tomorrow">
标签的位置,确定限行信息的起始位置。 - 然后在每个区块内查找
<div class="rule
标签,确定限行规则的起始位置。 - 最后通过
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(" ", " ");
// 提取限行规则
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(" ", " ");
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(" ", " ");
// 提取限行规则
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(" ", " ");
Serial.print("明日限行[");
Serial.print(tomorrowDate);
Serial.print("]: ");
Serial.println(tomorrowRule);
}
}
- 日期和规则提取不准确:如果网页的HTML结构发生变化,可能会导致日期和限行规则提取不准确。
- 内存占用问题:对于长响应内容,一次性读取和处理可能会导致内存占用过高,影响程序的稳定性。
优化部分:
- 精准定位:通过
<div class="today">
和<div class="tomorrow">
定位区块,在区块内分别查找日期和限行规则,提高提取的准确性。 - 层级解析:先查找
<div class="date
获取日期,再查找<div class="rule
获取限行规则,确保信息提取的准确性。 - 安全截取:使用
indexOf
时指定搜索起点,避免跨区块匹配,提高解析的稳定性。 - HTML解码:处理了
等常见HTML实体,确保提取到的信息是正确的。
代码逻辑分析:
- 与优化解析代码版本类似,先通过
indexOf
方法定位<div class="today">
和<div class="tomorrow">
标签,确定今日和明日信息的起始位置。 - 在每个区块内,分别查找
<div class="date
和<div class="rule
标签,提取日期和限行规则。 - 最后通过串口输出日期和限行规则。
优化存储和解析代码版本
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(" ", " ");
// 提取限行规则
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(" ", " ");
// 解析规则文本
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(" ", " ");
// 提取限行规则
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(" ", " ");
// 解析规则文本
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,6”、“5”、“3和8”、“不限行”等,需要对不同格式进行处理。
- 数据存储和管理:需要存储今日和明日的日期、限行规则、限行尾号等信息,需要合理设计数据结构。
优化部分:
- 数据结构优化:新增今日/明日日期存储变量(
todayDate
,tomorrowDate
),新增今日/明日原始规则文本(todayRuleText
,tomorrowRuleText
),新增今日/明日限行数字变量(todayDigit1
,todayDigit2
,tomorrowDigit1
,tomorrowDigit2
),新增今日/明日不限行标识(todayUnlimited
,tomorrowUnlimited
),方便数据的存储和管理。 - 功能增强:增加
parseRule()
函数专门处理规则解析,支持处理多种格式的限行规则,提高代码的灵活性和可扩展性。 - 状态标识:用 -1 表示无效数字,用空字符串表示非“不限行”状态,用非空字符串表示“不限行”状态,方便判断和处理。
- 代码结构:每个变量都添加了清晰的注释说明,保持原有网络通信逻辑不变,保留原始串口调试信息(可通过
Serial.println()
查看),提高代码的可读性和可维护性。
代码逻辑分析:
setup()
函数:与基础版本类似,初始化串口通信,连接WiFi网络,创建安全客户端并连接到服务器,发送HTTP请求,读取响应内容,最后调用parseLimitInfo()
函数解析限行信息。parseLimitInfo()
函数:提取今日和明日的日期和限行规则,调用parseRule()
函数解析规则文本,将解析结果存储在相应的变量中。parseRule()
函数:处理不同格式的限行规则,将规则文本解析为数字或“不限行”状态,存储在相应的变量中。










更多相关项目
猜你喜欢
评论/提问(已发布 0 条)

