电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

1001

主题

1001

帖子

8805

积分

高级会员

Rank: 5Rank: 5

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

x5fiifvwdpe64018783547.gif

x5fiifvwdpe64018783547.gif
8 \  k; T' }8 U( L3 I, b- b
点击上方蓝色字体,关注我们0 F0 k6 Q) p" M3 j6 F3 U' w. e+ ~
本篇博文使用ESP32-S3搭建网络摄像头,相比较局域网摄像头,本篇博文将分享如何搭建外网可以访问的网络摄像头。
1 H8 {7 R, |( v7 t7 c这主要是使用内网穿透技术,内网穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包(这里指局域网摄像头)不被网络地址转换设备屏蔽而正确路由到内网主机。
$ g3 g' D- }/ E# V# t8 ~主要流程分为两步:' N- ^# {! O  R* W. O- C
1、先实现局域网访问网络摄像头;% `- B2 R5 B/ S2 w! M3 m; s
2、在此基础,使用内网穿透的方式,搭建外网可访问的网络摄像头。
3 G5 n( e* _8 \1! C, b: w5 H. B- F. J# t4 {
局域网摄像头( N% e, @, }8 d9 a2 f  V1 q% l
ESP32实现局域网摄像头的方式比较简单,驱动代码如下:
8 P8 L3 X( E; t' r
1 z3 ^+ Z% d6 y& r! q
  • #include "esp_camera.h"#include
    1 }" Z/ V/ _$ }% w1 Y' B5 k//// 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 well6 D7 k5 w- U0 k4 _2 z5 M
    // ===================// 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
      t$ j; R  G1 C" Z6 f+ v; h8 u0 n#include "camera_pins.h"#include "DFRobot_AXP313A.h"5 J5 i# ], x$ j7 F7 A( |
    DFRobot_AXP313A axp;! z% \  G9 _( k- u
    // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";6 i+ V, O, F! m6 t- g
    void startCameraServer();void setupLedFlash(int pin);' d8 s8 D, _/ L/ |- g
    void setup() {  Serial.begin(115200);  Serial.setDebugOutput(true);  Serial.println();. R3 \. T3 `5 R
      while(axp.begin() != 0){    Serial.println("init error");    delay(1000);  }
    5 g- x9 }. b+ p3 I  axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电
    2 O+ b! k- r0 |8 ^, P8 c! z  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;
      S3 Z" \8 h7 ^! y  // 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  }
    6 j2 N: w0 P( [2 i# V1 t: i2 B1 s: o/ R#if defined(CAMERA_MODEL_ESP_EYE)  pinMode(13, INPUT_PULLUP);  pinMode(14, INPUT_PULLUP);#endif( M# ~' d6 n. b
      // 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;  }
    : \5 b3 `+ Q8 U# G7 Y( \+ }# W2 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);  }% q- e7 w5 O1 ?5 t+ ]& ~
    #if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)  s->set_vflip(s, 1);  s->set_hmirror(s, 1);#endif
    ; K: l1 R" H5 B#if defined(CAMERA_MODEL_ESP32S3_EYE)  s->set_vflip(s, 1);#endif7 o5 N5 t! M1 k9 `9 O
    // Setup LED FLash if LED pin is defined in camera_pins.h#if defined(LED_GPIO_NUM)  setupLedFlash(LED_GPIO_NUM);#endif
    : @% [# L3 m5 ~% ]8 G  WiFi.begin(ssid, password);  WiFi.setSleep(false);8 C, c. g. z) w
      while (WiFi.status() != WL_CONNECTED) {    delay(500);    Serial.print(".");  }  Serial.println("");  Serial.println("WiFi connected");
    ! G# h# [! [, V6 l5 R" a+ D  startCameraServer();
    ) \( S1 D' V! {3 _  Serial.print("Camera Ready! Use 'http://");  Serial.print(WiFi.localIP());  Serial.println("' to connect");}% V: m" F6 c$ s( G
    void loop() {  // Do nothing. Everything is done in another task by the web server  delay(10000);}
    # j# z7 }; ^7 i# [9 e! W( x! Q代码中有几点需要注意:
    0 Z4 p" [& e3 ~* ]' E! n9 I% t6 ?. n  q
    : F* L+ L# P8 e6 A' W0 r1、宏定义选择适配的摄像头模式。
    ; i* C8 }( q8 ^/ ]* D. N! S' P1 J
  • // ===================// 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% B( `% Z5 j" l) P
    2、无线路由器SSID和密码要填写正确。
    + z) l+ \4 O; J9 Q
    ; V/ Z5 l: s& V% p8 ~5 w# M
  • // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";
    6 j; R6 {7 j+ x, U( v3、给摄像头供电
    # J) t2 i# O- x$ b6 }8 H3 e3 X& \( D$ X0 v
  • axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电. Q$ C. `+ U! N/ W' d5 O
    4、板卡需要外接天线,否则可能无法连接路由器。6 `, I9 Z- F8 S! ~' V9 E

    6 o2 c, n! P! D0 m) H2 t' x编译下载程序到板卡中,确保局域网访问网络摄像头可正常使用。0 E5 B' |" ?' f. b' m: a. B
    2
    + J5 ?  T4 @2 B- Z0 d5 f" P' S内网穿透网络摄像头1 |7 t2 @7 ~) G+ `
    内网穿透我们使用花生壳这款软件提供的内网穿透服务。
      M7 m" D! b; a- V4 G5 ^0 S. g5 r1 m3 I, z& C

    hp4tqyfzfsy64018783647.png

    hp4tqyfzfsy64018783647.png

    " u1 P/ {$ y) f$ Q" D
    * s8 p+ J$ r; _2 g在官网下载APP:https://hsk.oray.com/' U7 S8 z& y3 X& M
    ! Z+ o$ ]! y$ ^
    下载安装完成后,在内网穿透服务点击新建映射,如下图所示: 2 j' p4 j( C$ x4 S2 _

    3 j3 ~. `/ @( d

    fdv4jqxwmam64018783747.png

    fdv4jqxwmam64018783747.png

    $ Q( d2 w" x3 n9 L
    2 F0 T; u% u0 D9 \# E2 o! c$ ~填写新建映射的基本信息,请注意内网主机和内网端口是局域网摄像头的主机和端口(端口默认为80) ,如下图所示:3 ?/ l5 N& `" P9 X; P3 f
    ! p- Z' `; }& Q; Z+ Q( U

    fi4gcxms43o64018783847.png

    fi4gcxms43o64018783847.png

    2 H3 C  J% D2 o. d4 J6 w  e0 a
    5 z# h5 V0 L- s* q7 f; A新建映射完成后,可以在APP看到新增的设备列表,如下图所示:- _# P7 A2 f1 M; j+ k, c& q& o5 r
    ; ~0 |; N3 o: {4 T/ ~

    ag13lv3ogi064018783947.png

    ag13lv3ogi064018783947.png

    - J. ?& {+ A9 s+ b
    8 {0 ]" c# \2 Q' u' R6 ?4 \复制访问网址,在浏览器中打开:http://2j90962r69.goho.co:47918/. L" v# A) ?/ c! Y* t: U7 N
    % |% v& [5 b* O- t5 c+ T# ~( v, q
    即使不在同一个局域网内也可以正常访问摄像头啦。! \$ P0 V8 J  N! k/ d- ^1 B% F

    8 H" P0 j& p6 Q' B% w7 n% l

    fw3p51pmmbg64018784047.png

    fw3p51pmmbg64018784047.png
    7 V* Y0 V; ]7 o4 e- x9 z# `7 \& L
    6 _' o" B  b+ N- u9 z) d

    2 x, h6 z$ ^( W7 a' e4 r1 z

    bt0pj5qdqb564018784147.png

    bt0pj5qdqb564018784147.png

    / _* C) I% n1 f往期推荐HarmonyOS学习路之开发篇—Java UI框架(Position和AdaptiveBox layout); W# d! O  K9 J8 K
    Python数据可视化:如何选择合适的图表可视化?; X* u# W$ Z6 s! d
    磁耦合共振无线供电装置: ^$ n; U/ g( b2 w" p
    Python Qt GUI设计:表格和树类(提升篇—1)
    + q9 v8 F* i! f- z

    % F' W. T7 Z2 |2 `# d6 A1 B

    sopdf4sybcj64018784248.jpg

    sopdf4sybcj64018784248.jpg
    9 V+ L% x0 D/ q/ ~7 j6 n

    oc5yigapjja64018784348.gif

    oc5yigapjja64018784348.gif
    - B+ v( L) B. }( H3 Z! \0 O$ w
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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