当前位置:首页>教案>巴法云物联网应用-ESP32网络闹钟教案:基于巴法云MQTT与点阵屏显示

巴法云物联网应用-ESP32网络闹钟教案:基于巴法云MQTT与点阵屏显示

  • 2026-04-30 02:24:30
巴法云物联网应用-ESP32网络闹钟教案:基于巴法云MQTT与点阵屏显示

ESP32网络闹钟教案:基于巴法云MQTT与点阵屏显示

一、项目概述

本教案将带领您制作一个基于ESP32的网络闹钟。它通过WiFi连接互联网,使用NTP协议获取准确时间,并通过巴法云MQTT接收远程指令来设定闹钟。当到达设定时间时,蜂鸣器鸣响,同时点阵屏显示提醒信息。点阵屏平时显示当前时间(时:分),收到其他文字消息时也可短暂显示。

功能特点

  • 无需外部时钟芯片,时间来自网络(NTP)。
  • 通过手机/电脑发送MQTT消息设定闹钟(格式 HH:MM:SS)。
  • 闹钟触发后蜂鸣器响5秒,屏幕显示 Alarm!
  • 点阵屏可显示自定义文字(最多6个字符)。
  • 自动重连WiFi和MQTT。

二、硬件准备与接线

所需硬件

组件

数量

说明

ESP32开发板

1块

核心控制

4合1点阵屏

1个

MAX7219驱动,8×32像素

有源蜂鸣器

1个

通电即响,3.3V驱动

杜邦线

若干

母对母

接线表

点阵屏引脚

ESP32引脚

VCC

5V

GND

GND

DIN

GPIO23

CLK

GPIO18

CS

GPIO15

蜂鸣器引脚

ESP32引脚

VCC

3.3V

GND

GND

S(信号)

GPIO13

注意:点阵屏务必接5V,否则亮度不足或无法点亮。蜂鸣器为有源型,直接高低电平控制。


三、软件准备

1. 安装Arduino IDE及ESP32开发板支持

  • 下载安装Arduino IDE(版本≥1.8.13)。

2. 安装所需库

在Arduino IDE中点击“项目” → “加载库” → “管理库”,搜索并安装以下库:

  • U8g2 (by olikraus) – 用于MAX7219点阵屏。
  • PubSubClient (by Nick O'Leary) – MQTT客户端。
  • NTPClient (by Fabrice Weinberg) – 网络时间协议客户端。

安装完成后,重启IDE。


四、代码详解

我们将代码分为若干模块,逐一解释。您可以边阅读边在IDE中编写,最后合成完整程序。

1. 包含头文件与全局定义

#include <WiFi.h>
#include <PubSubClient.h>
#include <U8g2lib.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
  • WiFi.h:ESP32的WiFi功能。
  • PubSubClient.h:MQTT通信。
  • U8g2lib.h:点阵屏驱动。
  • NTPClient.h 和 WiFiUdp.h:用于网络时间获取。

2. WiFi与MQTT配置

const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

const char* mqtt_server = "bemfa.com";
const int mqtt_port = 9501;
const char* mqtt_topic = "你的主题名";   // 巴法云主题,需在官网创建
const char* mqtt_client_id = "自定义客户端ID"; // 可任意,建议唯一

WiFiClient espClient;
PubSubClient client(espClient);
  • 请将 ssid 和 password 替换为您自己的WiFi凭据。
  • 巴法云MQTT服务器地址固定为 bemfa.com,端口 9501
  • 主题名需在 巴法云官网 注册并创建,例如 esp32_alarm
  • 客户端ID可任意,建议用唯一字符串。

3. NTP时间配置

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "cn.pool.ntp.org", 8 * 3600, 60000);
  • 使用国内NTP服务器 cn.pool.ntp.org
  • 第三个参数为时区偏移(秒),东八区为 8*3600
  • 第四个参数为更新时间间隔(毫秒),这里设为60000ms(60秒),即每小时请求一次NTP服务器(实际内部会按间隔更新,不会每秒请求)。

