电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

1001

主题

1001

帖子

8805

积分

高级会员

Rank: 5Rank: 5

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

rfaefhoaoi064011337440.gif

rfaefhoaoi064011337440.gif
: |/ d2 X/ F$ M
点击上方蓝色字体,关注我们
% D  K( p# L: k% [8 Q, D本篇博文使用ESP32-S3搭建网络摄像头,相比较局域网摄像头,本篇博文将分享如何搭建外网可以访问的网络摄像头。; W. D& W. }$ o8 z
这主要是使用内网穿透技术,内网穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包(这里指局域网摄像头)不被网络地址转换设备屏蔽而正确路由到内网主机。
! {$ X: g  f& o9 I* d' @主要流程分为两步:- K5 ]  y: C% P$ {" }
1、先实现局域网访问网络摄像头;6 o$ H2 ?4 W- L& U  Y  `( |3 g
2、在此基础,使用内网穿透的方式,搭建外网可访问的网络摄像头。7 e) u- @6 a: a0 ]
16 A& b0 B5 d$ N# ^# f
局域网摄像头& }0 E" e9 @+ n5 A/ A/ N; }
ESP32实现局域网摄像头的方式比较简单,驱动代码如下:' F7 _) b4 L# j# Z7 C# E' T; x# V+ F
1 r' L# F* a  V$ n1 h2 u
  • #include "esp_camera.h"#include
    . E3 ]1 ~4 q2 z6 L6 a! w1 [) S//// 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 well0 x. \  V+ m5 U$ L9 u
    // ===================// 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 PSRAM0 K4 [5 j2 v2 C3 [: w2 i
    #include "camera_pins.h"#include "DFRobot_AXP313A.h"
    + d" W1 B0 A4 s' L% q+ F# m+ |DFRobot_AXP313A axp;+ m* N8 J" V% ?) K2 y
    // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";# s5 |" Z, ^- R2 w, D
    void startCameraServer();void setupLedFlash(int pin);: }; N; D3 [% _; H% c
    void setup() {  Serial.begin(115200);  Serial.setDebugOutput(true);  Serial.println();
    : Q4 ]' G) k: [8 o: U, N9 P  while(axp.begin() != 0){    Serial.println("init error");    delay(1000);  }: w4 Z$ M) N  c0 _7 H$ w6 T+ x! Q
      axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电& S+ k3 h+ ?0 {# k: l( `
      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;
    . e& A* i, _$ p+ L" b! A; L7 _  // 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  }
    ! g7 g/ ^" Y8 Q# }9 `, R7 Y#if defined(CAMERA_MODEL_ESP_EYE)  pinMode(13, INPUT_PULLUP);  pinMode(14, INPUT_PULLUP);#endif% y4 H* m  a) j: h5 y+ G* F7 `
      // 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;  }
    ' p5 s0 f/ M7 t+ Y! k  U  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);  }; k) P* R4 q7 H6 P# F
    #if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)  s->set_vflip(s, 1);  s->set_hmirror(s, 1);#endif2 B+ T: F2 V6 k/ V2 |- b6 o
    #if defined(CAMERA_MODEL_ESP32S3_EYE)  s->set_vflip(s, 1);#endif: v. B( }1 r* l
    // Setup LED FLash if LED pin is defined in camera_pins.h#if defined(LED_GPIO_NUM)  setupLedFlash(LED_GPIO_NUM);#endif( a  u/ |8 Y8 D# J' n" V
      WiFi.begin(ssid, password);  WiFi.setSleep(false);2 J( z" n! l5 b/ ]6 ]: C
      while (WiFi.status() != WL_CONNECTED) {    delay(500);    Serial.print(".");  }  Serial.println("");  Serial.println("WiFi connected");
      [: `" P: Z3 N  startCameraServer();9 E: [+ d+ G: K, c; Z4 _4 ?) h. w" f
      Serial.print("Camera Ready! Use 'http://");  Serial.print(WiFi.localIP());  Serial.println("' to connect");}7 z' w2 w3 [& u- k+ u
    void loop() {  // Do nothing. Everything is done in another task by the web server  delay(10000);}! {2 u+ S' A, k+ }9 o/ ?8 d4 Q/ z
    代码中有几点需要注意:' h( z8 A/ ?  m* f

    9 W6 L+ V; S5 I4 v1、宏定义选择适配的摄像头模式。( _: _& N9 E4 O- y

    7 h* t" S0 _+ D
  • // ===================// 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 PSRAM2 @. Y- V$ p: G5 F! }
    2、无线路由器SSID和密码要填写正确。9 x( ?" R" P4 ^, ?  N+ c

    ) k5 i% p9 C- ~$ \+ T1 B
  • // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";4 G* F. c0 W8 t$ X; }  e# ~$ g- V
    3、给摄像头供电! L+ j0 V8 `6 f, d- A( T( ~

    1 f/ `! r# Y9 }2 q; e. W& o: j
  • axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电
    3 s4 n' K0 r* l4、板卡需要外接天线,否则可能无法连接路由器。+ `! V8 y6 c9 q. |) j$ t

    $ z+ _% B4 q( M7 u编译下载程序到板卡中,确保局域网访问网络摄像头可正常使用。; o( B2 M( ^0 C1 c6 ]7 m/ y6 n5 Z. @
    2
    # f5 s( ?  [8 D  O  L; Q2 y内网穿透网络摄像头
    + w" q: Z4 j3 k, d8 J5 y内网穿透我们使用花生壳这款软件提供的内网穿透服务。
    ! Q: K( D* B9 Q- \' s$ D  D4 R! r
    , v( C" Z) h+ ^& C# ?

    3lfxtyznlrd64011337540.png

    3lfxtyznlrd64011337540.png
    - ]) \* L9 D( Q. N: E7 T  U

    # n( f+ O: l% `$ r在官网下载APP:https://hsk.oray.com// p( J- {) h& P. d# O8 C
      ]8 K# O2 N* X
    下载安装完成后,在内网穿透服务点击新建映射,如下图所示:
    - d! P! W  ?, z: d8 J9 a' C
    ; ]) q  C2 S0 A' r; P4 ]' U

    rpgbgw2g41b64011337641.png

    rpgbgw2g41b64011337641.png

    3 L$ J  L0 S/ x, K
    . x+ ~" W2 K8 C' e填写新建映射的基本信息,请注意内网主机和内网端口是局域网摄像头的主机和端口(端口默认为80) ,如下图所示:% R) [6 W" ]1 C! C1 ?+ x: q
    - @. x% R& R" ?, [: X

    q0c3b1hvwqd64011337741.png

    q0c3b1hvwqd64011337741.png

    $ g+ F6 x) h/ f, r1 ^- q  Z: Z3 ~1 J8 _4 g
    新建映射完成后,可以在APP看到新增的设备列表,如下图所示:
    $ T4 M/ F% y& J7 a9 B$ z4 T/ m# H6 M' ~

    jpntetpardb64011337841.png

    jpntetpardb64011337841.png
    ) b; U: N. z  L

    $ [, m. }$ Q# @) y, V复制访问网址,在浏览器中打开:http://2j90962r69.goho.co:47918// p2 b0 M6 v6 z# R- \: }- q! x

    ! j# O' _0 u% d- k9 \8 D即使不在同一个局域网内也可以正常访问摄像头啦。! k6 A+ T/ d0 w7 Q- j$ Q
    9 ~. Q' l7 T2 D: y' \. m  h

    seuqxikv5et64011337941.png

    seuqxikv5et64011337941.png
    ( S0 J- B. M( k7 B5 P$ @
    3 C2 l/ G+ F  M  ~. t1 @

    ' `% {9 L2 Q# r( `/ Q$ O

    15dszar1me464011338041.png

    15dszar1me464011338041.png

    1 p  s: P, O: ?4 o8 h往期推荐HarmonyOS学习路之开发篇—Java UI框架(Position和AdaptiveBox layout)5 N2 ^) C" s3 Q+ K
    Python数据可视化:如何选择合适的图表可视化?. D4 v" ~" l+ @# s) ]8 x' E( l
    磁耦合共振无线供电装置
    % w4 D) Y* a( |; Q4 F3 JPython Qt GUI设计:表格和树类(提升篇—1)
      n, ]- X$ Y* [% R4 t2 @  H
    % K9 X$ `6 ^* e: U5 G( G& G

    41rkstvxwvl64011338141.jpg

    41rkstvxwvl64011338141.jpg

    : ^5 I. w+ m7 D8 M

    g0bwzytg1q564011338241.gif

    g0bwzytg1q564011338241.gif
    2 o: I% u0 V( H8 q) Z9 _" p7 D5 R
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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