当前位置:首页>教案>教学教案-ESP-NOW协议-双机无线指示灯

教学教案-ESP-NOW协议-双机无线指示灯

  • 2026-04-20 19:00:57
教学教案-ESP-NOW协议-双机无线指示灯

🎯 课程信息

接收端
发送端

项目

内容

课程时长

90-120分钟

教学目标

理解GPIO控制 + 掌握ESP-NOW无线通信

硬件准备

2块ESP32、1个按键、1个RGB LED、杜邦线若干

难度等级

⭐⭐ 入门基础


📋 教学流程总览

第1部分:硬件连接讲解(15分钟)第2部分:接收端代码编写(35分钟)第3部分:发送端代码编写(35分钟)第4部分:联调测试与拓展(15-20分钟)

第一部分:硬件连接讲解(15分钟)

🔌 接线图讲解

【边画边讲】 在白板/屏幕上画出接线示意图:

 💡 关键讲解点

讲师话术:"大家注意,这就是ESP-NOW协议的神奇之处——两块开发板之间不需要任何物理连线,它们通过2.4GHz WiFi频段直接通信,就像两台对讲机。"

RGB LED共阴极说明

  • 共阴极 = 长脚(GND)接GND,其他三脚接GPIO(高电平亮)
  • 共阳极 = 长脚(VCC)接3.3V,其他三脚接GPIO(低电平亮)

第二部分:接收端代码编写(35分钟)

步骤1:引入库文件(5分钟)

【边写边讲】

/* * ESP32无线指示灯 - 接收端 * 功能:接收ESP-NOW数据,控制RGB LED显示 * 硬件:ESP32 + RGB LED */#include <WiFi.h>      // 【讲解】WiFi库,ESP-NOW依赖WiFi硬件#include <esp_now.h>   // 【讲解】ESP-NOW协议核心库

讲师话术:"esp_now.h 是乐鑫官方提供的库,ESP32出厂自带,不需要额外安装。ESP-NOW是乐鑫开发的无连接通信协议,比WiFi/蓝牙更简单快速。"


步骤2:引脚定义与数据结构(5分钟)

【边写边讲】

// ========== 引脚定义 ==========// 【讲解】使用宏定义,方便后期修改,代码可读性更好#define LED_R 18    // 红色引脚 → GPIO18#define LED_G 19    // 绿色引脚 → GPIO19  #define LED_B 21    // 蓝色引脚 → GPIO21// ========== 数据结构 ==========// 【讲解】struct = 结构体,把多个数据打包成一个"包裹"// 【类比】就像快递包裹,里面可以同时装"颜色"和"亮度"两件东西typedef struct {  int colorCode;     // 颜色指令:1=红, 2=绿, 3=蓝, 4=关, 5=呼吸  int brightness;    // 亮度值:0-255(PWM占空比)} Message;Message incomingMsg;  // 【讲解】创建一个变量,用来存收到的"包裹"

讲师话术:"typedef 是给结构体起别名。Message 现在就是一种自定义数据类型,就像intfloat一样,后面可以直接用。"


步骤3:接收回调函数(10分钟) 重点

【边写边讲】

// ========== 接收回调 ==========// 【讲解】回调函数 = "中断处理函数",数据到达时自动触发,不需要手动调用// 【类比】就像门铃响了,你不用一直盯着门,听到铃声去开门就行void onDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {  // 【讲解】memcpy = memory copy,把收到的字节流复制到我们的结构体变量中  memcpy(&incomingMsg, incomingData, sizeof(incomingMsg));  // ========== 调试输出(串口监视器查看)==========  Serial.println("\n--- 收到新指令 ---");  // 【讲解】MAC地址是设备的"身份证号",6个字节,这里格式化打印  Serial.print("来自MAC: ");  for (int i = 0; i < 6; i++) {    Serial.printf("%02X", mac[i]);  // %02X = 两位十六进制,不足补0    if (i < 5) Serial.print(":");   // 每两个字节用冒号分隔  }  Serial.println();  // 【讲解】打印收到的具体数据,方便调试  Serial.print("颜色代码: ");  Serial.println(incomingMsg.colorCode);  Serial.print("亮度: ");  Serial.println(incomingMsg.brightness);  // 【讲解】调用执行函数,真正控制LED  executeCommand(incomingMsg.colorCode, incomingMsg.brightness);}

讲师话术:"注意这个函数的三个参数mac是发送方的地址,incomingData是收到的原始字节数据,len是数据长度。这是ESP-NOW库规定的固定格式。"


步骤4:指令执行函数(8分钟)

【边写边讲】

// ========== 执行指令 ==========void executeCommand(int code, int brightness) {  // 【讲解】安全第一步:先关灯,避免颜色混合  analogWrite(LED_R, 0);  analogWrite(LED_G, 0);  analogWrite(LED_B, 0);  // 【讲解】constrain = 限制范围,确保亮度在0-255之间,防止溢出  int duty = constrain(brightness, 0, 255);  // 【讲解】switch-case 多分支选择,比if-else更清晰  switch(code) {    case 1: // 红色      analogWrite(LED_R, duty);      Serial.println("执行:红色");      break;    case 2: // 绿色      analogWrite(LED_G, duty);      Serial.println("执行:绿色");      break;    case 3: // 蓝色      analogWrite(LED_B, duty);      Serial.println("执行:蓝色");      break;    case 4: // 关闭      // 已经全关了,什么都不做      Serial.println("执行:关闭");      break;    case 5: // 呼吸效果(拓展功能)      breatheMode();      break;    default: // 【讲解】默认情况,收到未知指令时亮白光      analogWrite(LED_R, duty);      analogWrite(LED_G, duty);      analogWrite(LED_B, duty);      Serial.println("执行:白色");      break;  }}// 【讲解】呼吸灯效果 = PWM占空比从0到255再到0,循环变化void breatheMode() {  Serial.println("执行:呼吸灯");  for (int i = 0; i < 3; i++) {  // 呼吸3次    // 逐渐变亮    for (int duty = 0; duty <= 255; duty += 5) {      analogWrite(LED_R, duty);      delay(10);  // 延时10ms,控制变化速度    }    // 逐渐变暗    for (int duty = 255; duty >= 0; duty -= 5) {      analogWrite(LED_R, duty);      delay(10);    }  }}

讲师话术:"analogWrite 在ESP32上是PWM输出,不是真正的模拟信号。ESP32的PWM频率默认1kHz,占空比0-255对应0%-100%。"


步骤5:初始化与主循环(7分钟)

【边写边讲】

// ========== 初始化 ==========void setup() {  // 【讲解】串口初始化,波特率115200是ESP32常用值  Serial.begin(115200);  Serial.println("\n=== ESP32无线指示灯接收端启动 ===");  // ========== GPIO初始化 ==========  pinMode(LED_R, OUTPUT);  pinMode(LED_G, OUTPUT);  pinMode(LED_B, OUTPUT);  // 【讲解】开机自检:红→绿→蓝依次亮起,确认硬件正常  analogWrite(LED_R, 255); delay(300); analogWrite(LED_R, 0);  analogWrite(LED_G, 255); delay(300); analogWrite(LED_G, 0);  analogWrite(LED_B, 255); delay(300); analogWrite(LED_B, 0);  // ========== WiFi初始化(必须步骤)==========  // 【讲解】ESP-NOW基于WiFi硬件,必须先启动WiFi  WiFi.mode(WIFI_STA);  // 设置为Station模式(客户端模式)  // 【重点】打印MAC地址!发送端需要这个地址才能定向发送  Serial.print("本机MAC地址(请记录): ");  Serial.println(WiFi.macAddress());  // ========== ESP-NOW初始化 ==========  if (esp_now_init() != ESP_OK) {  // ESP_OK = 0,表示成功    Serial.println("ESP-NOW初始化失败!");    return;  // 失败则退出setup  }  // 【关键】注册接收回调函数,告诉系统"收到数据时调用onDataRecv"  esp_now_register_recv_cb(onDataRecv);  Serial.println("接收端准备就绪,等待指令...");}void loop() {  // 【讲解】主循环空闲!所有工作都在中断回调中完成  // 这种设计叫"事件驱动",比轮询更高效  // 可以在这里添加其他功能,如读取传感器  delay(100);  // 防止看门狗复位}

