电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

840

主题

840

帖子

6491

积分

高级会员

Rank: 5Rank: 5

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

x5fiifvwdpe64018783547.gif

x5fiifvwdpe64018783547.gif
" A) ?$ W2 I* }4 s
点击上方蓝色字体,关注我们9 c; I4 P( r3 d8 R5 h2 X/ A$ h
本篇博文使用ESP32-S3搭建网络摄像头,相比较局域网摄像头,本篇博文将分享如何搭建外网可以访问的网络摄像头。
9 n3 A% G& ^5 e! m1 t+ S8 V这主要是使用内网穿透技术,内网穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包(这里指局域网摄像头)不被网络地址转换设备屏蔽而正确路由到内网主机。2 h: t, Y2 a- d6 R) m) j
主要流程分为两步:
% v- V0 i& }0 B1、先实现局域网访问网络摄像头;
0 K2 J" i, [( z" u2、在此基础,使用内网穿透的方式,搭建外网可访问的网络摄像头。( P- R8 u& K/ A: d) [
1
# m# W9 M( w& t5 V/ {3 l局域网摄像头
: W. c" I0 W: x3 _$ q9 T, N' TESP32实现局域网摄像头的方式比较简单,驱动代码如下:
% G' ?6 S/ E* q. t3 s1 {0 B- y+ W% s/ a. F& q: X$ M' G
  • #include "esp_camera.h"#include
    , N. b6 Z3 p* K: Y0 {//// 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
    6 M# H' q& A7 K3 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 PSRAM2 ]& U7 G# u5 j' G: K* n$ _# U
    #include "camera_pins.h"#include "DFRobot_AXP313A.h"2 a( f5 s5 h! B& T
    DFRobot_AXP313A axp;# ]) P: L& p: D; g
    // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";/ `1 O1 x+ ~- c6 x& s  D
    void startCameraServer();void setupLedFlash(int pin);. U1 {# F( U7 R% w& k- v
    void setup() {  Serial.begin(115200);  Serial.setDebugOutput(true);  Serial.println();
    4 O; E. z: U8 U* Y- ]. W6 j4 t* b  while(axp.begin() != 0){    Serial.println("init error");    delay(1000);  }" Y% v* e3 t& G/ ^
      axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电* s1 P0 V; i2 c9 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;
    9 w6 V& M  I' G& Z% w  // 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  }4 J2 H; s( j: X' I
    #if defined(CAMERA_MODEL_ESP_EYE)  pinMode(13, INPUT_PULLUP);  pinMode(14, INPUT_PULLUP);#endif
    7 E2 s6 ]/ I, z) [: e) J1 s* 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;  }( p2 N1 v: f% m
      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);  }
    : H, r% @% B  E. f#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)  s->set_vflip(s, 1);  s->set_hmirror(s, 1);#endif0 F. b" x/ _! W. A9 w1 ~
    #if defined(CAMERA_MODEL_ESP32S3_EYE)  s->set_vflip(s, 1);#endif7 p# r% \; J! ~' p% _" M4 S
    // Setup LED FLash if LED pin is defined in camera_pins.h#if defined(LED_GPIO_NUM)  setupLedFlash(LED_GPIO_NUM);#endif6 \* E- F! \0 x
      WiFi.begin(ssid, password);  WiFi.setSleep(false);
    5 W2 s! |) C( }' c& K% Q. H+ ^/ a/ T  while (WiFi.status() != WL_CONNECTED) {    delay(500);    Serial.print(".");  }  Serial.println("");  Serial.println("WiFi connected");
    % F" s' j( l  G$ V( ]/ r1 ?' X* Q  startCameraServer();
    - O; u' f1 I- H  Serial.print("Camera Ready! Use 'http://");  Serial.print(WiFi.localIP());  Serial.println("' to connect");}! P7 }# b6 @2 B: s1 u" A
    void loop() {  // Do nothing. Everything is done in another task by the web server  delay(10000);}% e6 V) q$ {# j1 Z* P2 I" t
    代码中有几点需要注意:( X8 `% m  ^2 d) Q( u4 [

    5 `; R# O: p9 p+ C1、宏定义选择适配的摄像头模式。+ M6 F% s; E  V) P
    ) J7 Q6 t% q# |. 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 PSRAM9 |& m8 D3 e0 Y2 h6 k3 S
    2、无线路由器SSID和密码要填写正确。1 w6 H# C6 o+ E6 }% S2 g
    7 y: f' u% Y' `& X+ D
  • // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";
    5 w( O8 g( R) p! [1 D8 K6 d3、给摄像头供电
    + V/ D5 }( }* a% x; Z: h- q$ V# a( Q* N  f# ^6 R" f* x
  • axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电2 Z2 T/ E: b. G/ u* f: t1 i
    4、板卡需要外接天线,否则可能无法连接路由器。
    1 T2 C0 O2 Y! ^) I% b4 W# ~. g0 Z9 i! E* f4 ?  d
    编译下载程序到板卡中,确保局域网访问网络摄像头可正常使用。
    # A& e+ }2 v2 _: h6 x  @$ X22 Z" v) ~5 r9 A; P8 G  }3 n
    内网穿透网络摄像头
    * z; O, b) L0 p  Y2 {* q: ?内网穿透我们使用花生壳这款软件提供的内网穿透服务。
    6 f: r0 E1 X8 h9 g% v
    9 C) d( @, b" D* @

    hp4tqyfzfsy64018783647.png

    hp4tqyfzfsy64018783647.png

    ) s% x  O& ]! o; P+ ^5 v, f& r+ M; J0 Z/ P4 k' x
    在官网下载APP:https://hsk.oray.com/
    $ T3 \2 r. a( g: I2 N
    4 l  r1 ^6 P" U下载安装完成后,在内网穿透服务点击新建映射,如下图所示: 8 l4 e' J1 M6 B8 B# f
      A. V4 T1 e6 u$ X

    fdv4jqxwmam64018783747.png

    fdv4jqxwmam64018783747.png

    / ~. T2 M# G8 w' n. b5 Z
    " b+ _4 D6 r2 y" _1 U, X填写新建映射的基本信息,请注意内网主机和内网端口是局域网摄像头的主机和端口(端口默认为80) ,如下图所示:; O: E5 o; [, Y9 O9 W' w
    ; Z& E' p9 y' x1 b. R

    fi4gcxms43o64018783847.png

    fi4gcxms43o64018783847.png
    ' I8 J7 g$ p- E; N: J0 m  e
    ( a; h) ^5 {' t6 C- s
    新建映射完成后,可以在APP看到新增的设备列表,如下图所示:
    ) U8 q' V% W+ J8 E5 E/ |
    ; l4 t; U: ^; l8 |9 X

    ag13lv3ogi064018783947.png

    ag13lv3ogi064018783947.png
    / l4 g* ]# v# ?& H3 b& z; w8 ~
    + ]% ]; ]4 x0 U* `  U4 g) j9 X
    复制访问网址,在浏览器中打开:http://2j90962r69.goho.co:47918/! q+ `4 J  \( W$ m8 v8 y6 {
    7 B& o* A. ]4 A/ S
    即使不在同一个局域网内也可以正常访问摄像头啦。1 `! r) ~, [0 u( h7 c4 o9 W% _
      v- l* x0 i6 \8 }4 I5 H' u

    fw3p51pmmbg64018784047.png

    fw3p51pmmbg64018784047.png

    5 F# J1 u( X# Y9 S3 [; @: d
      i6 B4 i% j( j( K# g$ f5 T0 ]' Q4 B

    bt0pj5qdqb564018784147.png

    bt0pj5qdqb564018784147.png
    4 g4 Q! W- j. h% R) Y! z7 N' o: l
    往期推荐HarmonyOS学习路之开发篇—Java UI框架(Position和AdaptiveBox layout), y- ~8 U) s) }+ ~  n* b4 o
    Python数据可视化:如何选择合适的图表可视化?
    ; B, K4 w5 R" V+ p6 R磁耦合共振无线供电装置
      N. c4 i8 e& D# ?6 R( n4 o! zPython Qt GUI设计:表格和树类(提升篇—1)
    ! M3 G! _- V4 x8 A5 U' n5 l

    . N: q! D. Y3 F/ N# m

    sopdf4sybcj64018784248.jpg

    sopdf4sybcj64018784248.jpg

    8 y# q8 _5 ^1 [2 [7 ?: ~

    oc5yigapjja64018784348.gif

    oc5yigapjja64018784348.gif
    ) m. ~- X  B; g+ Z3 L4 Z2 k) s
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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