esp32 cam不使用官方示例完成视频内网穿透

刚才给大家讲解了esp32cam使用arduino ide官方示例内网穿透的方法,因目前免费的内网穿透软件无法完成公网ip的两个端口映射,因此作者去学习了另一个不使用官方示例也可以内网穿穿透的方法。 在此先介绍b站王铭东老师,我是在这位老师的基础上学习的,还有csdn上的这位老师,我

仅学习借鉴代码思路部分,这两位老师都很厉害,大家可以看看相关博客和视频。

接下来便给大家讲解thonny实现内网穿透,目前有两种方法,第一种,使用thonny在esp32cam上烧录代码通过socket通信 udp协议,将视频流传输到pycharm上接收,使用flask框架做web,再使用cpolar或花生壳完成内网穿透。第二种,使用thonny导入flask文件,在thonny上搭建网站,再使用cpolar或花生壳完成内网穿透。

不管是哪种方法都需要使用到thonny,作者便带大家配置thonny并讲解一路上遇到的坑。

首先去thonny官网先下载thonny,这一步大家应该都没问题,下载好thonny后,我们所需要的第一步便是烧录固件,这个非常重要,我把所用到的固件库放在了链接里,永久有效,大家自行下载

链接:https://pan.baidu.com/s/1t7VWx3cJEmQrXBxpXqlxxQ 
提取码:0f63

这个固件库包含camera,官网最新的固件库不能使用camera,所以大家尽量下载我这个,如果烧录过了也没事,还可以重新擦去再烧录,这个库也是我从别的好心博主那copy的,也谢谢那位博主。

大家打开后应该是这个界面,我们为了看到文件,先打开视图->文件,便可以看到相关文件配置,接下来便烧录固件,上图中点击右下角,三条横杠处,然后点击配置解释器。

大家在此选择esp32解释器,端口此时连接到我们的esp32cam开发板,带底座的直接插入就行,不带底座的大家使用ch340或者cp210等连接电脑。

作者使用的是底座,可以直接看到com10端口,然后点击右下角的安装或更新micropython····按钮,跳出下方界面。

我这个thonny是最新版本,网上看的很多的教程跟我的不一样,这个地方我搞了好久,哈哈哈哈哈,作者太笨了。这个节面便是寻找我们本地的固件进行烧录,点击右下角的三条横杠。

然后点击第一个选项 select local ·····,寻找本地固件,然后选择我们刚才下载好的固件库,便可以开始导入。

选择完成后,等待安装即可,如果在安装过程中出现了fatal····等字样,便是没有底座的同学们使用ch340或者cp210时的接线问题,大家去别的博客上看看相关解决方法,我曾看到好多解决方法,作者因使用底座,所以就没有仔细研究,大家下载完固件库后便接着看本文中thonny后续流程即可。

大家选择好后,便会有下载过程,第一次安装的同学在左边进度条处会看到安装百分比,到最后安装成功会显示  Done 的字样,便安装成功了。

接下来最重要的地方来了,大家安装完后不要着急粘代码编译,因为我们底座上的烧录芯片虽然外表看着时c340,但其实是不知名芯片,无法直接烧录代码,会显示下方错误代码。

这个时候我们要将开发板与底座分开,使用杜邦线连接5v  gnd  rx  tx这四个端口,因为底座上的芯片会占用esp32cam的部分io口,导致thonny无法使用。

大家像我一样连接四根线便可以正常烧录代码,连接后,重启thonny即可。

shell区域没有了乱码,此时便可以正常使用烧录代码了,如果以后还要烧录别的固件库便使用底座,仅烧录代码便一直使用那四根杜邦线连接,没有办法,谁让底座上的ch340是个盗版的,没有底座的同学,使用ch340或者cp210的同学去其他博主那看一下怎么烧录固件和代码,esp32cam好像有下载模式和调试模式,连线也不相同,b站有个博主就在讲这个,有的esp32cam是六贴片和四贴片(摄像头右下角区域),导致连接ch340和cp210的连线也不同。

当大家都出现这个界面后,直接上第一种代码   thonny代码

import socket
import network
import camera
import time


# 连接wifi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
    print('connecting to network...')
    wlan.connect('HONOR50Pro', '00000000')
    
    while not wlan.isconnected():
        pass
print('网络配置:', wlan.ifconfig())
 
 
# 摄像头初始化
try:
    camera.init(0, format=camera.JPEG)
except Exception as e:
    camera.deinit()
    camera.init(0, format=camera.JPEG)


