电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

840

主题

840

帖子

6491

积分

高级会员

Rank: 5Rank: 5

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

zbqnzzlfbyx64015934649.gif

zbqnzzlfbyx64015934649.gif
# F' y2 Q( G0 p; j
点击上方蓝色字体,关注我们
" s/ d7 w* f0 G  k8 d本篇博文使用ESP32-S3搭建网络摄像头,相比较局域网摄像头,本篇博文将分享如何搭建外网可以访问的网络摄像头。
* y% e2 ?6 w) D! I这主要是使用内网穿透技术,内网穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包(这里指局域网摄像头)不被网络地址转换设备屏蔽而正确路由到内网主机。3 c) E% u1 q# a8 M8 J2 u
主要流程分为两步:
. ^+ d' s" r; R! W1、先实现局域网访问网络摄像头;
5 c( Z, d# ?- \, J2、在此基础,使用内网穿透的方式,搭建外网可访问的网络摄像头。8 W" O; |1 l* r, o* A! ]
1
4 I* [% H' ^0 F& I局域网摄像头
5 k0 y2 ]' Q' j: u7 ~3 X8 X4 LESP32实现局域网摄像头的方式比较简单,驱动代码如下:2 s& e2 t1 v8 m9 I$ h& j" X2 [
. _, ?6 \, v+ V4 C7 s; v& o
  • #include "esp_camera.h"#include3 t) H' z5 q2 z
    //// 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 well2 N0 {6 @8 J& x* T. a6 t- [# P  P
    // ===================// 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 ~0 m4 n0 o$ Q# Q1 z#include "camera_pins.h"#include "DFRobot_AXP313A.h"
    7 J2 @6 a3 I) g+ o3 MDFRobot_AXP313A axp;
    / l( T% f9 Z5 d0 q, F// ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";7 c7 m" z7 j$ v! }2 D0 u3 b
    void startCameraServer();void setupLedFlash(int pin);5 l' ~( h' i  g. Z  w) }
    void setup() {  Serial.begin(115200);  Serial.setDebugOutput(true);  Serial.println();# O: {# m3 X! M% p$ u8 f
      while(axp.begin() != 0){    Serial.println("init error");    delay(1000);  }" }/ t7 G9 V- H- e: x* h4 s
      axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电
    3 e3 B, \6 T% l: V, m7 ^$ m  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;5 b( W5 ?% l, V& e8 \
      // 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  }: `' d7 c3 R& J, u
    #if defined(CAMERA_MODEL_ESP_EYE)  pinMode(13, INPUT_PULLUP);  pinMode(14, INPUT_PULLUP);#endif
    # K* h8 [! t: o* T  // 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;  }
    0 P4 l. [6 l' U8 F- G  v  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);  }
    & n9 L/ F: U* P3 L7 ]% e6 ?) f#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)  s->set_vflip(s, 1);  s->set_hmirror(s, 1);#endif6 Z, P/ x/ M: g, o
    #if defined(CAMERA_MODEL_ESP32S3_EYE)  s->set_vflip(s, 1);#endif
    ( q! l2 ^4 V( x5 k7 o% r5 m// Setup LED FLash if LED pin is defined in camera_pins.h#if defined(LED_GPIO_NUM)  setupLedFlash(LED_GPIO_NUM);#endif
    ; W2 Q2 c) }: L  ~# t% |+ T" d  WiFi.begin(ssid, password);  WiFi.setSleep(false);
    # J4 A2 v# W6 k- W! {5 a) R& c  while (WiFi.status() != WL_CONNECTED) {    delay(500);    Serial.print(".");  }  Serial.println("");  Serial.println("WiFi connected");
    ; E/ S8 Y/ ?% x4 C* N; U; M  startCameraServer();* S( ^$ n5 J6 i( _' K
      Serial.print("Camera Ready! Use 'http://");  Serial.print(WiFi.localIP());  Serial.println("' to connect");}
    ' M+ h; w( G. W2 @void loop() {  // Do nothing. Everything is done in another task by the web server  delay(10000);}
    # y/ ~5 ]4 [6 o9 p! n: @代码中有几点需要注意:# t7 P# ?) {: f$ t0 v" U! R  L

    9 e. ~+ d  |+ z$ P1、宏定义选择适配的摄像头模式。! _) }1 K; q1 e# T3 |( _. j, S4 {
    ; z+ ^3 X/ z( x0 D  ?2 G$ y
  • // ===================// 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 ~" \8 p8 t; S0 Y( o0 E8 Z: p
    2、无线路由器SSID和密码要填写正确。
    5 m4 Q. I2 S; \* P0 O1 c# C# d. k2 b+ T! n% z7 o; y
  • // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";! U; U4 _: H; ?( W, o
    3、给摄像头供电
    " f9 S& W% t5 y& w/ I/ `5 {- S6 B5 s' {1 o
  • axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电
    % m/ N# M: F! c/ N0 q" Y4、板卡需要外接天线,否则可能无法连接路由器。
    8 n/ u! `2 _( }, a  W% z5 c
    0 O' j+ N( L, U( z% P编译下载程序到板卡中,确保局域网访问网络摄像头可正常使用。
    8 P' ?+ t/ j; d  V8 j22 M% r8 w2 x; ]) V
    内网穿透网络摄像头
    % d$ q3 A+ e: D4 Z7 H% Y+ ?, v% M内网穿透我们使用花生壳这款软件提供的内网穿透服务。9 q/ u; w; t! J/ J- i
    - x6 c8 q$ Q2 N5 G

    dttrqmvbu4x64015934750.png

    dttrqmvbu4x64015934750.png

    % D! [! d1 O/ h4 U8 X. {: p  V/ K' b3 V# h& L6 V+ N
    在官网下载APP:https://hsk.oray.com/3 y+ k% P2 ~2 E5 b: G0 @
    ; |9 F# @, K( i% s& ]3 J. q7 n4 R
    下载安装完成后,在内网穿透服务点击新建映射,如下图所示: : ?+ K  r' t7 I3 e0 k) Z

    : k( f' P- c% }" t8 T/ B5 o/ B0 d

    1bbr34sidfm64015934850.png

    1bbr34sidfm64015934850.png

    9 _% h, p8 ?( j  S, n7 p  {( i
    : [* _9 w, F# F' a! s% x填写新建映射的基本信息,请注意内网主机和内网端口是局域网摄像头的主机和端口(端口默认为80) ,如下图所示:
    : t$ k/ k" R& B* k
    4 b/ x; g0 s  u) Z

    duxl423cvwd64015934950.png

    duxl423cvwd64015934950.png
    2 i0 C7 O2 O! U; J3 T) n

    , B! c) o) D( h3 s& r2 U+ b* g* t新建映射完成后,可以在APP看到新增的设备列表,如下图所示:
    ) @9 o/ a. B; g3 o( }- r$ S5 d  A3 h7 Q) \

    2c1v3pckhpb64015935050.png

    2c1v3pckhpb64015935050.png

    * M# x: Z% h) o% m% t* ]' K# d/ T0 x( ^
    复制访问网址,在浏览器中打开:http://2j90962r69.goho.co:47918/
    8 X) w8 |; l1 H' v$ Y8 f: r! J9 n( i1 s% {0 e+ R! X) m3 J) ?
    即使不在同一个局域网内也可以正常访问摄像头啦。# K4 W. ]; O' L6 }$ M

    % z  \5 U4 h% R- w. ~2 [* j. K; [* w

    tndj42z4axt64015935151.png

    tndj42z4axt64015935151.png
    9 r' `8 A, A6 q6 d+ D, k; H5 F+ I( l
    2 i3 D5 m+ B" G3 ]3 }
    ) v# E0 j, \9 g* p' v0 ^+ z

    xlnz0k2y1nn64015935251.png

    xlnz0k2y1nn64015935251.png
    ( Y# ]6 x- W# ?6 b/ B
    往期推荐HarmonyOS学习路之开发篇—Java UI框架(Position和AdaptiveBox layout)
    ( T: q2 A3 J: o/ f4 D! G2 MPython数据可视化:如何选择合适的图表可视化?
    2 W& n( U1 C" }# ~9 l5 q磁耦合共振无线供电装置
    . E3 f9 v' `' Q0 m' m7 V0 vPython Qt GUI设计:表格和树类(提升篇—1)3 `( a/ O: z& X$ S3 W0 {( k' z

    1 ^. c; ?# i& Q  _

    qim5pouk0fb64015935351.jpg

    qim5pouk0fb64015935351.jpg
    6 l$ Q4 K, F- P- \3 G& G; ?# C

    0jpvlcj4kpz64015935451.gif

    0jpvlcj4kpz64015935451.gif
    4 q) P0 }  ~6 c1 Z
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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