34浏览
查看: 34|回复: 0

[项目] Esp32 S3 AI智能摄像头做的简易安保系统

[复制链接]
本帖最后由 创客编程张 于 2025-5-1 21:32 编辑

智能安保系统
在科技飞速发展的当下,智能安防领域正经历着一场革命性的变革。今天,我要为大家揭开一款极具创新性的智能安保系统的神秘面纱,它融合了前沿的 ESP32 S3 AI 摄像头模块技术,为我们的安全保驾护航。你是否曾为传统安保系统的滞后性和低效率而烦恼?是否渴望拥有一套能够实时监测、精准识别、快速响应的智能安保解决方案?这款基于 ESP32 S3 AI 摄像头模块的智能安保系统,正是你一直在寻找的答案。它凭借着强大的 AI 处理能力、出色的图像识别技术以及高效的网络通信功能,能够在复杂的环境中精准捕捉异常,第一时间发出警报,让潜在的安全威胁无所遁形。接下来,就让我们一同深入了解这款智能安保系统的神奇之处吧!

智能安保系统中涉及ESP32-S3 AI相关功能的一些示例C语言代码,涵盖了前端感知(摄像头图像采集、麦克风音频采集)、数据传输(Wi-Fi连接)、AI处理(简单图像特征提取示例)等部分功能。应用中可能需要根据需求进行调整和完善,并且完整实现智能安保系统还会涉及更多复杂的逻辑和代码。

一、准备工作
1.下载Arduino IED,按照教程下载最新版软件
2.打开软件,点击工具,点击第2栏的首选项(如图)
Esp32 S3 AI智能摄像头做的简易安保系统图1
3.选择语言(重启软件后生效),输入链接,点击确定
Esp32 S3 AI智能摄像头做的简易安保系统图3
4.安装开发板(如图按顺序点击)
Esp32 S3 AI智能摄像头做的简易安保系统图2
找到esp32,并点击安装(我这里已经安装完成)
Esp32 S3 AI智能摄像头做的简易安保系统图4
二、编写程序
1.引入ESP32 开发所需的标准库和 ESP-IDF 库,包括网络、日志、GPIO、SPI、I2S 和 Wi - Fi 相关的库。定义相关配置(WiFi账号密码需自行修改
  1. <font face="微软雅黑" size="2">#include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "nvs_flash.h"
  5. #include "esp_netif.h"
  6. #include "esp_event.h"
  7. #include "esp_log.h"
  8. #include "driver/gpio.h"
  9. #include "driver/spi_master.h"
  10. #include "driver/i2s.h"
  11. #include "esp_wifi.h"
  12. #include "ip4_addr.h"
  13. // 日志标签
  14. static const char* TAG = "ESP32-S3_Security_System";
  15. // Wi-Fi配置信息
  16. #define EXAMPLE_ESP_WIFI_SSID      "your_wifi_ssid"
  17. #define EXAMPLE_ESP_WIFI_PASS      "your_wifi_password"
  18. // 摄像头相关SPI配置
  19. #define CAMERA_MCLK_PIN           19
  20. #define CAMERA_HREF_PIN           23
  21. #define CAMERA_VSYNC_PIN          25
  22. #define CAMERA_DATA_OUT_PIN       26
  23. #define CAMERA_PCLK_PIN           27
  24. #define CAMERA_XCLK_PIN           0
  25. #define CAMERA_PWDN_PIN           32
  26. #define CAMERA_RESET_PIN          33
  27. // 麦克风I2S配置
  28. #define I2S_MCK_PIN               0
  29. #define I2S_BCK_PIN               2
  30. #define I2S_LRCK_PIN              3
  31. #define I2S_DO_PIN                4
  32. #define I2S_DI_PIN                5</font>
复制代码

2.[color=rgba(0, 0, 0, 0.85)]对输入的 RGB 图像数据进行灰度化处理,将每个像素的 R、G、B 分量转换为灰度值,并更新图像数据。
  1. <font face="微软雅黑" size="2">// 简单图像特征提取示例(这里只是简单的灰度化处理)
  2. void simple_image_feature_extraction(uint8_t* image_data, int width, int height) {
  3.     for (int i = 0; i < width * height; i++) {
  4.         // 简单的灰度化公式:Y = 0.299 * R + 0.587 * G + 0.114 * B
  5.         // 这里假设图像是RGB格式,且每个像素占3个字节
  6.         uint8_t r = image_data[i * 3];
  7.         uint8_t g = image_data[i * 3 + 1];
  8.         uint8_t b = image_data[i * 3 + 2];
  9.         uint8_t gray = (uint8_t)(0.299 * r + 0.587 * g + 0.114 * b);
  10.         image_data[i * 3] = gray;
  11.         image_data[i * 3 + 1] = gray;
  12.         image_data[i * 3 + 2] = gray;
  13. }
  14. }</font>
复制代码

3.然后处理 Wi - Fi 和 IP 相关的事件。当 Wi - Fi 启动时,尝试连接到 Wi - Fi;当 Wi - Fi 断开连接时,尝试重新连接;当获取到 IP 地址时,输出日志信息。
  1. <font face="微软雅黑" size="2">// Wi-Fi连接事件处理回调函数
  2. static void event_handler(void* arg, esp_event_base_t event_base,
  3.                           int32_t event_id, void* event_data)
  4. {
  5.     if (event_base == WIFI_EVENT) {
  6.         switch (event_id) {
  7.             case WIFI_EVENT_STA_START:
  8.                 esp_wifi_connect();
  9.                 break;
  10.             case WIFI_EVENT_STA_DISCONNECTED:
  11.                 ESP_LOGW(TAG, "Wi-Fi disconnected, trying to reconnect...");
  12.                 esp_wifi_connect();
  13.                 break;
  14.         }
  15.     } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
  16.         ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
  17.         ESP_LOGI(TAG, "Got IP: " IPSTR, IP2STR(&event->ip_info.ip));
  18.     }
  19. }</font>
