电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

395

主题

395

帖子

2304

积分

三级会员

Rank: 3Rank: 3

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

ovma22xfjvs640331153.gif

ovma22xfjvs640331153.gif
( \1 q: f% I$ A! s! Q9 {
点击上方蓝色字体,关注我们8 @" L4 m+ U( i* t6 b3 y) p+ G' e
本篇博文使用ESP32-S3搭建网络摄像头,相比较局域网摄像头,本篇博文将分享如何搭建外网可以访问的网络摄像头。
" P# I1 H8 C1 N这主要是使用内网穿透技术,内网穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包(这里指局域网摄像头)不被网络地址转换设备屏蔽而正确路由到内网主机。8 h5 O/ O9 [3 X
主要流程分为两步:+ K) G( u& A5 m$ U- e) [
1、先实现局域网访问网络摄像头;" H4 i  Q, o( f% e6 V& |, |
2、在此基础,使用内网穿透的方式,搭建外网可访问的网络摄像头。
' g# J$ c$ S6 G! V3 D18 H; v0 a6 b/ C: ^* S/ G
局域网摄像头0 d0 E9 P4 L* @2 I# m& w
ESP32实现局域网摄像头的方式比较简单,驱动代码如下:
  G( I9 y8 v+ G3 N" W0 \' w0 l+ t
, @$ M. a5 ?9 i  ?4 `
  • #include "esp_camera.h"#include
    : ~) [0 f: U3 m, F4 Q5 P//// 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
    9 z, p& ~8 ?& `& N$ ~6 q" E// ===================// 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
    ' |: A0 {8 T! o2 Q+ v0 P#include "camera_pins.h"#include "DFRobot_AXP313A.h"
    , [5 q6 z+ B6 |; z- ^( j7 `DFRobot_AXP313A axp;- H* Q1 Y( d  Y4 _# u
    // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";
    ; j; Y- k& K2 f3 Avoid startCameraServer();void setupLedFlash(int pin);
      g8 y* }& B& L; Gvoid setup() {  Serial.begin(115200);  Serial.setDebugOutput(true);  Serial.println();4 g" i1 m$ D, Z+ |
      while(axp.begin() != 0){    Serial.println("init error");    delay(1000);  }" Z+ u3 K5 f0 ^* b+ B% \
      axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电
    8 s4 B, E6 v$ z9 y3 T  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;
    % l3 i) D, N! g  // 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  }
    0 l9 y* s: X( ^) V/ _4 N% f#if defined(CAMERA_MODEL_ESP_EYE)  pinMode(13, INPUT_PULLUP);  pinMode(14, INPUT_PULLUP);#endif* h, s. C  l* E* |9 E2 ?  e
      // 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;  }- E' c9 i# G/ o  X6 i' A0 k  y
      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);  }
    ! z9 i9 N# f! y) `5 S#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)  s->set_vflip(s, 1);  s->set_hmirror(s, 1);#endif$ u- X. H3 ^$ e# `( {
    #if defined(CAMERA_MODEL_ESP32S3_EYE)  s->set_vflip(s, 1);#endif
    ) m# i* q7 d, ?. ]// Setup LED FLash if LED pin is defined in camera_pins.h#if defined(LED_GPIO_NUM)  setupLedFlash(LED_GPIO_NUM);#endif
    . E$ S4 @& Q8 R2 s4 `5 A  WiFi.begin(ssid, password);  WiFi.setSleep(false);
    3 G0 K9 g4 d4 r) s  while (WiFi.status() != WL_CONNECTED) {    delay(500);    Serial.print(".");  }  Serial.println("");  Serial.println("WiFi connected");+ F+ o+ I8 e3 z7 y) [! c
      startCameraServer();
    4 `  ^, d, J# Y# y) \0 b  Serial.print("Camera Ready! Use 'http://");  Serial.print(WiFi.localIP());  Serial.println("' to connect");}
    / `5 C' L3 Z) G3 K2 U3 u& Avoid loop() {  // Do nothing. Everything is done in another task by the web server  delay(10000);}
    5 W/ f# W6 ?6 z! K" d; L) e+ e代码中有几点需要注意:
    7 c& `% P  k* O* G( E# H
    ' V+ C- s) Y; S9 |* P1、宏定义选择适配的摄像头模式。
    / }7 f+ s- C- x
    3 l  P* g# X5 T- f. r
  • // ===================// 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
      R# b6 N" m& W1 U- C& f' D2、无线路由器SSID和密码要填写正确。
      e9 j9 C% ?* [6 f2 |7 a+ Y
    ! m8 J$ q1 g$ F# n
  • // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";
    ' x- S4 f3 A. N, A3、给摄像头供电& V2 ~4 V; l1 J6 f, i' b
    - K+ Z3 ~- d5 N+ F
  • axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电
    / h) n- S( e- C. i4、板卡需要外接天线,否则可能无法连接路由器。( d5 M% d0 b. W) ~' S
    , }4 V& x1 t) @9 o/ ~1 d3 W4 m
    编译下载程序到板卡中,确保局域网访问网络摄像头可正常使用。+ ?2 d7 g! q& v4 ?# _$ H
    20 N+ H% ~+ X# B9 G  A  F
    内网穿透网络摄像头
    : U/ ?3 A3 P# z" a6 _% v0 l内网穿透我们使用花生壳这款软件提供的内网穿透服务。# a0 L3 k% q) f- r9 G5 W
      \6 t5 P$ m0 K! B+ M

    lrisokdrc20640331253.png

    lrisokdrc20640331253.png
    0 t$ g# R; H4 e; \# V9 A5 c

    9 t+ A3 G" n  j  ~4 X在官网下载APP:https://hsk.oray.com/5 M* P0 u& m0 q  F9 h
    , x  n& F1 r* [2 s' }; l9 h" Y
    下载安装完成后,在内网穿透服务点击新建映射,如下图所示: 4 G0 ^' W2 ^  Y: A$ w6 c; [9 ]6 ?7 ?) [
    % ]$ X% [7 Y) W/ ]7 z% G

    kwppxd3ntcm640331354.png

    kwppxd3ntcm640331354.png
    1 a7 O" r8 I; J. a

    & [3 }1 p7 C0 b$ j# `填写新建映射的基本信息,请注意内网主机和内网端口是局域网摄像头的主机和端口(端口默认为80) ,如下图所示:
    ' v  M3 j. J; M' @: E
    : q, K: Z: K' d! y4 p% K  F7 u4 t

    awcfgebibvd640331454.png

    awcfgebibvd640331454.png

    / q/ O% j7 c* ]- ]9 c  T7 f
    3 w* b1 b8 z; B& P& }: [新建映射完成后,可以在APP看到新增的设备列表,如下图所示:: g8 v5 E" J; O, E) R) `$ Q7 S
    0 H1 G% h! U; t& k  b

    fk5jd31l4vr640331554.png

    fk5jd31l4vr640331554.png

    4 |$ v+ T( V' `8 p7 ^! J
    ! ?/ C0 c; p; L) [$ N6 x' t" o复制访问网址,在浏览器中打开:http://2j90962r69.goho.co:47918/7 l5 I2 d! {7 D
    / F: [, l/ g' r# [6 J
    即使不在同一个局域网内也可以正常访问摄像头啦。/ C  E1 C. m0 j: O, i

    / ~/ u% i( F5 L4 R  k

    0vcmctczypi640331654.png

    0vcmctczypi640331654.png

    . c/ }5 |" k; o, o/ `; c
    * [$ q) R6 X* Y: \- z9 S2 P- o- b+ Q# Q# v

    wmbdvo13qbs640331755.png

    wmbdvo13qbs640331755.png
    5 Z3 K& T9 M# M) R/ Q
    往期推荐HarmonyOS学习路之开发篇—Java UI框架(Position和AdaptiveBox layout)% m* Z4 P& q+ U
    Python数据可视化:如何选择合适的图表可视化?
    ) a/ C2 k9 ~4 n# m8 E( P磁耦合共振无线供电装置
    ( {1 O& E! j7 K7 T- l/ uPython Qt GUI设计:表格和树类(提升篇—1)8 G8 g+ h  Q! m  P' s9 K

    8 Y! K  t3 G& u1 [8 Q

    3bs1zciapcw640331855.jpg

    3bs1zciapcw640331855.jpg

    - v5 ^" Y, l6 @( Y- f6 F

    usoexobh1wp640331955.gif

    usoexobh1wp640331955.gif
    4 w( g0 ^  }' q$ Q5 z' R1 |
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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