电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

752

主题

752

帖子

6398

积分

高级会员

Rank: 5Rank: 5

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

von13gkqhho64023062042.gif

von13gkqhho64023062042.gif
0 Q- ~1 j5 o, P8 @( ?7 y
点击上方蓝色字体,关注我们- k5 Q! P4 l) r
本篇博文使用ESP32-S3搭建网络摄像头,相比较局域网摄像头,本篇博文将分享如何搭建外网可以访问的网络摄像头。
( `( b- R& }+ d. y  z1 @这主要是使用内网穿透技术,内网穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包(这里指局域网摄像头)不被网络地址转换设备屏蔽而正确路由到内网主机。
1 `  e. y' H2 q" l2 E8 T4 v主要流程分为两步:( w% q5 I' f* W
1、先实现局域网访问网络摄像头;
9 K6 `2 P) J$ `" |2、在此基础,使用内网穿透的方式,搭建外网可访问的网络摄像头。7 X( e3 _! a% Z* ]3 A  ~6 o( a
1
5 t) q' c4 }6 t  |2 ~- b局域网摄像头
' ~' R# R; D) N* w( P1 q( ], zESP32实现局域网摄像头的方式比较简单,驱动代码如下:5 ]% r# m1 U# D2 Z/ N
  t0 ?# {/ ^' w2 E6 ?- }. D
  • #include "esp_camera.h"#include
    3 `. q( U7 V4 S- T//// 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" s5 D4 U# y  x+ R
    // ===================// 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, A* q1 b3 w2 `
    #include "camera_pins.h"#include "DFRobot_AXP313A.h"! y$ N/ J8 O# G. i, v9 ?1 m' |
    DFRobot_AXP313A axp;
    ( P: t) T( R2 ^. _// ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";
    9 T8 M, T) c3 Rvoid startCameraServer();void setupLedFlash(int pin);% p: L# Z- ]. z# L3 i) f2 T. G
    void setup() {  Serial.begin(115200);  Serial.setDebugOutput(true);  Serial.println();. e: p' ~, q; H& c; F
      while(axp.begin() != 0){    Serial.println("init error");    delay(1000);  }0 @& A6 @3 B. w1 q9 k
      axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电( s% v3 m. e$ p) a! y
      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;
    % I  @& Q" k( r; C% H) ]  // 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% a. |& [! g# c8 p#if defined(CAMERA_MODEL_ESP_EYE)  pinMode(13, INPUT_PULLUP);  pinMode(14, INPUT_PULLUP);#endif
    . |4 e; K- Y  \  // 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;  }1 M2 k, R2 p( O8 T* U& L' j
      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);  }
    : k4 p  z8 y9 B; \; u4 P#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)  s->set_vflip(s, 1);  s->set_hmirror(s, 1);#endif
    * o# k- E" f6 N/ j7 w. p#if defined(CAMERA_MODEL_ESP32S3_EYE)  s->set_vflip(s, 1);#endif" G9 ]. k" q4 w9 ~/ e1 d
    // Setup LED FLash if LED pin is defined in camera_pins.h#if defined(LED_GPIO_NUM)  setupLedFlash(LED_GPIO_NUM);#endif
    ( c6 [. g9 r7 D  WiFi.begin(ssid, password);  WiFi.setSleep(false);
    / _4 I6 v- s0 u8 ^, E  while (WiFi.status() != WL_CONNECTED) {    delay(500);    Serial.print(".");  }  Serial.println("");  Serial.println("WiFi connected");
    $ @" `- `1 F: {/ u. E3 V  O  startCameraServer();
    : u$ N8 F* S! _9 G  Serial.print("Camera Ready! Use 'http://");  Serial.print(WiFi.localIP());  Serial.println("' to connect");}, J. ?  Q3 Q& y) `, N
    void loop() {  // Do nothing. Everything is done in another task by the web server  delay(10000);}
    8 p6 E, F/ w. c( D. k: o代码中有几点需要注意:9 L4 \4 L2 l& g
    # f8 ~/ g1 e; H6 R" P
    1、宏定义选择适配的摄像头模式。" S6 {. A1 k  W5 ^" A

    4 z1 j7 o' g2 o$ d( ?4 I
  • // ===================// 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- Z. A% N8 G2 X4 r( x/ V6 e
    2、无线路由器SSID和密码要填写正确。0 C( L0 k  Q. p

    ; |) i! t* `, z4 G" Z0 U
  • // ===========================// Enter your WiFi credentials// ===========================const char* ssid = "";const char* password = "";8 V! p0 u9 r) M$ w: Z' _( Q
    3、给摄像头供电* y+ ^1 v0 R/ h" F( o+ ]
    ; |) l! F, f/ }; i; Y$ D
  • axp.enableCameraPower(axp.eOV2640);  // 给摄像头供电4 |, E# e9 l1 D! w3 o: H
    4、板卡需要外接天线,否则可能无法连接路由器。2 Y1 P% J( i5 E0 g$ ?

    1 j- K2 c) C& R* K编译下载程序到板卡中,确保局域网访问网络摄像头可正常使用。7 i# ?  S1 w- c) K1 T7 Q- l2 u
    2
    . G4 R0 x" z6 i( y" F" D) J内网穿透网络摄像头0 I' z  X: F6 e# E& N: @
    内网穿透我们使用花生壳这款软件提供的内网穿透服务。
    2 C) i6 Y. V- o/ B5 [9 r/ y
    3 X3 g9 F* {& K+ H1 M( h2 i

    bhp4yyhj5vh64023062142.png

    bhp4yyhj5vh64023062142.png

    ) t; U4 `" x; b" ~$ |- Z4 K* S* z
    6 O0 Y' P9 T: U在官网下载APP:https://hsk.oray.com/
    9 q) a' L3 y. F8 s( N# f, T" k4 V4 C7 @- k: ?& b  F
    下载安装完成后,在内网穿透服务点击新建映射,如下图所示:
    7 e* m, \0 K+ s4 v. z# W7 [  r. j/ a& I6 W0 }# {

    t4a4vslzp0u64023062242.png

    t4a4vslzp0u64023062242.png

    3 w' W' e. R/ V7 D  ~) k+ M# v: w5 c8 C- u
    填写新建映射的基本信息,请注意内网主机和内网端口是局域网摄像头的主机和端口(端口默认为80) ,如下图所示:" |' o2 W6 I) P" l
    6 h& v+ g- ^( ?8 j# P

    2izd0v4nrch64023062343.png

    2izd0v4nrch64023062343.png
    8 B* I$ \9 a; w. `9 Y% ~$ R/ q

    6 `- V* r+ i' H+ E: `新建映射完成后,可以在APP看到新增的设备列表,如下图所示:$ N! o- }5 F) I5 _! H
    $ T3 Q* E9 b) O- M6 {9 O. w/ K

    zn0jm4glh0564023062443.png

    zn0jm4glh0564023062443.png

    + Y6 W: e( R2 k2 n7 N+ j8 `; D, T& |- T' Z* ^3 x2 ^
    复制访问网址,在浏览器中打开:http://2j90962r69.goho.co:47918/0 P7 T  a6 L0 c" E1 G

    3 v  h3 B8 d2 t. E% b" ^8 ]$ ]- x即使不在同一个局域网内也可以正常访问摄像头啦。& \- w' @8 X$ m& x: T- d8 v
    9 _* |" j2 E  i$ v' I5 f

    co5541bktqx64023062543.png

    co5541bktqx64023062543.png

    ! ?5 s* b" S0 t; o1 L2 u6 [
    2 |! ^. v$ U- u8 P( M- r; V1 m* |$ G) X0 _

    1l4p35bmys064023062643.png

    1l4p35bmys064023062643.png

    ) N9 f- x8 E( m+ {9 C往期推荐HarmonyOS学习路之开发篇—Java UI框架(Position和AdaptiveBox layout)
    1 a# r# f9 Z0 n, {  s9 A/ NPython数据可视化:如何选择合适的图表可视化?3 w5 S! T& ?$ Z* f7 L$ l! ~. Q
    磁耦合共振无线供电装置
    $ c/ |& h$ F4 OPython Qt GUI设计:表格和树类(提升篇—1)" l8 O1 |$ [. ]; G3 ~

    4 N2 Y3 p7 s5 j: ]+ J) y

    brbiutrx2if64023062743.jpg

    brbiutrx2if64023062743.jpg
    3 ^+ i% ^; |- N$ _

    pgpa5cv4whb64023062843.gif

    pgpa5cv4whb64023062843.gif
    0 F$ h' c2 s2 C- L" P
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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