4. 点阵屏引脚定义与初始化对象

#define MATRIX_CLK 18
#define MATRIX_DIN 23
#define MATRIX_CS  15
U8G2_MAX7219_32X8_F_4W_SW_SPI u8g2(U8G2_R0, MATRIX_CLK, MATRIX_DIN, MATRIX_CS, U8X8_PIN_NONE, U8X8_PIN_NONE);
  • 定义三个引脚:时钟、数据、片选。
  • 构造函数参数:旋转方向(U8G2_R0 为正常方向),后面依次是CLK、DIN、CS,最后两个是DC和复位引脚,MAX7219不需要,填 U8X8_PIN_NONE

5. 蜂鸣器引脚

#define BUZZER_PIN 13
  • 有源蜂鸣器信号线接GPIO13。

6. 闹钟数据结构与全局变量

struct AlarmTime {
  uint8_t hour;
  uint8_t minute;
  uint8_t second;
  bool enabled;
} alarmTime = {0, 0, 0, false};

int lastTriggerDay = -1;      // 用于记录上次触发日期(简单版,未使用)
bool alarmActive = false;
unsigned long alarmStartTime = 0;
const unsigned long alarmDuration = 5000; // 鸣响5秒
  • AlarmTime 结构体存储闹钟的小时、分钟、秒和启用标志。
  • lastTriggerDay 本意是用于每天只触发一次,当前版本暂未使用(可后续扩展)。
  • alarmActive 表示闹钟正在响铃,alarmStartTime 记录开始时间,用于控制响铃时长。

7. 函数声明

void setup_wifi();
void reconnect();
void callback(char* topic, byte* payload, unsigned int length);
void checkAlarm();
void triggerAlarm();
void displayTime(int hour, int minute);
void displayMessage(const char* msg);
  • 提前声明自定义函数,方便阅读。

8. setup() 初始化

void setup() {
  Serial.begin(115200);
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, LOW);

  u8g2.begin();
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB08_tr);
  u8g2.drawStr(0, 8, "Init");
  u8g2.sendBuffer();

  setup_wifi();
  timeClient.begin();
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}
  • 初始化串口,设置蜂鸣器引脚为输出并初始低电平。
  • 点阵屏初始化,显示 “Init” 表示启动。
  • 连接WiFi,启动NTP客户端,配置MQTT服务器和回调函数。

9. WiFi连接函数 setup_wifi()

void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}
  • 尝试连接WiFi,连接成功后在串口打印IP地址。

10. MQTT重连函数 reconnect()

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect(mqtt_client_id)) {
      Serial.println("connected");
      client.subscribe(mqtt_topic);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}
  • 如果MQTT断开,循环尝试重连,成功后订阅主题。

11. MQTT消息回调函数 callback()

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  String message;
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }
  Serial.println(message);

  if (length == 8) { // 格式 "HH:MM:SS"
    int h, m, s;
    if (sscanf(message.c_str(), "%d:%d:%d", &h, &m, &s) == 3) {
      if (h >= 0 && h < 24 && m >= 0 && m < 60 && s >= 0 && s < 60) {
        alarmTime.hour = h;
        alarmTime.minute = m;
        alarmTime.second = s;
        alarmTime.enabled = true;
        lastTriggerDay = -1; // 重置触发记录
        Serial.println("Alarm set successfully");
        char timeStr[6];
        sprintf(timeStr, "%02d:%02d", h, m);
        displayMessage(timeStr);
      }
    }
  } else {
    displayMessage(message.c_str());
  }
}
  • 将接收到的payload拼接成字符串。
  • 如果消息长度=8(如 14:30:00),则解析时分秒,并更新闹钟结构体,显示设定时间(只显示时:分,避免超宽)。
  • 其他任意消息直接显示在点阵屏上。

12. 闹钟检查函数 checkAlarm()

void checkAlarm() {
  if (!alarmTime.enabled) return;

  int nowHour = timeClient.getHours();
  int nowMinute = timeClient.getMinutes();
  int nowSecond = timeClient.getSeconds();

  // 当前版本每分钟的每一秒都可能触发(只要时分秒完全匹配)
  if (nowHour == alarmTime.hour && nowMinute == alarmTime.minute && nowSecond == alarmTime.second) {
    triggerAlarm();
    // 如果需要每天只触发一次,可在此增加日期判断(见扩展)
  }
}
  • 获取当前时、分、秒。
  • 如果与设定的闹钟时间完全一致,则触发闹钟。

13. 闹钟触发函数 triggerAlarm()

void triggerAlarm() {
  Serial.println("ALARM TRIGGERED!");
  alarmActive = true;
  alarmStartTime = millis();
  digitalWrite(BUZZER_PIN, HIGH);
  displayMessage("Alarm!");
}
  • 设置激活标志,记录开始时间,打开蜂鸣器,屏幕显示 Alarm!

14. 点阵屏显示函数

void displayTime(int hour, int minute) {
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB08_tr);
    char timeStr[6];
    sprintf(timeStr, "%02d:%02d", hour, minute);
    u8g2.drawStr(0, 8, timeStr);
  } while (u8g2.nextPage());
}

void displayMessage(const char* msg) {
  char shortMsg[7];
  strncpy(shortMsg, msg, 6);
  shortMsg[6] = '\0';
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB08_tr);
    u8g2.drawStr(0, 8, shortMsg);
  } while (u8g2.nextPage());
}
  • 使用U8g2的页面缓冲模式,先 firstPage(),然后在循环中绘制,最后 nextPage() 结束。
  • displayTime 显示格式化的 HH:MM
  • displayMessage 将消息截断为最多6字符(屏幕宽度32像素,每个字符约6像素,6字符约36像素,可能略微超出,但通常可显示),保证不溢出。

15. 主循环 loop()

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  static unsigned long lastTimeUpdate = 0;
  if (millis() - lastTimeUpdate >= 1000) {
    lastTimeUpdate = millis();
    timeClient.update(); // 内部会按60秒间隔请求NTP
  }

  checkAlarm();

  if (alarmActive) {
    if (millis() - alarmStartTime >= alarmDuration) {
      alarmActive = false;
      digitalWrite(BUZZER_PIN, LOW);
    }
  } else {
    static unsigned long lastDisplay = 0;
    if (millis() - lastDisplay > 1000) {
      lastDisplay = millis();
      int h = timeClient.getHours();
      int m = timeClient.getMinutes();
      displayTime(h, m);
    }
  }

  delay(10);
}
  • 维护MQTT连接。
  • 每秒尝试更新NTP时间(实际按设定间隔请求,此处只是更新内部状态)。
  • 检查闹钟。
  • 如果闹钟激活,判断是否超过5秒,若是则关闭蜂鸣器;否则每秒更新一次时间显示。

五、使用与测试

1. 修改配置并上传

  • 将代码中的WiFi名称、密码、巴法云主题名替换为自己的。
  • 选择正确的ESP32开发板(如“ESP32 Dev Module”)和端口,点击上传。

2. 观察串口输出

打开串口监视器(115200),看到如下信息表示成功:

Connecting to Chinanet-2.4G-6E80...
WiFi connected
IP address: 192.168.x.x
Attempting MQTT connection...connected

3. 巴法云发送消息

  • 在巴法云控制台,找到您创建的主题,进入“调试”页面。
  • 发送 14:30:00 设置闹钟(注意英文冒号)。
  • 发送任意文字(如 Hello)测试显示。

4. 闹钟测试

  • 查看当前时间,设置一个比当前时间晚10秒的闹钟,例如当前为 12:34:20,则发送 12:34:30
  • 到达设定时间时,蜂鸣器响,屏幕显示 Alarm!,5秒后自动停止。

