电子产业一站式赋能平台

PCB联盟网

搜索
查看: 171|回复: 0
收起左侧

ESP32-S3搭建外网可访问的网络摄像头(内网穿透)

[复制链接]

840

主题

840

帖子

6491

积分

高级会员

Rank: 5Rank: 5

积分
6491
发表于 2023-9-6 12:00:00 | 显示全部楼层 |阅读模式

25ksfttrgsv6406096034.gif

25ksfttrgsv6406096034.gif

5 F1 B7 A9 G7 D# B$ c7 o, a5 S点击上方蓝色字体,关注我们
# ]0 H, a1 f) ~3 D3 V本篇博文使用ESP32-S3搭建网络摄像头,相比较局域网摄像头,本篇博文将分享如何搭建外网可以访问的网络摄像头。
5 ~9 Z9 n- u0 O# o0 x% ^4 k这主要是使用内网穿透技术,内网穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包(这里指局域网摄像头)不被网络地址转换设备屏蔽而正确路由到内网主机。) F. D9 R7 Z8 G5 d
主要流程分为两步:
4 B2 z3 Q9 U! s, a/ D# Z( A2 q. x1、先实现局域网访问网络摄像头;6 ^$ \" o, ]8 g4 J  H# G  V4 x
2、在此基础,使用内网穿透的方式,搭建外网可访问的网络摄像头。3 k' E# ]) ~. n, O& R
1
( s/ U( z5 V) G1 N9 r- ]- X局域网摄像头) }2 y/ y% i* j& y/ B1 A
ESP32实现局域网摄像头的方式比较简单,驱动代码如下:
3 L1 W) Y$ s2 d# {2 }8 B( y
1 F$ G3 v! p, }/ Q
  • #include "esp_camera.h"#include. l/ \! C- P* y# y: g
    //// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality//            Ensure ESP32 Wrover Module or other board with PSRAM is selected//            Partial images will be transmitted if image exceeds buffer size////            You must select partition scheme from the board menu that has at least 3MB APP space.//            Face Recognition is DISABLED for ESP32 and ESP32-S2, because it takes up from 15 //            seconds to process single frame. Face Detection is ENABLED if PSRAM is enabled as well
    % w3 F& X; _5 s3 i" `// ===================// Select camera model// ===================//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM// #define CAMERA_MODEL_ESP_EYE // Has PSRAM//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM//#define CAMERA_MODEL_AI_THINKER // Has PSRAM//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM//#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM// ** Espressif Internal Boards **//#define CAMERA_MODEL_ESP32_CAM_BOARD//#define CAMERA_MODEL_ESP32S2_CAM_BOARD//#define CAMERA_MODEL_ESP32S3_CAM_LCD#define CAMERA_MODEL_DFRobot_FireBeetle2_ESP32S3 // Has PSRAM//#define CAMERA_MODEL_DFRobot_Romeo_ESP32S3 // Has PSRAM' S' Q) e9 l, z) t2 b8 P" p- H- ~( A& k
    #include "camera_pins.h"#include "DFRobot_AXP313A.h"7 C; R6 \% o! u" l5 Z" G
    DFRobot_AXP313A axp;7 r- `$ ]7 C5 O. [4 Y# m6 [
    // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";
    ' u3 A* g( K1 f$ I" C- X* @) Rvoid startCameraServer();void setupLedFlash(int pin);- G/ P  x7 K( {) p: I% u# K
    void setup() {  Serial.begin(115200);  Serial.setDebugOutput(true);  Serial.println();
    ; f! A( L( w8 X  M- s4 v  while(axp.begin() != 0){    Serial.println("init error");    delay(1000);  }( b$ v) V# E6 q  T' }3 Q) d
      axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电
    4 y& Q4 x. U0 }" y( G; A  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_sccb_sda = SIOD_GPIO_NUM;  config.pin_sccb_scl = SIOC_GPIO_NUM;  config.pin_pwdn = PWDN_GPIO_NUM;  config.pin_reset = RESET_GPIO_NUM;  config.xclk_freq_hz = 20000000;  config.frame_size = FRAMESIZE_UXGA;  config.pixel_format = PIXFORMAT_JPEG; // for streaming  //config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition  config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;  config.fb_location = CAMERA_FB_IN_PSRAM;  config.jpeg_quality = 12;  config.fb_count = 1;
    ' y* @9 T) Q% N) ?0 }" F5 x  \, \  // if PSRAM IC present, init with UXGA resolution and higher JPEG quality  //                      for larger pre-allocated frame buffer.  if(config.pixel_format == PIXFORMAT_JPEG){    if(psramFound()){      config.jpeg_quality = 10;      config.fb_count = 2;      config.grab_mode = CAMERA_GRAB_LATEST;    } else {      // Limit the frame size when PSRAM is not available      config.frame_size = FRAMESIZE_SVGA;      config.fb_location = CAMERA_FB_IN_DRAM;    }  } else {    // Best option for face detection/recognition    config.frame_size = FRAMESIZE_240X240;#if CONFIG_IDF_TARGET_ESP32S3    config.fb_count = 2;#endif  }
    " M* d. ^1 R$ o& V! _#if defined(CAMERA_MODEL_ESP_EYE)  pinMode(13, INPUT_PULLUP);  pinMode(14, INPUT_PULLUP);#endif  U. e) W( e( Y, L0 a
      // 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;  }. q- ?' H  {0 {8 a' V
      sensor_t * s = esp_camera_sensor_get();  // initial sensors are flipped vertically and colors are a bit saturated  if (s->id.PID == OV3660_PID) {    s->set_vflip(s, 1); // flip it back    s->set_brightness(s, 1); // up the brightness just a bit    s->set_saturation(s, -2); // lower the saturation  }  // drop down frame size for higher initial frame rate  if(config.pixel_format == PIXFORMAT_JPEG){    s->set_framesize(s, FRAMESIZE_QVGA);  }
    ) N! ]! e4 L( M0 f/ b- W- d#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)  s->set_vflip(s, 1);  s->set_hmirror(s, 1);#endif& m5 u. u/ ~4 e, Q! O3 n- c7 ^+ k
    #if defined(CAMERA_MODEL_ESP32S3_EYE)  s->set_vflip(s, 1);#endif. [9 V/ L) o) \
    // Setup LED FLash if LED pin is defined in camera_pins.h#if defined(LED_GPIO_NUM)  setupLedFlash(LED_GPIO_NUM);#endif
    1 s, b3 a; U* ]5 y  WiFi.begin(ssid, password);  WiFi.setSleep(false);
    8 C& g; d* D8 H1 w  S; |  while (WiFi.status() != WL_CONNECTED) {    delay(500);    Serial.print(".");  }  Serial.println("");  Serial.println("WiFi connected");
    + Y4 j  ?1 I& V  m2 V- t  startCameraServer();2 Z  l9 d1 O0 U/ M: {* i0 u
      Serial.print("Camera Ready! Use 'http://");  Serial.print(WiFi.localIP());  Serial.println("' to connect");}
    ; u" w& O* @! `5 |: b& {. {void loop() {  // Do nothing. Everything is done in another task by the web server  delay(10000);}
    - C! d' ?0 ~: I4 m4 }) }6 d代码中有几点需要注意:
    9 Z7 L6 a0 e: C+ W# m& P" W
    " G$ ?8 h- b1 Z! I  ?1、宏定义选择适配的摄像头模式。
      N7 @/ V1 y  c2 X7 d. f+ ~. i3 f- C  Q& n, h
  • // ===================// Select camera model// ===================//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM// #define CAMERA_MODEL_ESP_EYE // Has PSRAM//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM//#define CAMERA_MODEL_AI_THINKER // Has PSRAM//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM//#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM// ** Espressif Internal Boards **//#define CAMERA_MODEL_ESP32_CAM_BOARD//#define CAMERA_MODEL_ESP32S2_CAM_BOARD//#define CAMERA_MODEL_ESP32S3_CAM_LCD#define CAMERA_MODEL_DFRobot_FireBeetle2_ESP32S3 // Has PSRAM//#define CAMERA_MODEL_DFRobot_Romeo_ESP32S3 // Has PSRAM8 u/ s  e6 G$ V/ X3 I0 u
    2、无线路由器SSID和密码要填写正确。5 Z: o; H! M# H+ q0 V4 v6 E
    6 S4 ]. ]: W' x
  • // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";* Z5 }3 k8 T8 \6 B4 S
    3、给摄像头供电' I* D! \, Y8 M
    + C6 a! E  }/ J1 [& _
  • axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电2 L' B, f: a" D
    4、板卡需要外接天线,否则可能无法连接路由器。
    - y  P  E' o* E5 F/ S% P, z1 b5 [1 h* u( Z
    编译下载程序到板卡中,确保局域网访问网络摄像头可正常使用。% j5 O2 N+ Q0 ]1 l) a3 H$ Z
    2" J; o! I7 r, u, q) b% L$ q0 t: I1 u
    内网穿透网络摄像头. c: D/ X% n' M6 X( ]
    内网穿透我们使用花生壳这款软件提供的内网穿透服务。& O( N5 E( n5 Q8 \& e8 o
    ! W% X1 s* G4 Y/ j+ G

    zy3pkslqor16406096135.png

    zy3pkslqor16406096135.png
    ' f0 ]: B3 s: ]! n9 H
    1 p6 ^, e1 m: Q2 t; p
    在官网下载APP:https://hsk.oray.com/
    8 X- _: n, \0 R# v8 \, \5 B) v, o+ l) z  e, E/ w# _
    下载安装完成后,在内网穿透服务点击新建映射,如下图所示: 7 V  P) k, N( C4 I( i7 w0 t

    + W' K5 i  J/ b5 `& b& i4 N5 B

    zrl01g0kdwe6406096235.png

    zrl01g0kdwe6406096235.png
    $ O' H% E$ j& S+ y1 ^: r( v
    & n& t. D. l0 r; p( F) R8 h6 U% w
    填写新建映射的基本信息,请注意内网主机和内网端口是局域网摄像头的主机和端口(端口默认为80) ,如下图所示:  n5 ^! ^/ _, z* W
    3 @6 D6 o7 J+ Z2 F5 a

    m1l3hdc3vis6406096335.png

    m1l3hdc3vis6406096335.png

    9 e. H0 ?9 J  s% N3 s; m" p
    / @( M0 |; \4 e新建映射完成后,可以在APP看到新增的设备列表,如下图所示:
      E- e' S' P+ ?& b- ~! x5 @# h7 g' F) \4 ]

    u4ozmqxfqo16406096435.png

    u4ozmqxfqo16406096435.png
    ' i+ C0 i, W5 O
    6 T1 u0 ^. w# `0 s$ P# I9 L
    复制访问网址,在浏览器中打开:http://2j90962r69.goho.co:47918/$ D- c$ k  w" m

    : d, D( y# {* @: t7 x1 B* F即使不在同一个局域网内也可以正常访问摄像头啦。  ?. U$ W/ q  x5 z
    3 `( Q8 }, P  y+ N1 L6 v

    rlmpxhtllzz6406096535.png

    rlmpxhtllzz6406096535.png
    2 s8 }# F2 g4 G- F* x

    7 q6 J+ v4 F; x4 C4 Y/ H7 M
    ! N7 Q) l+ i8 V$ a

    ioeyjtb3osz6406096635.png

    ioeyjtb3osz6406096635.png

    : l1 J  [! u/ \9 m# v4 _  Q往期推荐HarmonyOS学习路之开发篇—Java UI框架(Position和AdaptiveBox layout)
    * }' J# O- q) k4 m9 g9 G; vPython数据可视化:如何选择合适的图表可视化?
    6 _# O# m) {; @( S4 N& S- s/ W磁耦合共振无线供电装置
    ) y6 h- n$ b9 j2 ?3 S  C" vPython Qt GUI设计:表格和树类(提升篇—1)
    ( N7 I  m$ k3 e  {3 n6 s0 }9 y

    1 G. f5 `' x' a( p, r8 @

    siralru5u0d6406096735.jpg

    siralru5u0d6406096735.jpg
    2 k2 {/ A* j# f

    axjniqru2sl6406096835.gif

    axjniqru2sl6406096835.gif

    2 f9 f9 v( P2 p6 Z- v- s( E8 g9 O3 e点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表