电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

854

主题

854

帖子

8396

积分

高级会员

Rank: 5Rank: 5

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

von13gkqhho64023062042.gif

von13gkqhho64023062042.gif

+ e( e% ^- o9 g0 R点击上方蓝色字体,关注我们& n3 y$ q; Q- o" P6 w) u6 F
本篇博文使用ESP32-S3搭建网络摄像头,相比较局域网摄像头,本篇博文将分享如何搭建外网可以访问的网络摄像头。
9 C4 F( a& \% v  l' n& |这主要是使用内网穿透技术,内网穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包(这里指局域网摄像头)不被网络地址转换设备屏蔽而正确路由到内网主机。! h" r* w8 y$ u) _( c  ]2 Z5 ]
主要流程分为两步:
7 y% g( F& W7 d) N: t: C7 Z: P0 T1、先实现局域网访问网络摄像头;
  B3 q/ K1 q) \& a+ w  [. S8 h2、在此基础,使用内网穿透的方式,搭建外网可访问的网络摄像头。
8 g+ N- i" D3 `1
* y7 c: a! r+ o' h局域网摄像头
$ c8 ^8 a, ]6 c7 l4 t) mESP32实现局域网摄像头的方式比较简单,驱动代码如下:' M  ]7 _6 |2 k% S9 y( c  ^
. T" Y5 y- E; C7 x9 D3 }
  • #include "esp_camera.h"#include7 |) d- M& P& K, u0 r/ k( e
    //// 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* j( i2 J2 G7 S1 ^  g
    // ===================// 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
    4 N4 I( j, T: _" A6 x  Y#include "camera_pins.h"#include "DFRobot_AXP313A.h"
    / h4 E) h1 s: m) i, _, J. sDFRobot_AXP313A axp;  ?1 P" p6 C) ?2 A2 w: T: H: w
    // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";- U+ S& T. m$ l8 c% G, G0 \
    void startCameraServer();void setupLedFlash(int pin);
    - w% y0 r+ L3 M  N7 p$ Xvoid setup() {  Serial.begin(115200);  Serial.setDebugOutput(true);  Serial.println();* P, Z; d$ r8 Y* B
      while(axp.begin() != 0){    Serial.println("init error");    delay(1000);  }
    4 a  L( }. L+ F! r+ b5 T  axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电
    : I4 r" b3 `) C/ i! }0 M. F  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;" P' p0 _9 b. Y2 Q7 w. G6 D2 u3 I
      // 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  }; L& c5 W) ?% Q9 A7 x0 a
    #if defined(CAMERA_MODEL_ESP_EYE)  pinMode(13, INPUT_PULLUP);  pinMode(14, INPUT_PULLUP);#endif
    ' o& o& W' }" F- S! q  // 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;  }/ K8 ~4 ~  G; f! L
      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);  }
    : X  d0 ~+ |1 t$ ~1 \) u#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)  s->set_vflip(s, 1);  s->set_hmirror(s, 1);#endif
    5 R! A( W' H! L( @/ h4 k8 x& ?#if defined(CAMERA_MODEL_ESP32S3_EYE)  s->set_vflip(s, 1);#endif) R: X5 G3 x' T) O
    // Setup LED FLash if LED pin is defined in camera_pins.h#if defined(LED_GPIO_NUM)  setupLedFlash(LED_GPIO_NUM);#endif# S1 D  q* M8 k. w# m7 I
      WiFi.begin(ssid, password);  WiFi.setSleep(false);
    4 T* M/ B% z  {% P  while (WiFi.status() != WL_CONNECTED) {    delay(500);    Serial.print(".");  }  Serial.println("");  Serial.println("WiFi connected");! U  C8 ~7 T* R  D4 r/ `6 p
      startCameraServer();
      H2 B2 r4 T/ r  Serial.print("Camera Ready! Use 'http://");  Serial.print(WiFi.localIP());  Serial.println("' to connect");}% f3 v3 S$ V- F& E1 ]9 _- ]* t& H
    void loop() {  // Do nothing. Everything is done in another task by the web server  delay(10000);}  Y* a+ P- D* A, }  ]
    代码中有几点需要注意:$ d9 m% U- l4 N+ N( x

    % f4 }! S( ]2 E, z( C6 C  H, x* R% e1、宏定义选择适配的摄像头模式。
    / F% t: G; i- t  x) Z2 S+ s" S" d2 Q! I5 m& I! Q
  • // ===================// 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
    3 v( Y  |5 ], L0 X+ j2、无线路由器SSID和密码要填写正确。9 K1 p) p4 i" v$ ?( ^2 X
    / ?5 q) }* l" Y/ e1 e
  • // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";7 k/ z2 o/ s( h6 a5 v' D* X
    3、给摄像头供电
    / y$ s6 s. X0 B2 d2 ?* L# U  D9 J: a* c0 s# u, i
  • axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电# l8 g1 |0 O. i( s' X, S
    4、板卡需要外接天线,否则可能无法连接路由器。2 ?0 `! i: b$ x4 Z2 d" _

    7 X1 F0 Y9 Y- F% x2 j7 `编译下载程序到板卡中,确保局域网访问网络摄像头可正常使用。
    + e' c9 n; I: S4 ]) ?  q7 ~$ V2
    " u4 I3 @" m/ M# r% ^8 d% _内网穿透网络摄像头: ^8 D& p% p3 W4 N2 v
    内网穿透我们使用花生壳这款软件提供的内网穿透服务。# D5 s' `& W' L" J1 q
    2 Y: Z$ f+ q5 L& k7 T, y+ F! p# i

    bhp4yyhj5vh64023062142.png

    bhp4yyhj5vh64023062142.png
    % ^" |+ ?0 Y- _( ]9 U5 M
    : F) ^4 m8 t! c
    在官网下载APP:https://hsk.oray.com/9 w( K: u' W; n! P/ }

    7 ~0 Z' a" g& e" |9 v3 I下载安装完成后,在内网穿透服务点击新建映射,如下图所示: 9 c3 e$ G; q. b6 M. Q' _
    4 ~+ ~. S, k/ s! H6 F1 L

    t4a4vslzp0u64023062242.png

    t4a4vslzp0u64023062242.png
    3 H, a& x# T3 C1 |/ p3 I

    6 f0 b; ~7 r3 o" _1 K+ V3 m填写新建映射的基本信息,请注意内网主机和内网端口是局域网摄像头的主机和端口(端口默认为80) ,如下图所示:& X8 t* i- \. W. S( `
    * C! i; M9 o0 E1 L- t: h, m* j" t

    2izd0v4nrch64023062343.png

    2izd0v4nrch64023062343.png

    6 [) L% n# z) Q/ [0 q) k1 s- X% b9 U* d- q' o+ }
    新建映射完成后,可以在APP看到新增的设备列表,如下图所示:7 e+ ?( M) |; y- v5 ]; |

      c  p' l9 i  x& a

    zn0jm4glh0564023062443.png

    zn0jm4glh0564023062443.png
    4 Y) G! K5 x5 x

    3 W& D  @9 Y. w* Y( @* i复制访问网址,在浏览器中打开:http://2j90962r69.goho.co:47918/  `' A: L) ?4 l! |0 g. u& `! g9 T/ p

    * I; y; P% h1 F- [' ]* V+ V即使不在同一个局域网内也可以正常访问摄像头啦。3 _8 ^# d, c+ t/ `& j
    ' y- [% ^1 N6 _

    co5541bktqx64023062543.png

    co5541bktqx64023062543.png
    4 }/ q/ o2 p' y4 u
    6 V" ~# [$ w! ?8 w# n& t; C% H* X7 {

    6 b: n/ _' p: d* K( U; c4 a6 T5 y. F

    1l4p35bmys064023062643.png

    1l4p35bmys064023062643.png

    5 g- T  L) U3 b, @4 f- o+ V$ a往期推荐HarmonyOS学习路之开发篇—Java UI框架(Position和AdaptiveBox layout)& N9 b! b5 r( X; q) r8 [: A9 \3 \
    Python数据可视化:如何选择合适的图表可视化?
    ! D+ l' L) r: f+ X$ h  l磁耦合共振无线供电装置+ d; w+ m4 R3 u! N" f
    Python Qt GUI设计:表格和树类(提升篇—1)
    9 L9 ~% l  E! c9 G( l" i
    # ^8 [- r/ }  G* M! ^+ [

    brbiutrx2if64023062743.jpg

    brbiutrx2if64023062743.jpg

    4 c6 A" B( k' X5 n

    pgpa5cv4whb64023062843.gif

    pgpa5cv4whb64023062843.gif
    8 c- F" ~* x' [5 Y
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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