复制代码
4.初始化 Wi - Fi 连接。包括初始化网络接口、创建事件循环、创建默认的 Wi - Fi STA 模式,注册事件处理函数,设置 Wi - Fi 配置并启动 Wi - Fi。
  1. <font face="微软雅黑" size="2">// 初始化Wi-Fi连接
  2. void wifi_init_sta(void)
  3. {
  4.     esp_netif_init();
  5.     esp_event_loop_create_default();
  6.     esp_netif_create_default_wifi_sta();
  7.     wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  8.     esp_wifi_init(&cfg);
  9.     esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID,
  10.                                         &event_handler, NULL, NULL);
  11.     esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP,
  12.                                         &event_handler, NULL, NULL);
  13.     wifi_config_t wifi_config = {
  14.        .sta = {
  15.            .ssid = EXAMPLE_ESP_WIFI_SSID,
  16.            .password = EXAMPLE_ESP_WIFI_PASS,
  17.            .threshold.authmode = WIFI_AUTH_WPA2_PSK,
  18.            .sae_pwe_h2e = WPA3_SAE_PWE_BOTH,
  19.         },
  20.     };
  21.     esp_wifi_set_mode(WIFI_MODE_STA);
  22.     esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);
  23.     esp_wifi_start();
  24. }</font>