# 其他设置:
# 上翻下翻
camera.flip(1)
#左/右
camera.mirror(1)

# 分辨率
camera.framesize(camera.FRAME_HVGA)
# 选项如下:
# FRAME_96X96 FRAME_QQVGA FRAME_QCIF FRAME_HQVGA FRAME_240X240
# FRAME_QVGA FRAME_CIF FRAME_HVGA FRAME_VGA FRAME_SVGA
# FRAME_XGA FRAME_HD FRAME_SXGA FRAME_UXGA FRAME_FHD
# FRAME_P_HD FRAME_P_3MP FRAME_QXGA FRAME_QHD FRAME_WQXGA
# FRAME_P_FHD FRAME_QSXGA
# 有关详细信息,请查看此链接:https://bit.ly/2YOzizz

# 特效
camera.speffect(camera.EFFECT_NONE)
#选项如下:
# 效果\无(默认)效果\负效果\ BW效果\红色效果\绿色效果\蓝色效果\复古效果
# EFFECT_NONE (default) EFFECT_NEG \EFFECT_BW\ EFFECT_RED\ EFFECT_GREEN\ EFFECT_BLUE\ EFFECT_RETRO

# 白平衡
# camera.whitebalance(camera.WB_HOME)
#选项如下:
# WB_NONE (default) WB_SUNNY WB_CLOUDY WB_OFFICE WB_HOME

# 饱和
camera.saturation(0)
#-2,2(默认为0). -2灰度
# -2,2 (default 0). -2 grayscale 

# 亮度
camera.brightness(0)
#-2,2(默认为0). 2亮度
# -2,2 (default 0). 2 brightness

# 对比度
camera.contrast(0)
#-2,2(默认为0).2高对比度
#-2,2 (default 0). 2 highcontrast

# 质量
camera.quality(20)
#10-63数字越小质量越高

# socket UDP 的创建
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)

try:
    while True:
        buf = camera.capture()  # 获取图像数据
        s.sendto(buf, ("192.168.25.19", 9090))  # 向服务器发送图像数据
        time.sleep(0.1)
except:
    pass
finally:
    camera.deinit()


 

 下面是pycahrm代码

import socket
import io
from PIL import Image
import numpy as np
from flask import Flask, render_template, Response
import cv2

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
s.bind(("192.168.25.19", 9090))

app = Flask(__name__)