讲师话术:"重点来了! 烧录这段代码后,立刻打开串口监视器,复制显示的MAC地址,比如84:1F:E8:26:85:8C,这是接收端的"门牌号",发送端必须知道它才能寄"包裹"。"


第三部分:发送端代码编写(35分钟)

步骤1:库文件与宏定义(5分钟)

【边写边讲】

/* * ESP32无线指示灯 - 发送端(无线遥控器) * 功能:检测按键,发送指令控制接收端LED * 【注意】使用前需修改下面的MAC地址为实际接收端地址! */#include <WiFi.h>#include <esp_now.h>// ========== 引脚定义 ==========#define BUTTON_PIN 4    // 按键接GPIO4,使用内部上拉#define LED_R 18        // 本地红色LED(可选,用于反馈)#define LED_G 19        // 本地绿色LED#define LED_B 21        // 本地蓝色LED// ========== 接收端MAC地址【必须修改!】==========// 【讲解】把刚才记录的接收端MAC地址填在这里,格式:0xXX, 0xXX...uint8_t receiverAddress[] = {0x84, 0x1F, 0xE8, 0x26, 0x85, 0x8C};// 【提示】如果不知道MAC地址,可以先烧录接收端代码查看

讲师话术:"uint8_t 是无符号8位整数,范围0-255,正好存一个字节。MAC地址6个字节,所以用数组存储。"


步骤2:数据结构定义(3分钟)

【边写边讲】

// ========== 数据结构 ==========// 【讲解】必须与接收端定义完全一致!这是双方的"共同语言"typedef struct {  int colorCode;      // 1=红, 2=绿, 3=蓝, 4=关  int brightness;     // 亮度0-255} Message;Message msg;  // 发送消息的数据容器// ========== 按键变量(用于消抖和手势识别)==========unsigned long lastDebounceTime = 0;   // 上次状态变化时间const unsigned long debounceDelay = 50;  // 消抖延时50msint lastButtonState = HIGH;  // 上一次的按键状态(上拉默认高电平)int buttonState = HIGH;      // 当前按键状态int clickCount = 0;          // 单击计数(用于双击检测)unsigned long firstClickTime = 0;  // 第一次单击时间unsigned long pressStartTime = 0;  // 按下开始时间bool isLongPress = false;    // 长按标志

讲师话术:"这些变量用于按键消抖手势识别。机械按键按下时会有抖动,如果不处理,单片机会认为你按了多次。"


步骤3:Setup初始化(10分钟) 重点

【边写边讲】