5. 验证显示

  • 平时屏幕应显示当前时间(时:分),如 12:34
  • 收到消息后会短暂显示消息内容,然后恢复时间。

六、常见问题与扩展

1. 蜂鸣器不响

  • 检查接线,确保蜂鸣器为有源型(通电即响)。
  • 用简单代码测试:digitalWrite(13, HIGH); 看是否发声。
  • 尝试更换GPIO引脚。

2. 点阵屏无显示或显示异常

  • 检查5V供电是否足够。
  • 尝试调整亮度:在 setup() 中添加 u8g2.setContrast(150);
  • 确认引脚定义正确,CS引脚必须接对。

3. 闹钟每天只触发一次

当前版本每次匹配时分秒都会触发(例如每分钟的同一秒都会触发)。若要改为每天一次,需加入日期判断。修改 checkAlarm() 如下:

#include <time.h>   // 文件开头添加

void checkAlarm() {
  if (!alarmTime.enabled) return;
  int nowHour = timeClient.getHours();
  int nowMinute = timeClient.getMinutes();
  int nowSecond = timeClient.getSeconds();

  time_t epoch = timeClient.getEpochTime();
  struct tm *ptm = localtime(&epoch);
  int currentDate = (ptm->tm_year + 1900) * 10000 + (ptm->tm_mon + 1) * 100 + ptm->tm_mday;

  if (nowHour == alarmTime.hour && nowMinute == alarmTime.minute && nowSecond == alarmTime.second) {
    if (currentDate != lastTriggerDay) {
      triggerAlarm();
      lastTriggerDay = currentDate;
    }
  }
}

同时,在 callback 中重置 lastTriggerDay = -1;

4. 增加多个闹钟

可以将 alarmTime 改为数组,例如 AlarmTime alarms[5];,然后循环检查。

5. 断网后备

如果WiFi断开,时间将停止更新。可考虑加入DS1302作为备份,或增加错误提示。


七、完整代码附录

// 此处粘贴用户提供的最终成功代码,注意提醒用户修改WiFi信息
#include <WiFi.h>
#include <PubSubClient.h>
#include <U8g2lib.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

// ========== WiFi 配置 ==========
const char* ssid = "xx-2.4G-6E80";
const char* password = "xxx";

// ========== 巴法云 MQTT 配置 ==========
const char* mqtt_server = "bemfa.com";
const int mqtt_port = 9501;
const char* mqtt_topic = "xxxx";   // 巴法云主题
const char* mqtt_client_id = "xxxx";

WiFiClient espClient;
PubSubClient client(espClient);

// ========== NTP 时间配置 ==========
WiFiUDP ntpUDP;
// 使用国内 NTP 服务器(pool.ntp.org 也可),时区为东八区(UTC+8)
NTPClient timeClient(ntpUDP, "cn.pool.ntp.org", 8 * 3600, 60000); // 更新间隔60秒

// ========== MAX7219 点阵屏 (8x32) ==========
#define MATRIX_CLK 18
#define MATRIX_DIN 23
#define MATRIX_CS  15
U8G2_MAX7219_32X8_F_4W_SW_SPI u8g2(U8G2_R0, MATRIX_CLK, MATRIX_DIN, MATRIX_CS, U8X8_PIN_NONE, U8X8_PIN_NONE);

// ========== 有源蜂鸣器 ==========
#define BUZZER_PIN 13

// ========== 闹钟数据结构 ==========
struct AlarmTime {
  uint8_t hour;
  uint8_t minute;
  uint8_t second;
  bool enabled;
} alarmTime = {0, 0, 0, false};

// 上次触发闹钟的日期(用于避免一天内重复触发)
int lastTriggerDay = -1; // -1 表示从未触发

// 闹钟激活状态
bool alarmActive = false;
unsigned long alarmStartTime = 0;
const unsigned long alarmDuration = 5000; // 鸣响5秒