复制代码
5.初始化摄像头
  1. <font face="微软雅黑" size="2">// 初始化摄像头
  2. void camera_init(void) {
  3.     gpio_config_t io_conf = {};
  4.     // 输出引脚配置
  5.     io_conf.mode = GPIO_MODE_OUTPUT;
  6.     io_conf.pin_bit_mask = (1ULL << CAMERA_MCLK_PIN) | (1ULL << CAMERA_XCLK_PIN) |
  7.                            (1ULL << CAMERA_PWDN_PIN) | (1ULL << CAMERA_RESET_PIN);
  8.     gpio_config(&io_conf);
  9.     // 输入引脚配置
  10.     io_conf.mode = GPIO_MODE_INPUT;
  11.     io_conf.pin_bit_mask = (1ULL << CAMERA_HREF_PIN) | (1ULL << CAMERA_VSYNC_PIN) |
  12.                            (1ULL << CAMERA_DATA_OUT_PIN) | (1ULL << CAMERA_PCLK_PIN);
  13.     gpio_config(&io_conf);
  14.     ESP_LOGI(TAG, "Camera initialized");
  15. }</font>
复制代码
6.初始化麦克风
  1. <font face="微软雅黑" size="2">// 初始化麦克风I2S
  2. void microphone_init(void) {
  3.     i2s_config_t i2s_config = {
  4.        .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
  5.        .sample_rate = 44100,
  6.        .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
  7.        .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
  8.        .communication_format = I2S_COMM_FORMAT_I2S,
  9.        .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  10.        .dma_buf_count = 8,
  11.        .dma_buf_len = 64,
  12.        .use_apll = false,
  13.        .tx_desc_auto_clear = true,
  14.        .fixed_mclk = I2S_MCK_PIN,
  15.     };
  16.     i2s_pin_config_t pin_config = {
  17.        .bck_io_num = I2S_BCK_PIN,
  18.        .ws_io_num = I2S_LRCK_PIN,
  19.        .data_in_num = I2S_DO_PIN,
  20.        .data_out_num = I2S_DI_PIN,
  21.     };
  22.     esp_err_t err = i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
  23.     if (err != ESP_OK) {
  24.         ESP_LOGE(TAG, "Failed to install I2S driver: %s", esp_err_to_name(err));
  25.         return;
  26.     }
  27.     err = i2s_set_pin(I2S_NUM_0, &pin_config);
  28.     if (err != ESP_OK) {
  29.         ESP_LOGE(TAG, "Failed to set I2S pins: %s", esp_err_to_name(err));
  30.         i2s_driver_uninstall(I2S_NUM_0);
  31.         return;
  32.     }
  33.     ESP_LOGI(TAG, "Microphone initialized");
  34. }</font>
复制代码
7.采集摄像头图像数据示例函数(这里简单做了一个程序,实际使用请查看相关教程DFRobot DFR1154 ESP32-S3 AI CAM使用教程
  1. void capture_camera_image(uint8_t* buffer, int width, int height) {
  2.     for (int i = 0; i < width * height * 3; i++) {
  3.         buffer[i] = rand() % 256;
  4.     }
  5.     ESP_LOGI(TAG, "Camera image captured");
  6. }
复制代码
采集麦克风音频数据示例函数
  1. void capture_microphone_audio(int16_t* buffer, int buffer_size) {
  2.     for (int i = 0; i < buffer_size; i++) {
  3.         buffer[i] = rand() % 32768 - 16384;
  4.     }
  5.     ESP_LOGI(TAG, "Microphone audio captured");
  6. }
复制代码
8.编写主程序
  1. void app_main(void)
  2. {
  3.     // 初始化NVS
  4.     esp_err_t ret = nvs_flash_init();
  5.     if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
  6.         ESP_ERROR_CHECK(nvs_flash_erase());
  7.         ret = nvs_flash_init();
  8.     }
  9.     ESP_ERROR_CHECK(ret);
  10.     // 初始化随机数种子
  11.     srand(esp_random());
  12.     // 初始化Wi-Fi连接
  13.     wifi_init_sta();
  14.     // 初始化摄像头
  15.     camera_init();
  16.     // 初始化麦克风
  17.     microphone_init();
  18.     // 定义图像和音频数据缓冲区
  19.     const int image_width = 640;
  20.     const int image_height = 480;
  21.     uint8_t* camera_image_buffer = (uint8_t*)malloc(image_width * image_height * 3);
  22.     if (camera_image_buffer == NULL) {
  23.         ESP_LOGE(TAG, "Failed to allocate memory for camera image buffer");
  24.         return;
  25.     }
  26.     const int audio_buffer_size = 1024;
  27.     int16_t* microphone_audio_buffer = (int16_t*)malloc(audio_buffer_size * sizeof(int16_t));
  28.     if (microphone_audio_buffer == NULL) {
  29.         ESP_LOGE(TAG, "Failed to allocate memory for microphone audio buffer");
  30.         free(camera_image_buffer);
  31.         return;
  32.     }
  33.     while (1) {
  34.         // 采集摄像头图像数据
  35.         capture_camera_image(camera_image_buffer, image_width, image_height);
  36.         // 进行简单的图像特征提取
  37.         simple_image_feature_extraction(camera_image_buffer, image_width, image_height);
  38.         // 采集麦克风音频数据
  39.         capture_microphone_audio(microphone_audio_buffer, audio_buffer_size);
  40.         // 这里可以添加将数据发送到云端或进行进一步AI处理的代码
  41.         // 例如通过网络发送数据等
  42.         vTaskDelay(pdMS_TO_TICKS(1000));
  43.     }
  44.     // 释放内存
  45.     free(camera_image_buffer);
  46.     free(microphone_audio_buffer);
  47. }