void setup() {  Serial.begin(115200);  Serial.println("\n=== ESP32无线遥控器启动 ===");  // ========== GPIO初始化 ==========  pinMode(BUTTON_PIN, INPUT_PULLUP);  // 内部上拉,按键另一端接GND  pinMode(LED_R, OUTPUT);  pinMode(LED_G, OUTPUT);  pinMode(LED_B, OUTPUT);  setRGB(0, 0, 0);  // 初始关闭本地LED  // ========== WiFi初始化(关键步骤)==========  WiFi.mode(WIFI_STA);  WiFi.disconnect();  // 【重要】清除之前的WiFi连接状态  delay(100);         // 等待WiFi硬件就绪  // 打印地址信息,方便调试  Serial.print("本机MAC: ");  Serial.println(WiFi.macAddress());  Serial.print("目标MAC: ");  for(int i=0; i<6; i++) {    Serial.printf("%02X", receiverAddress[i]);    if(i<5) Serial.print(":");  }  Serial.println();  // ========== ESP-NOW初始化 ==========  if (esp_now_init() != ESP_OK) {    Serial.println("ESP-NOW初始化失败!");    return;  }  // ========== 添加对等节点(配对)==========  // 【重点】这是发送端特有的步骤,相当于"把对方的地址存入通讯录"  esp_now_peer_info_t peerInfo;  // 定义结构体变量  // 【关键】先用memset清空结构体,避免垃圾数据干扰  memset(&peerInfo, 0, sizeof(peerInfo));  // 填充对方信息  memcpy(peerInfo.peer_addr, receiverAddress, 6);  // 复制MAC地址  peerInfo.channel = 0;           // 信道0 = 当前WiFi信道  peerInfo.encrypt = false;       // 不加密(入门简单起见)  peerInfo.ifidx = WIFI_IF_STA;   // 【关键】使用STA接口  // 添加到ESP-NOW的"通讯录"  if (esp_now_add_peer(&peerInfo) != ESP_OK) {    Serial.println("添加接收端失败!");    return;  }  Serial.println("ESP-NOW初始化成功!");  // 开机自检  selfTest();  Serial.println("等待按键...");}

讲师话术:"esp_now_peer_info_t 是ESP-NOW的对等节点信息结构体,必须正确填写。ifidx = WIFI_IF_STA 是常见错误点,如果不指定接口,可能导致发送失败!"


步骤4:主循环与按键处理(12分钟)

【边写边讲】

// ========== 主循环 ==========void loop() {  handleButton();  // 持续检测按键}// ========== 按键处理(支持单击/双击/长按)==========void handleButton() {  int reading = digitalRead(BUTTON_PIN);  // ========== 步骤1:消抖处理 ==========  // 【讲解】如果状态变了,记录时间  if (reading != lastButtonState) {    lastDebounceTime = millis();  // millis()返回开机后的毫秒数  }  // 【讲解】只有状态稳定超过50ms,才认为是有效变化  if ((millis() - lastDebounceTime) > debounceDelay) {    // 状态确实改变了    if (reading != buttonState) {      buttonState = reading;      if (buttonState == LOW) {  // 【按下】        pressStartTime = millis();        isLongPress = false;        // 此时不立即处理,等待释放或超时      } else {  // 【释放】        unsigned long duration = millis() - pressStartTime;        if (duration > 1000) {  // 按下超过1秒 = 长按          isLongPress = true;          handleLongPress();        } else {  // 短按          clickCount++;          if (clickCount == 1) {            firstClickTime = millis();  // 记录第一次单击时间          }        }      }    }  }  // ========== 步骤2:双击检测 ==========  // 【讲解】300ms内没有第二次单击,就判定为单击  if (clickCount > 0 && (millis() - firstClickTime) > 300) {    if (clickCount == 1) {      handleSingleClick();    } else if (clickCount >= 2) {      handleDoubleClick();    }    clickCount = 0;  // 重置计数器  }  lastButtonState = reading;  // 保存当前状态供下次比较}// ========== 操作处理函数 ==========void handleSingleClick() {  Serial.println("【单击】发送红色");  msg.colorCode = 1;  msg.brightness = 255;  sendMessage();  setRGB(255, 0, 0);  // 本地LED也亮红,给用户反馈}void handleDoubleClick() {  Serial.println("【双击】发送绿色");  msg.colorCode = 2;  msg.brightness = 255;  sendMessage();  setRGB(0, 255, 0);}void handleLongPress() {  Serial.println("【长按】发送蓝色");  msg.colorCode = 3;  msg.brightness = 255;  sendMessage();  setRGB(0, 0, 255);}

讲师话术:"这个按键逻辑实现了一个按键三种操作,是嵌入式开发的经典模式。记住:单击红、双击绿、长按蓝。"


步骤5:发送函数与工具函数(5分钟)

【边写边讲】

// ========== 发送函数 ==========void sendMessage() {  // 【讲解】esp_now_send是核心函数,参数:目标地址、数据指针、数据长度  esp_err_t result = esp_now_send(    receiverAddress,           // 目标MAC地址    (uint8_t *)&msg,           // 强制转换为字节指针    sizeof(msg)                // 数据大小(字节数)  );  // 检查发送结果  if (result == ESP_OK) {    Serial.println("✓ 发送成功");  } else {    Serial.print("✗ 发送失败,错误码: ");    Serial.println(result);    // 常见错误:0x1234=未找到对方, 0x1235=未初始化  }}// ========== LED控制工具函数 ==========// 【讲解】共阴极LED:HIGH=亮,LOW=灭void setRGB(int r, int g, int b) {  digitalWrite(LED_R, r > 0 ? HIGH : LOW);  digitalWrite(LED_G, g > 0 ? HIGH : LOW);  digitalWrite(LED_B, b > 0 ? HIGH : LOW);}// ========== 开机自检 ==========void selfTest() {  Serial.println("自检中...");  setRGB(255, 0, 0); delay(200);  // 红  setRGB(0, 255, 0); delay(200);  // 绿  setRGB(0, 0, 255); delay(200);  // 蓝  setRGB(0, 0, 0);                // 灭  Serial.println("自检完成");}

第四部分:联调测试与拓展(15-20分钟)

🧪 测试流程

步骤

操作

预期结果

1

烧录接收端,打开串口监视器

显示MAC地址,LED红绿蓝自检

2

记录MAC地址,填入发送端代码

修改receiverAddress[]数组

3

烧录发送端,打开串口监视器

显示"初始化成功",LED自检

4

单击发送端按键

接收端亮红灯,双方串口显示成功

5

双击发送端按键(300ms内)

接收端亮绿灯

6

长按发送端按键(>1秒)

接收端亮蓝灯

7

观察发送端本地LED

与接收端同步变色(反馈作用)

🔧 常见问题排查

❌ 问题1:发送失败,错误码显示   → 检查MAC地址是否填错   → 检查接收端是否已上电   → 检查两块板子距离是否太远(<10米内测试)❌ 问题2:接收端收到数据但LED不亮   → 检查LED是共阴极还是共阳极(代码默认共阴极)   → 检查GPIO引脚号是否与实际接线一致❌ 问题3:按键不灵敏或误触发   → 调整debounceDelay(50ms可能需增大)   → 检查按键焊接或接触是否良好

🚀 拓展思考(布置作业)

  1. 协议拓展
    :修改结构体,增加int duration字段,实现"亮5秒后自动关闭"
  2. 多对一
    :3个发送端控制1个接收端(ESP-NOW支持最多20个对等节点)
  3. 一对多
    :1个发送端控制多个接收端(循环发送给不同MAC地址)
  4. 传感器联动
    :发送端增加光敏电阻,实现"光线暗自动开灯"

📊 教学总结板书

┌────────────────────────────────────────┐│         ESP-NOW 通信模型               ││                                  ││   发送端 ───────→ 接收端            ││   (遥控器)        (指示灯)             ││                                  ││   ① 定义相同的数据结构("协议")             ││   ② 发送端添加peer("通讯录")              ││   ③ 接收端注册回调("门铃")               ││   ④ 发送端esp_now_send("寄快递")           ││   ⑤ 接收端自动触发onDataRecv("收件")         ││                                   ││   【核心】无连接 = 不需要WiFi路由器           ││   【特点】低延迟(<10ms)、低功耗           │└────────────────────────────────────────┘

📝 课后资料

推荐文档

  • ESP-NOW官方指南:https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html
  • Arduino-ESP32库文档:https://github.com/espressif/arduino-esp32

代码仓库:建议学生将代码上传GitHub,养成版本控制习惯。

本文标签#科创编程 #物联网 #教案 #编程思维 #电子爱好者 #少儿编程


公众号
视频号
关注我们,方便学习和答疑

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-01 20:58:38 HTTP/2.0 GET : https://a.sjds.net/a/480175.html
  2. 运行时间 : 0.110912s [ 吞吐率:9.02req/s ] 内存消耗:4,680.33kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=655576f74515f97ca8fc01b66be5c2d9
  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.000385s ] mysql:host=127.0.0.1;port=3306;dbname=a_sjds;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000553s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000285s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000264s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000478s ]
  6. SELECT * FROM `set` [ RunTime:0.000198s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000520s ]
  8. SELECT * FROM `article` WHERE `id` = 480175 LIMIT 1 [ RunTime:0.002597s ]
  9. UPDATE `article` SET `lasttime` = 1777640318 WHERE `id` = 480175 [ RunTime:0.015890s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.003041s ]
  11. SELECT * FROM `article` WHERE `id` < 480175 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.002618s ]
  12. SELECT * FROM `article` WHERE `id` > 480175 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.004348s ]
  13. SELECT * FROM `article` WHERE `id` < 480175 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003272s ]
  14. SELECT * FROM `article` WHERE `id` < 480175 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000733s ]
  15. SELECT * FROM `article` WHERE `id` < 480175 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.009476s ]
0.112696s