刚才给大家讲解了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()
文章来源地址https://www.toymoban.com/news/detail-850784.html
下面是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元,还可以吧,大家择优选择,以上就是所有的内容,如果有不清楚或者错误的地方请大家指点,如看到会及时回复。 文章来源:https://www.toymoban.com/news/detail-850784.html
到了这里,关于esp32 cam不使用官方示例完成视频内网穿透的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!