@app.route('/video_feed')
def video_feed():
    def generate_frames():
        while True:
            data, IP = s.recvfrom(100000)
            bytes_stream = io.BytesIO(data)
            image = Image.open(bytes_stream)
            img = np.asarray(image)
            frame = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)  # ESP32采集的是RGB格式,要转换为BGR(opencv的格式)
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
    return Response(generate_frames(),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

我第一次粘在csdn上代码,不知道大家看到是不是跟别的作者那样在一个框框里,如果代码跟文字掺在了一次,大家评论回复我,我私发给大家。

这个代码是将esp32cam的视频先通过udp传输到pycharm然后在到web网页,电脑和esp32cam应在同一wifi下。

大家可以看到结果还是不错的,这个时候我们只需要cpolar或者花生壳,将pycharm终端打印的ip地址和端口输入进去便可以内网穿透,从公网访问我们的web页面了,也不需要两个端口。

接下来是第二种方法

上代码前需要先配置文件,因为我们是在thonny上直接搭建网站,需要用到flask,但是,但是,很重要的点,esp32等解释器,没有办法去下载flask软件包 像numpy、opencv、pillow等等是没办法在thonny的esp32解释器上下载的,也就是在我们当前这个项目中,没有办法使用opencv、flask等软件库,当然python解释器是可以的,这个地方困扰了我很多天。

点击thonny界面的工具->管理包,打开下面这个界面

能看到左上角写的是com10包,这代表是esp32解释器,可以更换成python解释器下载我刚才说的那些包,但是我们不需要python解释器,当前esp32解释器只能使用内置的软件包,因此我们想要搭建web网页,需要flask包怎么办,我最开始介绍的csdn博主已经提供了相关py文件,我在此也分享给大家

链接:https://pan.baidu.com/s/1oerFmQ6zoOGAmfE7VgPL2Q 
提取码:0rdc

里面是一个py文件,大家下载到thonny的保存的项目里就行,之后我们便可以使用flask框架了。

上代码  thonny代码

#该文件是学习csdn  并完成视频传输到网站
from microdot import Microdot
import time
import camera
from machine import reset
import network

def wifiConnect():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect('HONOR50Pro', '00000000')
        while not wlan.isconnected():
            pass
    print('网络配置:', wlan.ifconfig())
    
wifiConnect()  #连接wifi
app = Microdot()


try:
    camera.init(0, format=camera.JPEG)
except Exception as e:
    camera.deinit()
    camera.init(0, format=camera.JPEG)
    
    
camera.flip(1)
camera.mirror(1)
camera.framesize(camera.FRAME_HVGA)
camera.speffect(camera.EFFECT_NONE)
camera.saturation(0)
camera.brightness(0)
camera.contrast(0)
camera.quality(20)

@app.route('/')
def index(request):
    return '''<!doctype html>
<html>
  <head>
    <title>Microdot Video Streaming</title>
  </head>
  <body>
    <h1>Microdot Video Streaming</h1>
    <img src="/video_feed" width="30%">
  </body>
</html>''', 200, {'Content-Type': 'text/html'}


@app.route('/video_feed')
def video_feed(request):
    def stream():
        yield b'--frame\r\n'
        while True:
            frame = camera.capture()
            yield b'Content-Type: image/jpeg\r\n\r\n' + frame + \
                b'\r\n--frame\r\n'
            #time.sleep_ms(50)

    return stream(), 200, {'Content-Type':
                           'multipart/x-mixed-replace; boundary=frame'}

if __name__ == '__main__':
    app.run(debug=True)

    

 

将wifi更换成自己的,运行代码到esp32cam上,如果shell出现初始化相机失败,便检查连线,并重启thonny即可,我有时也会这样,问题不大。大家把刚才的microdot.py文件另存到micropython设备上,如下图。

以上电脑和esp32cam也需要在一个wifi下才能访问,但是我们今天需要的是内网穿透,打开我们的cpolar或者花生壳,两个我都会演示,先打开cpolar,把我们esp32cam返回的ip地址和端口号输入进去,生成公网ip,进入查看,上述过程可在我的上一篇博客查看.

 

 

 

 大家可以看到,我esp32cam连接的wifi是HONOR50Pro,设置cpolar也是HONOR50Pro,在另一台电脑上,连接的wifi不是HONOR50Pro,使用公网ip,也可以看到esp32cam的图像,完成了内网穿透。

 下面呢是花生壳展示

 

 

 

 

 

这个是使用花生壳,原理跟cpolar相似,也是编辑内网ip地址和端口号,在同一wifi下部署,在别的设备上查看,可以看到当前视频,但是花生壳的公网ip是固定的,要比cpolar要好,但是需要6元,还可以吧,大家择优选择,以上就是所有的内容,如果有不清楚或者错误的地方请大家指点,如看到会及时回复。 

 

  • 26
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
ESP32-CAM是一款集成WIFI和相机模块的开发板,常用于物联网和图像识别领域。在内网穿透的概念中,我们需要将内网设备(如ESP32-CAM)通过路由器的NAT转发功能,使其能够从互联网访问。 要实现ESP32-CAM的内网穿透,可以按照以下步骤进行: 1. 配置路由器:打开路由器管理界面,找到端口转发或虚拟服务器等设置选项。添加一条新的转发规则,将外部网络请求的端口与ESP32-CAM的IP地址及端口进行映射。 2. 配置静态IP:为ESP32-CAM分配一个静态IP地址,以便路由器可以始终将外部请求导向正确的设备。将ESP32-CAM的MAC地址与静态IP地址进行绑定,可在路由器的DHCP服务器设置中完成。 3. 端口映射:在ESP32-CAM的代码中,将相机的端口号设置为与路由器转发规则中的端口号相同。这样,当外部请求到达路由器时,会自动转发到ESP32-CAM上的相机模块。 4. 公网IP地址:如果你的路由器连接了网络服务提供商的模式,公网IP地址是可变的。因此,需要使用动态域名服务(DDNS)来解决这个问题。在路由器或DDNS服务提供商的设置中,配置一个动态域名并将其与ESP32-CAM的IP地址关联。 5. 防火墙设置:如果你的路由器或计算机有防火墙软件,确保在配置内网穿透时允许外部访问ESP32-CAM的端口。 完成上述步骤后,通过外部网络即可访问ESP32-CAM。只需在浏览器中输入你的动态域名或公网IP地址,加上配置的端口号,就可以查看ESP32-CAM的图像或控制它。 需要注意的是,内网穿透涉及到网络安全问题,所以务必采取适当的安全措施来保护你的设备和数据。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值