// ========== 函数声明 ==========
void setup_wifi();
void reconnect();
void callback(char* topic, byte* payload, unsigned int length);
void checkAlarm();
void triggerAlarm();
void displayTime(int hour, int minute);
void displayMessage(const char* msg);

// ========== 初始化 ==========
void setup() {
  Serial.begin(115200);
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, LOW);

  // 初始化点阵屏
  u8g2.begin();
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB08_tr);
  u8g2.drawStr(0, 8, "Init");
  u8g2.sendBuffer();

  // 连接 WiFi
  setup_wifi();

  // 初始化 NTP 客户端
  timeClient.begin();

  // 设置 MQTT
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}

// ========== 主循环 ==========
void loop() {
  // 保持 MQTT 连接
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // 更新时间(每秒检查一次)
  static unsigned long lastTimeUpdate = 0;
  if (millis() - lastTimeUpdate >= 1000) {
    lastTimeUpdate = millis();
    timeClient.update(); // 从 NTP 服务器获取最新时间(实际内部会按设定间隔请求,不会每秒都发请求)
  }

  // 检查闹钟
  checkAlarm();

  // 闹钟激活时持续显示报警信息
  if (alarmActive) {
    if (millis() - alarmStartTime >= alarmDuration) {
      alarmActive = false;
      digitalWrite(BUZZER_PIN, LOW);
    }
  } else {
    // 非闹钟状态,每秒刷新一次时间显示
    static unsigned long lastDisplay = 0;
    if (millis() - lastDisplay > 1000) {
      lastDisplay = millis();
      int h = timeClient.getHours();
      int m = timeClient.getMinutes();
      displayTime(h, m);
    }
  }

  delay(10);
}

// ========== WiFi 连接 ==========
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

// ========== MQTT 重连 ==========
void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect(mqtt_client_id)) {
      Serial.println("connected");
      client.subscribe(mqtt_topic);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

// ========== MQTT 消息回调 ==========
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  String message;
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }
  Serial.println(message);

  // 解析时间设置 HH:MM:SS
  if (length == 8) { // 如 "14:30:00"
    int h, m, s;
    if (sscanf(message.c_str(), "%d:%d:%d", &h, &m, &s) == 3) {
      if (h >= 0 && h < 24 && m >= 0 && m < 60 && s >= 0 && s < 60) {
        alarmTime.hour = h;
        alarmTime.minute = m;
        alarmTime.second = s;
        alarmTime.enabled = true;
        // 重置触发日期,使新闹钟当天有效
        lastTriggerDay = -1;
        Serial.println("Alarm set successfully");
        // 显示设定时间(只显示小时:分钟,避免超宽)
        char timeStr[6];
        sprintf(timeStr, "%02d:%02d", h, m);
        displayMessage(timeStr);
      }
    }
  } else {
    // 其他消息直接显示
    displayMessage(message.c_str());
  }
}

// ========== 闹钟检查 ==========
void checkAlarm() {
  if (!alarmTime.enabled) return;

  int nowHour = timeClient.getHours();
  int nowMinute = timeClient.getMinutes();
  int nowSecond = timeClient.getSeconds();
  int nowDay = timeClient.getDay(); // 注意:getDay() 返回星期几(0-6),不适合作为日期判断
  // 改用日期判断需要更复杂,这里简单用“当天”的概念:我们记录触发时的“日”为 lastTriggerDay,
  // 但 NTPClient 不直接提供年月日,需要自己从 epoch 解析。为简化,我们可以使用一个布尔标志
  // 表示当天是否已经触发过,并每天重置。这里采用简单方法:每次触发后设置一个标志,并在每天午夜重置。
  // 但为了快速演示,我们暂时取消一天一次的限制,改为每次匹配都触发(测试用)。
  // 如果您希望每天只触发一次,需要获取当前日期(年/月/日),可以修改 NTPClient 获取完整时间。
  // 为简化,我们先让每次匹配都触发(方便测试),正式使用时可改进。

  // 简单起见,这里每次匹配都触发(如果不想重复,可以加上日期判断)
  if (nowHour == alarmTime.hour && nowMinute == alarmTime.minute && nowSecond == alarmTime.second) {
    // 取消一天一次的限制(注释掉)
    // if (lastTriggerDay != timeClient.getDay()) { // 用星期几判断不准确
    triggerAlarm();
    // lastTriggerDay = timeClient.getDay(); // 不准确,仅作示例
    // }
  }
}