复制代码
9.所有程序(部分需自主修改
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "nvs_flash.h"
  5. #include "esp_netif.h"
  6. #include "esp_event.h"
  7. #include "esp_log.h"
  8. #include "driver/gpio.h"
  9. #include "driver/spi_master.h"
  10. #include "driver/i2s.h"
  11. #include "esp_wifi.h"
  12. #include "ip4_addr.h"
  13. // 日志标签
  14. static const char* TAG = "ESP32-S3_Security_System";
  15. // Wi-Fi配置信息
  16. #define EXAMPLE_ESP_WIFI_SSID      "your_wifi_ssid"
  17. #define EXAMPLE_ESP_WIFI_PASS      "your_wifi_password"
  18. // 摄像头相关SPI配置
  19. #define CAMERA_MCLK_PIN           19
  20. #define CAMERA_HREF_PIN           23
  21. #define CAMERA_VSYNC_PIN          25
  22. #define CAMERA_DATA_OUT_PIN       26
  23. #define CAMERA_PCLK_PIN           27
  24. #define CAMERA_XCLK_PIN           0
  25. #define CAMERA_PWDN_PIN           32
  26. #define CAMERA_RESET_PIN          33
  27. // 麦克风I2S配置
  28. #define I2S_MCK_PIN               0
  29. #define I2S_BCK_PIN               2
  30. #define I2S_LRCK_PIN              3
  31. #define I2S_DO_PIN                4
  32. #define I2S_DI_PIN                5
  33. // 简单图像特征提取示例(这里只是简单的灰度化处理)
  34. void simple_image_feature_extraction(uint8_t* image_data, int width, int height) {
  35.     for (int i = 0; i < width * height; i++) {
  36.         // 简单的灰度化公式:Y = 0.299 * R + 0.587 * G + 0.114 * B
  37.         // 这里假设图像是RGB格式,且每个像素占3个字节
  38.         uint8_t r = image_data[i * 3];
  39.         uint8_t g = image_data[i * 3 + 1];
  40.         uint8_t b = image_data[i * 3 + 2];
  41.         uint8_t gray = (uint8_t)(0.299 * r + 0.587 * g + 0.114 * b);
  42.         image_data[i * 3] = gray;
  43.         image_data[i * 3 + 1] = gray;
  44.         image_data[i * 3 + 2] = gray;
  45.     }
  46. }
  47. // Wi-Fi连接事件处理回调函数
  48. static void event_handler(void* arg, esp_event_base_t event_base,
  49.                           int32_t event_id, void* event_data)
  50. {
  51.     if (event_base == WIFI_EVENT) {
  52.         switch (event_id) {
  53.             case WIFI_EVENT_STA_START:
  54.                 esp_wifi_connect();
  55.                 break;
  56.             case WIFI_EVENT_STA_DISCONNECTED:
  57.                 ESP_LOGW(TAG, "Wi-Fi disconnected, trying to reconnect...");
  58.                 esp_wifi_connect();
  59.                 break;
  60.         }
  61.     } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
  62.         ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
  63.         ESP_LOGI(TAG, "Got IP: " IPSTR, IP2STR(&event->ip_info.ip));
  64.     }
  65. }
  66. // 初始化Wi-Fi连接
  67. void wifi_init_sta(void)
  68. {
  69.     esp_netif_init();
  70.     esp_event_loop_create_default();
  71.     esp_netif_create_default_wifi_sta();
  72.     wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  73.     esp_wifi_init(&cfg);
  74.     esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID,
  75.                                         &event_handler, NULL, NULL);
  76.     esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP,
  77.                                         &event_handler, NULL, NULL);
  78.     wifi_config_t wifi_config = {
  79.        .sta = {
  80.            .ssid = EXAMPLE_ESP_WIFI_SSID,
  81.            .password = EXAMPLE_ESP_WIFI_PASS,
  82.            .threshold.authmode = WIFI_AUTH_WPA2_PSK,
  83.            .sae_pwe_h2e = WPA3_SAE_PWE_BOTH,
  84.         },
  85.     };
  86.     esp_wifi_set_mode(WIFI_MODE_STA);
  87.     esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);
  88.     esp_wifi_start();
  89. }
  90. // 初始化摄像头
  91. void camera_init(void) {
  92.     gpio_config_t io_conf = {};
  93.     // 输出引脚配置
  94.     io_conf.mode = GPIO_MODE_OUTPUT;
  95.     io_conf.pin_bit_mask = (1ULL << CAMERA_MCLK_PIN) | (1ULL << CAMERA_XCLK_PIN) |
  96.                            (1ULL << CAMERA_PWDN_PIN) | (1ULL << CAMERA_RESET_PIN);
  97.     gpio_config(&io_conf);
  98.     // 输入引脚配置
  99.     io_conf.mode = GPIO_MODE_INPUT;
  100.     io_conf.pin_bit_mask = (1ULL << CAMERA_HREF_PIN) | (1ULL << CAMERA_VSYNC_PIN) |
  101.                            (1ULL << CAMERA_DATA_OUT_PIN) | (1ULL << CAMERA_PCLK_PIN);
  102.     gpio_config(&io_conf);
  103.     ESP_LOGI(TAG, "Camera initialized");
  104. }
  105. // 初始化麦克风I2S
  106. void microphone_init(void) {
  107.     i2s_config_t i2s_config = {
  108.        .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
  109.        .sample_rate = 44100,
  110.        .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
  111.        .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
  112.        .communication_format = I2S_COMM_FORMAT_I2S,
  113.        .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  114.        .dma_buf_count = 8,
  115.        .dma_buf_len = 64,
  116.        .use_apll = false,
  117.        .tx_desc_auto_clear = true,
  118.        .fixed_mclk = I2S_MCK_PIN,
  119.     };
  120.     i2s_pin_config_t pin_config = {
  121.        .bck_io_num = I2S_BCK_PIN,
  122.        .ws_io_num = I2S_LRCK_PIN,
  123.        .data_in_num = I2S_DO_PIN,
  124.        .data_out_num = I2S_DI_PIN,
  125.     };
  126.     esp_err_t err = i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
  127.     if (err != ESP_OK) {
  128.         ESP_LOGE(TAG, "Failed to install I2S driver: %s", esp_err_to_name(err));
  129.         return;
  130.     }
  131.     err = i2s_set_pin(I2S_NUM_0, &pin_config);
  132.     if (err != ESP_OK) {
  133.         ESP_LOGE(TAG, "Failed to set I2S pins: %s", esp_err_to_name(err));
  134.         i2s_driver_uninstall(I2S_NUM_0);
  135.         return;
  136.     }
  137.     ESP_LOGI(TAG, "Microphone initialized");
  138. }
  139. // 采集摄像头图像数据示例函数
  140. // 这里只是简单模拟获取图像数据,实际需要更复杂的摄像头驱动操作
  141. void capture_camera_image(uint8_t* buffer, int width, int height) {
  142.     for (int i = 0; i < width * height * 3; i++) {
  143.         buffer[i] = rand() % 256;
  144.     }
  145.     ESP_LOGI(TAG, "Camera image captured");
  146. }
  147. // 采集麦克风音频数据示例函数
  148. // 这里只是简单模拟获取音频数据,实际需要更复杂的I2S驱动操作
  149. void capture_microphone_audio(int16_t* buffer, int buffer_size) {
  150.     for (int i = 0; i < buffer_size; i++) {
  151.         buffer[i] = rand() % 32768 - 16384;
  152.     }
  153.     ESP_LOGI(TAG, "Microphone audio captured");
  154. }
  155. void app_main(void)
  156. {
  157.     // 初始化NVS
  158.     esp_err_t ret = nvs_flash_init();
  159.     if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
  160.         ESP_ERROR_CHECK(nvs_flash_erase());
  161.         ret = nvs_flash_init();
  162.     }
  163.     ESP_ERROR_CHECK(ret);
  164.     // 初始化随机数种子
  165.     srand(esp_random());
  166.     // 初始化Wi-Fi连接
  167.     wifi_init_sta();
  168.     // 初始化摄像头
  169.     camera_init();
  170.     // 初始化麦克风
  171.     microphone_init();
  172.     // 定义图像和音频数据缓冲区
  173.     const int image_width = 640;
  174.     const int image_height = 480;
  175.     uint8_t* camera_image_buffer = (uint8_t*)malloc(image_width * image_height * 3);
  176.     if (camera_image_buffer == NULL) {
  177.         ESP_LOGE(TAG, "Failed to allocate memory for camera image buffer");
  178.         return;
  179.     }
  180.     const int audio_buffer_size = 1024;
  181.     int16_t* microphone_audio_buffer = (int16_t*)malloc(audio_buffer_size * sizeof(int16_t));
  182.     if (microphone_audio_buffer == NULL) {
  183.         ESP_LOGE(TAG, "Failed to allocate memory for microphone audio buffer");
  184.         free(camera_image_buffer);
  185.         return;
  186.     }
  187.     while (1) {
  188.         // 采集摄像头图像数据
  189.         capture_camera_image(camera_image_buffer, image_width, image_height);
  190.         // 进行简单的图像特征提取
  191.         simple_image_feature_extraction(camera_image_buffer, image_width, image_height);
  192.         // 采集麦克风音频数据
  193.         capture_microphone_audio(microphone_audio_buffer, audio_buffer_size);
  194.         // 这里可以添加将数据发送到云端或进行进一步AI处理的代码
  195.         // 例如通过网络发送数据等
  196.         vTaskDelay(pdMS_TO_TICKS(1000));
  197.     }
  198.     // 释放内存
  199.     free(camera_image_buffer);
  200.     free(microphone_audio_buffer);
  201. }
复制代码
三.最后我们可以在程序中加入自己训练的智能体(我不会训练AI所以我花钱找人训练了一个,这里就不分享了哈,还请见谅)。由于我也是初学者,程序中可能会有少许问题,大家可以检查修改。Esp32 S3 AI智能摄像头做的简易安保系统图5

最后连接esp32 s3 ai模块,上传程序。

四.附件
在这里,我自己设计了一个激光切割的外壳供参考下载附件智能安保.zip

就此,完!欢迎交流。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail