ndfweb.cn

ESP32-CAM 故障排除指南:修复的最常见问题


2021-08-28 11:00:25 (50455)


在使用ESP32-CAM发布了一些项目后,一些读者在尝试使用 ESP32-CAM 时报告了问题。本指南汇总了使用 ESP32-CAM 时最常见的错误以及如何修复它们。

ESP32-CAM 故障排除指南:修复的最常见问题

我们使用ESP32-CAM发布了以下项目

注意:我们的一些读者在尝试使用 Home Assistant关注ESP32-CAM 项目时报告了错误我们修改了代码中的一些行,因此与该项目相关的大部分问题都应该得到修复。

请注意,我们最终无法重现某些错误。但是,我们已经收集了读者提供的所有信息,以获得最常见问题的答案。

如果您对这些问题有不同的问题或不同的解决方案,可以通过在下面发表评论来分享您的提示。

最常见的错误:

  1. 连接 ESP32 失败:等待数据包头超时

  2. 相机初始化失败,错误 0x20001 或类似错误

  3. 掉电检测器或 Guru 冥想错误

  4. Sketch too big error – 选择了错误的分区方案

  5. COMX 上的板不可用 - 未选择 COM 端口

  6. Psram 错误:未安装 GPIO isr 服务

  7. Wi-Fi 信号弱

  8. Arduino IDE 串行监视器中没有 IP 地址

  9. 无法打开网络服务器

  10. 图像滞后/显示大量延迟

  11. esp_camera_fb_get(): 无法按时取帧!

1. 连接ESP32失败:等待包头超时

ESP32-CAM 连接 ESP32 失败:等待包头超时

此错误表示 ESP32-CAM 未处于闪烁模式或未正确连接到 FTDI 编程器。

仔细检查上传代码的步骤

仔细检查您是否已按照将 ESP32-CAM 置于闪烁模式的确切步骤进行操作。未能完成其中一个步骤可能会导致该错误。以下是您需要遵循的步骤:

使用 FTDI 编程器将 ESP32-CAM 板连接到您的计算机。按照下一个示意图:

重要提示: GPIO 0需要连接到GND,以便您能够上传代码。

许多 FTDI 编程器都有一个跳线,可以让您选择 3.3V 或 5V。确保跳线在正确的位置以选择 5V。

重要提示:  GPIO 0 需要连接到 GND,以便您能够上传代码。

ESP32-CAMFTDI 程序员
地线地线
5VVCC (5V)
U0RTX
U0T接收
通用输入输出口 0地线

要上传代码,请按照以下步骤操作:

1) 前往 工具 > 开发 板 并选择 AI-Thinker ESP32-CAM

2) 进入 工具 端口 ,选择 ESP32 连接的 COM 端口。

3) 然后,点击上传按钮上传代码。

4) 当您开始在调试窗口看到这些点时,如下图所示,按下 ESP32-CAM 板载 RST 按钮。

几秒钟后,代码应该会成功上传到您的开发板。

GPIO 0 必须连接到 GND

重要提示:如果您无法上传代码,请仔细检查GPIO 0是否已连接到GND,并且您在“工具”菜单中选择了正确的设置您还应该按下板载重置按钮以在闪烁模式下重新启动 ESP32。另外,检查您是否将 FTDI 编程器跳线帽设置为 5V。

检查您正在使用的 FTDI 编程器

我们的一位读者报告了以下内容:“发现您可以使用 USB-to-TTL 模块模型 CP2102 对电路板进行编程,而 CH340 模型不起作用”。这是我们正在使用的 FTDI 程序员

用 5V 为 ESP32-CAM 供电

我们的一些读者报告说,他们只能在 ESP32 由 5V 供电时上传代码。因此,用 5V 为 ESP32-CAM 供电。

FTDI 编程器 5V

使用万用表测量FTDI 编程器(VCC 和 GND)的输出电压,以确保它为 ESP32-CAM 提供 5V 电压。

FTDI 编程器输出 5V 万用表

2. 相机初始化失败,错误 0x20001 或类似错误

ESP32-CAM 相机初始化失败,错误 0x20001 或类似错误

如果您收到此确切错误,则意味着您的相机 OVX 未正确连接到您的 ESP32 开发板,或者您在代码中的引脚分配错误。

有时,多次拔插 FTDI 编程器或多次重新启动板,可能会解决问题。

相机未正确连接

相机有一个很小的连接器,您必须确保它立即连接并牢固安装,否则将无法建立连接。

代码中的引脚分配错误

当您收到此错误时,也可能意味着您没有在定义部分选择正确的电路板,或者您的电路板的引脚定义错误。

确保在项目中选择正确的相机模块。您只需要取消注释正确的相机模块并注释所有其他模块:

//#define CAMERA_MODEL_WROVER_KIT//#define CAMERA_MODEL_M5STACK_PSRAM#define CAMERA_MODEL_AI_THINKER

在这个例子中,我们使用了 CAMERA_MODEL_AI_THINKER,所以它是启用的。否则,引脚分配将失败,相机将无法初始化。

有很多 esp32-cam 板(“假板”)被发布,ESP32 和 OV 相机之间的接线可能不同,因此选择相机模块可能还不够。您可能需要使用您的电路板引脚排列检查每个 gpio 声明。

例如,不带PSRAM 的M5Stack 板与带PSRAM的 M5STACK (默认在代码中定义)具有不同的引脚分配因此,您需要根据电路板引脚排列更改代码中的引脚定义。

通过 USB 电源供电不足

如果您通过计算机上的 USB 端口为 ESP32 供电,则它可能无法提供足够的电力。

错误的 FTDI 程序员

一些读者还报告了这个问题被更换自己的实际FTDI程序员解决了这一个

相机/连接器坏了

如果出现此错误,也可能意味着您的相机或相机色带已损坏。如果是这种情况,您可能会得到一个新的 OV2640 摄像头探头。

3. 掉电检测器或 Guru 冥想错误

当您打开 Arduino IDE 串行监视器并且不断地一遍又一遍地打印错误消息“已触发断电检测器”时。这意味着存在某种硬件问题。

它通常与以下问题之一有关:

  • 劣质 USB 数据线;

  • USB 线太长;

  • 板子有缺陷(焊点不好);

  • 电脑USB口坏;

  • 或者电脑USB口供电不足。

解决方案: 

  • 尝试不同的较短的 USB 电缆(带数据线)

  • 使用不同的计算机 USB 端口或使用带有外部电源的 USB 集线器

  • 一些读者报告说,当用 5V 为 ESP32-CAM 供电时,问题得到了解决。

此外,请遵循问题 2 中描述的建议。

4. Sketch too big error – 选择了错误的分区方案

ESP32-CAM Sketch too big error 选择了错误的分区方案

当您收到以下错误时:

Sketch too big; see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing it.Error compiling for board ESP32 Dev Module.

这意味着您没有选择正确的分区方案。确保选择正确的分区方案。在您的 Arduino IDE 中,转到Tools > Partition Scheme,选择“ Huge APP (3MB No OTA) ”。

5. 板在 COMX 不可用 – 未选择 COM 端口

未选择 ESP32-CAM COM 端口

如果您收到以下错误或类似错误:

serial.serialutil.SerialException: could not open port 'COM8': WindowsError(2, 'The system cannot find the file specified.')Failed to execute script esptoolthe selected serial port Failed to execute script esptool
 does not exist or your board is not connectedBoard at COM8 is not available

这意味着您没有在工具菜单中选择 COM 端口。在您的 Arduino IDE 中,转到“工具” >“端口”并选择 ESP32 连接到的 COM 端口。

这也可能意味着 ESP32-CAM 未与您的计算机建立串行连接或未正确连接到 USB 连接器。

6.Psram错误:GPIO isr服务没有安装

ESP32-CAM Psram 错误 GPIO isr 服务未安装

您使用的是没有 PSRAM 的电路板,并且出现以下错误或类似错误:

E (161) gpio: gpio_isr_handler_remove(380): GPIO isr service is not installed, call gpio_install_isr_service() firstCamera init failed with error 0x101

当使用以下设置初始化电路板时:

config.frame_size = FRAMESIZE_UXGA;config.jpeg_quality = 10;config.fb_count = 2;

添加以下内容修复了问题(它降低了图像分辨率,因此不需要太多空间来存储图像。但是,由于内存有限,您无法获得某些高分辨率格式):

if(psramFound()){
  config.frame_size = FRAMESIZE_UXGA;
  config.jpeg_quality = 10;
  config.fb_count = 2;} else {
  config.frame_size = FRAMESIZE_SVGA;
  config.jpeg_quality = 12;
  config.fb_count = 1;}

注意:人脸识别和检测不适用于没有 PSRAM 的电路板。但是,您仍然可以使用该板的所有其他功能。例如,虽然你不能使用这个项目的人脸识别和检测功能(ESP32-CAM Video Streaming and Face Recognition with Arduino IDE),但你仍然可以玩这个例子并探索板的功能,只要你有代码中的正确引脚分配。

7. Wi-Fi 信号弱

一些读者报告说,在用 5V 为 ESP32-CAM 供电后,他们获得了更稳定的 Wi-Fi 信号。您可以阅读此专用指南,了解如何将外部天线连接到 ESP32-CAM 并扩展 Wi-Fi 覆盖范围

ESP32-CAM 可以选择使用内置天线或外置天线。如果您的 ESP32-CAM AI-Thinker 没有 Wi-Fi 连接或连接不良,则可能启用了外部天线。 如果将外部天线连接到连接器,它应该可以正常工作。

检查天线连接器旁的跳线 0K 电阻是否处于所需天线的正确位置。有3个白色的小方块,像“<”一样排列,中间位置很常见。

ESP32-CAM 外置和内置天线照片由 Helmut Schoenborn 提供

下图显示了对该区域的仔细观察。您可以清楚地看到连接到内置天线的 0K 小电阻。

esp32-cam 连接到内置天线照片由 Helmut Schoenborn 提供

随着电路板转动,PCB天线向上:

  • 要使用PCB天线,电阻必须在顶部位置,如下所示:/

  • 对于天线连接器,电阻必须在底部位置,如下所示:\

因此,要启用板载天线:

  • 拆掉连接天线的电阻,就在这个位置\

  • 并将两个连接焊接在一起以启用板载天线。

8. Arduino IDE 串行监视器中没有 IP 地址

如果您只看到串行监视器上打印的点 (……),则表示您的 ESP32-CAM 未与您的路由器建立 Wi-Fi 连接。

仔细检查您的网络凭据

您需要确保在以下变量中输入了准确的网络凭据(SSID 和密码):

const char* ssid = "REPLACE_WITH_YOUR_SSID";const char* password = "REPLACE_WITH_YOUR_PASSWORD";

在 Arduino IDE 串行监视器中选择正确的波特率

如果您没有在 Arduino IDE 串行监视器中选择正确的波特率,您将无法获得您的开发板 IP 地址,或者您只会在屏幕上看到垃圾。

确保选择正确的波特率。在我们使用 ESP32-CAM 的示例中,我们使用 115200 波特率。

多次重置电路板

您可能还需要多次按下 ESP32-CAM 板载 RESET 按钮以重新启动 ESP 并在启动期间打印 IP 地址。

RX 和 TX 交换

仔细检查 ESP32 板和 FTDI 编程器之间的连接。RX 去 TX,TX 去 RX。如果这些连接被交换,ESP32-CAM 将无法与您的计算机建立串行通信。

无线范围

如果路由器离您的 ESP32 板很远,它可能无法捕捉到 Wi-Fi 信号。确保您的 ESP32-CAM 离路由器相当近。

9. 打不开网页服务器

如果 ESP32-CAM 正在 Arduino IDE 串行监视器中打印 IP 地址,但是当您尝试在 Web 浏览器中打开 Web 服务器时,您会看到一个空白屏幕,这通常意味着您正在尝试访问 ESP32-CAM Web具有多个 Web 浏览器选项卡的服务器。

目前,这些 ESP32-CAM 草图一次只能与一个客户端连接。

10. 图像滞后/显示大量延迟

对于这么小又便宜的相机,有一些延迟是正常的。一些读者提出了以下建议以减少延迟:

  • 使用独立的 5V 电源为 ESP32-CAM 供电

  • 在代码中使用以下内容减小帧大小:
    config.frame_size = FRAMESIZE_SVGAconfig.frame_size = FRAMESIZE_VGA

  • 使用外部天线。

11. esp_camera_fb_get():无法按时取帧!

我们个人从未遇到过这个问题。然而,许多读者在他们的 ESP32-CAM 板卡上遇到了这个错误。

我们的一位读者 (Fibula) 提出以下建议来解决此问题:

“我使用 Aliexpress 的 ESP32-CAM 模块 2MP OV2640 摄像头传感器模块 Type-C USB 模块。虽然没有提到,但它没有其他 M5 型号的额外 PSRAM,并且相机有一个改变的 IO 引脚。

请参阅此处:https :  //github.com/m5stack/m5stack-cam-psram/blob/master/README.md 并向下滚动到界面比较。

我们可能都在使用的 CameraWebServer Arduino 示例没有定义这个 ESP32-CAM 模型。

您需要在主选项卡中自行添加添加:

#define CAMERA_MODEL_M5STACK_NO_PSRAM

camera_pins.h选项卡中添加以下内容:

#elif defined(CAMERA_MODEL_M5STACK_NO_PSRAM)#define PWDN_GPIO_NUM -1#define RESET_GPIO_NUM 15#define XCLK_GPIO_NUM 27#define SIOD_GPIO_NUM 25#define SIOC_GPIO_NUM 23#define Y9_GPIO_NUM 19#define Y8_GPIO_NUM 36#define Y7_GPIO_NUM 18#define Y6_GPIO_NUM 39#define Y5_GPIO_NUM 5#define Y4_GPIO_NUM 34#define Y3_GPIO_NUM 35#define Y2_GPIO_NUM 17#define VSYNC_GPIO_NUM 22#define HREF_GPIO_NUM 26#define PCLK_GPIO_NUM 21

你很高兴去。

另请注意,裸 ESP32-CAM 模块的最大分辨率为 XGA 1024×768,我假设也是因为缺少 PSRAM。

我们希望这个建议可以解决您的问题。请在评价部分留下您的意见。

使用更大的 microSD 卡

根据数据表,ESP32-CAM 应该只支持 4GB microSD 卡。

但是,我们已经使用16GB microSD 卡进行了测试,效果很好。

即使您有 16GB,您也可能无法存储超过 4GB 的空间。我们尚未测试存储超过 4GB 的空间,因此我们不确定这一点。

这些项目是否与 M5Stack 板兼容?

是的,M5Stack ESP32 开发板与外部项目兼容。但是,您必须检查您的相机引脚以确保您在代码中分配了正确的代码。

您可以在此处检查M5Stack相机连接

如何设置固定IP地址

要设置静态/固定 IP 地址,您可以按照下一个教程进行操作:

将 ESP32-CAM 设置为接入点 (AP)

您可以将 ESP32-CAM 设置为接入点 (AP)。这意味着您可以直接连接到 ESP32-CAM,而无需连接到路由器。您可以使用以下代码将您的视频流网络服务器设置为接入点:

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-cam-video-streaming-web-server-camera-home-assistant/
  
  IMPORTANT!!! 
   - Select Board "AI Thinker ESP32-CAM"
   - GPIO 0 must be connected to GND to upload a sketch
   - After connecting GPIO 0 to GND, press the ESP32-CAM on-board RESET button to put your board in flashing mode
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/#include "esp_camera.h"#include <WiFi.h>#include "esp_timer.h"#include "img_converters.h"#include "Arduino.h"#include "fb_gfx.h"#include "soc/soc.h" //disable brownout problems#include "soc/rtc_cntl_reg.h"  //disable brownout problems#include "esp_http_server.h"// Replace with your network credentialsconst char* ssid     = "ESP32-Access-Point";const char* password = "123456789";#define PART_BOUNDARY "123456789000000000000987654321"// This project was tested with the AI Thinker Model, M5STACK PSRAM Model and M5STACK WITHOUT PSRAM#define CAMERA_MODEL_AI_THINKER//#define CAMERA_MODEL_M5STACK_PSRAM//#define CAMERA_MODEL_M5STACK_WITHOUT_PSRAM// Not tested with this model//#define CAMERA_MODEL_WROVER_KIT#if defined(CAMERA_MODEL_WROVER_KIT)
  #define PWDN_GPIO_NUM    -1
  #define RESET_GPIO_NUM   -1
  #define XCLK_GPIO_NUM    21
  #define SIOD_GPIO_NUM    26
  #define SIOC_GPIO_NUM    27
  
  #define Y9_GPIO_NUM      35
  #define Y8_GPIO_NUM      34
  #define Y7_GPIO_NUM      39
  #define Y6_GPIO_NUM      36
  #define Y5_GPIO_NUM      19
  #define Y4_GPIO_NUM      18
  #define Y3_GPIO_NUM       5
  #define Y2_GPIO_NUM       4
  #define VSYNC_GPIO_NUM   25
  #define HREF_GPIO_NUM    23
  #define PCLK_GPIO_NUM    22#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
  #define PWDN_GPIO_NUM     -1
  #define RESET_GPIO_NUM    15
  #define XCLK_GPIO_NUM     27
  #define SIOD_GPIO_NUM     25
  #define SIOC_GPIO_NUM     23
  
  #define Y9_GPIO_NUM       19
  #define Y8_GPIO_NUM       36
  #define Y7_GPIO_NUM       18
  #define Y6_GPIO_NUM       39
  #define Y5_GPIO_NUM        5
  #define Y4_GPIO_NUM       34
  #define Y3_GPIO_NUM       35
  #define Y2_GPIO_NUM       32
  #define VSYNC_GPIO_NUM    22
  #define HREF_GPIO_NUM     26
  #define PCLK_GPIO_NUM     21#elif defined(CAMERA_MODEL_M5STACK_WITHOUT_PSRAM)
  #define PWDN_GPIO_NUM     -1
  #define RESET_GPIO_NUM    15
  #define XCLK_GPIO_NUM     27
  #define SIOD_GPIO_NUM     25
  #define SIOC_GPIO_NUM     23
  
  #define Y9_GPIO_NUM       19
  #define Y8_GPIO_NUM       36
  #define Y7_GPIO_NUM       18
  #define Y6_GPIO_NUM       39
  #define Y5_GPIO_NUM        5
  #define Y4_GPIO_NUM       34
  #define Y3_GPIO_NUM       35
  #define Y2_GPIO_NUM       17
  #define VSYNC_GPIO_NUM    22
  #define HREF_GPIO_NUM     26
  #define PCLK_GPIO_NUM     21#elif defined(CAMERA_MODEL_AI_THINKER)
  #define PWDN_GPIO_NUM     32
  #define RESET_GPIO_NUM    -1
  #define XCLK_GPIO_NUM      0
  #define SIOD_GPIO_NUM     26
  #define SIOC_GPIO_NUM     27
  
  #define Y9_GPIO_NUM       35
  #define Y8_GPIO_NUM       34
  #define Y7_GPIO_NUM       39
  #define Y6_GPIO_NUM       36
  #define Y5_GPIO_NUM       21
  #define Y4_GPIO_NUM       19
  #define Y3_GPIO_NUM       18
  #define Y2_GPIO_NUM        5
  #define VSYNC_GPIO_NUM    25
  #define HREF_GPIO_NUM     23
  #define PCLK_GPIO_NUM     22#else
  #error "Camera model not selected"#endifstatic const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n";httpd_handle_t stream_httpd = NULL;static esp_err_t stream_handler(httpd_req_t *req){
  camera_fb_t * fb = NULL;
  esp_err_t res = ESP_OK;
  size_t _jpg_buf_len = 0;
  uint8_t * _jpg_buf = NULL;
  char * part_buf[64];
  res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
  if(res != ESP_OK){
    return res;
  }
  while(true){
    fb = esp_camera_fb_get();
    if (!fb) {
      Serial.println("Camera capture failed");
      res = ESP_FAIL;
    } else {
      if(fb->width > 400){
        if(fb->format != PIXFORMAT_JPEG){
          bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
          esp_camera_fb_return(fb);
          fb = NULL;
          if(!jpeg_converted){
            Serial.println("JPEG compression failed");
            res = ESP_FAIL;
          }
        } else {
          _jpg_buf_len = fb->len;
          _jpg_buf = fb->buf;
        }
      }
    }
    if(res == ESP_OK){
      size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);
      res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
    }
    if(res == ESP_OK){
      res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
    }
    if(res == ESP_OK){
      res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
    }
    if(fb){
      esp_camera_fb_return(fb);
      fb = NULL;
      _jpg_buf = NULL;
    } else if(_jpg_buf){
      free(_jpg_buf);
      _jpg_buf = NULL;
    }
    if(res != ESP_OK){
      break;
    }
    //Serial.printf("MJPG: %uB\n",(uint32_t)(_jpg_buf_len));
  }
  return res;}void startCameraServer(){
  httpd_config_t config = HTTPD_DEFAULT_CONFIG();
  config.server_port = 80;
  httpd_uri_t index_uri = {
    .uri       = "/",
    .method    = HTTP_GET,
    .handler   = stream_handler,
    .user_ctx  = NULL
  };
  
  //Serial.printf("Starting web server on port: '%d'\n", config.server_port);
  if (httpd_start(&stream_httpd, &config) == ESP_OK) {
    httpd_register_uri_handler(stream_httpd, &index_uri);
  }}void setup() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
 
  Serial.begin(115200);
  Serial.setDebugOutput(false);
  
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG; 
  
  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }
  
  // Camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }
  // Connect to Wi-Fi network with SSID and password
  Serial.print("Setting AP (Access Point)…");
  // Remove the password parameter, if you want the AP (Access Point) to be open
  WiFi.softAP(ssid, password);
  IPAddress IP = WiFi.softAPIP();
  Serial.print("Camera Stream Ready! Connect to the ESP32 AP and go to: http://");
  Serial.println(IP);
  
  // Start streaming web server
  startCameraServer();}void loop() {
  delay(1);}




了解更多请访问:http://www.ndfweb.cn/news-902.html
  NDF俱乐部
  国际域名注册
  建站咨询
合作伙伴:万网 | 新网 | 新网互联 NDF网站建设淘宝店 | 实用工具 | 外貿網站建設 | 联系我们
鲁公网安备 37110202000336号 鲁ICP备2021027697号-1 Sitemap - RSSRSS订阅