博客專欄

        EEPW首頁 > 博客 > ESP32-S3搭建外網可訪問的網絡攝像頭(內網穿透)

        ESP32-S3搭建外網可訪問的網絡攝像頭(內網穿透)

        發布人:美男子玩編程 時間:2023-09-08 來源:工程師 發布文章

        本篇博文使用ESP32-S3搭建網絡攝像頭,相比較局域網攝像頭,本篇博文將分享如何搭建外網可以訪問的網絡攝像頭。

        這主要是使用內網穿透技術,內網穿透是為了使具有某一個特定源 IP 地址和源端口號的數據包(這里指局域網攝像頭)不被網絡地址轉換設備屏蔽而正確路由到內網主機。

        主要流程分為兩步:

        1、先實現局域網訪問網絡攝像頭;

        2、在此基礎,使用內網穿透的方式,搭建外網可訪問的網絡攝像頭。

        1

        局域網攝像頭

        ESP32實現局域網攝像頭的方式比較簡單,驅動代碼如下:

        #include "esp_camera.h"
        #include
        //
        // 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
        // ===================
        // 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
        #include "camera_pins.h"
        #include "DFRobot_AXP313A.h"
        DFRobot_AXP313A axp;
        // ===========================
        // Enter your WiFi credentials
        // ===========================
        const char* ssid = "";
        const char* password = "";
        void startCameraServer();
        void setupLedFlash(int pin);
        void setup() {
          Serial.begin(115200);
          Serial.setDebugOutput(true);
          Serial.println();
          while(axp.begin() != 0){
            Serial.println("init error");
            delay(1000);
          }
          axp.enableCameraPower(axp.eOV2640);  // 給攝像頭供電
          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;
          // 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
          }
        #if defined(CAMERA_MODEL_ESP_EYE)
          pinMode(13, INPUT_PULLUP);
          pinMode(14, INPUT_PULLUP);
        #endif
          // 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;
          }
          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);
          }
        #if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
          s->set_vflip(s, 1);
          s->set_hmirror(s, 1);
        #endif
        #if defined(CAMERA_MODEL_ESP32S3_EYE)
          s->set_vflip(s, 1);
        #endif
        // Setup LED FLash if LED pin is defined in camera_pins.h
        #if defined(LED_GPIO_NUM)
          setupLedFlash(LED_GPIO_NUM);
        #endif
          WiFi.begin(ssid, password);
          WiFi.setSleep(false);
          while (WiFi.status() != WL_CONNECTED) {
            delay(500);
            Serial.print(".");
          }
          Serial.println("");
          Serial.println("WiFi connected");
          startCameraServer();
          Serial.print("Camera Ready! Use 'http://");
          Serial.print(WiFi.localIP());
          Serial.println("' to connect");
        }
        void loop() {
          // Do nothing. Everything is done in another task by the web server
          delay(10000);
        }

        代碼中有幾點需要注意:

        1、宏定義選擇適配的攝像頭模式。

        // ===================
        // 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

        2、無線路由器SSID和密碼要填寫正確。

        // ===========================
        // Enter your WiFi credentials
        // ===========================
        const char* ssid = "";
        const char* password = "";

        3、給攝像頭供電

        axp.enableCameraPower(axp.eOV2640);  // 給攝像頭供電

        4、板卡需要外接天線,否則可能無法連接路由器。

        編譯下載程序到板卡中,確保局域網訪問網絡攝像頭可正常使用。

        2

        內網穿透網絡攝像頭

        內網穿透我們使用花生殼這款軟件提供的內網穿透服務。

        圖片


        在官網下載APP:https://hsk.oray.com/

        下載安裝完成后,在內網穿透服務點擊新建映射,如下圖所示: 


        圖片


        填寫新建映射的基本信息,請注意內網主機和內網端口是局域網攝像頭的主機和端口(端口默認為80) ,如下圖所示:


        圖片


        新建映射完成后,可以在APP看到新增的設備列表,如下圖所示:


        圖片


        復制訪問****,在瀏覽器中打開:http://2j90962r69.goho.co:47918/

        即使不在同一個局域網內也可以正常訪問攝像頭啦。




        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: 網絡攝像頭

        技術專區

        關閉
        主站蜘蛛池模板: 溧水县| 池州市| 石阡县| 邮箱| 汕尾市| 永昌县| 闸北区| 西充县| 同德县| 明星| 巴里| 集安市| 盖州市| 济南市| 景德镇市| 和田市| 屯昌县| 古丈县| 诏安县| 奈曼旗| 沽源县| 大关县| 新邵县| 新巴尔虎左旗| 黑河市| 清水县| 梅州市| 金山区| 荥经县| 鸡东县| 青铜峡市| 封丘县| 卓尼县| 牙克石市| 青海省| 新巴尔虎左旗| 林周县| 当涂县| 济南市| 花垣县| 遵义县|