赞
踩
刚才给大家讲解了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元,还可以吧,大家择优选择,以上就是所有的内容,如果有不清楚或者错误的地方请大家指点,如看到会及时回复。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。