// ========== 触发闹钟 ==========
void triggerAlarm() {
  Serial.println("ALARM TRIGGERED!");
  alarmActive = true;
  alarmStartTime = millis();
  digitalWrite(BUZZER_PIN, HIGH);
  displayMessage("Alarm!");
}

// ========== 显示时间(时:分) ==========
void displayTime(int hour, int minute) {
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB08_tr);
    char timeStr[6];
    sprintf(timeStr, "%02d:%02d", hour, minute);
    u8g2.drawStr(0, 8, timeStr);
  } while (u8g2.nextPage());
}

// ========== 显示任意消息(截断为最多6字符) ==========
void displayMessage(const char* msg) {
  char shortMsg[7]; // 6字符 + 结束符
  strncpy(shortMsg, msg, 6);
  shortMsg[6] = '\0';

  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB08_tr);
    u8g2.drawStr(0, 8, shortMsg);
  } while (u8g2.nextPage());
}

提醒:请将代码中的WiFi名称、密码和MQTT主题替换为您自己的信息。


通过本教案,您不仅实现了一个实用的网络闹钟,还学习了ESP32的WiFi、MQTT、NTP以及点阵屏的使用。您可以根据需要自由扩展功能,享受创造的乐趣!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-02 19:32:11 HTTP/2.0 GET : https://a.sjds.net/a/479389.html
  2. 运行时间 : 0.109844s [ 吞吐率:9.10req/s ] 内存消耗:4,568.99kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=c69e8e9b1a7cebc31df98c18e7981967
  1. /yingpanguazai/ssd/ssd1/www/a.sjds.net/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/a.sjds.net/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/a.sjds.net/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/a.sjds.net/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/a.sjds.net/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/a.sjds.net/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/a.sjds.net/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/a.sjds.net/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/a.sjds.net/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/a.sjds.net/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/a.sjds.net/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/a.sjds.net/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/a.sjds.net/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/a.sjds.net/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/a.sjds.net/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/a.sjds.net/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/a.sjds.net/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/a.sjds.net/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/a.sjds.net/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/a.sjds.net/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/a.sjds.net/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/a.sjds.net/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/a.sjds.net/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/a.sjds.net/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/a.sjds.net/runtime/temp/97cad012e8e159aae2fe347a411e8351.php ( 12.06 KB )
  140. /yingpanguazai/ssd/ssd1/www/a.sjds.net/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000606s ] mysql:host=127.0.0.1;port=3306;dbname=a_sjds;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000808s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.008313s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000299s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000567s ]
  6. SELECT * FROM `set` [ RunTime:0.000747s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000594s ]
  8. SELECT * FROM `article` WHERE `id` = 479389 LIMIT 1 [ RunTime:0.001140s ]
  9. UPDATE `article` SET `lasttime` = 1777721531 WHERE `id` = 479389 [ RunTime:0.007206s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000290s ]
  11. SELECT * FROM `article` WHERE `id` < 479389 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000481s ]
  12. SELECT * FROM `article` WHERE `id` > 479389 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001125s ]
  13. SELECT * FROM `article` WHERE `id` < 479389 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003562s ]
  14. SELECT * FROM `article` WHERE `id` < 479389 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000799s ]
  15. SELECT * FROM `article` WHERE `id` < 479389 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000836s ]
0.111455s