当前位置:   article > 正文

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

thonny esp32cam

刚才给大家讲解了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代码

  1. import socket
  2. import network
  3. import camera
  4. import time
  5. # 连接wifi
  6. wlan = network.WLAN(network.STA_IF)
  7. wlan.active(True)
  8. if not wlan.isconnected():
  9. print('connecting to network...')
  10. wlan.connect('HONOR50Pro', '00000000')
  11. while not wlan.isconnected():
  12. pass
  13. print('网络配置:', wlan.ifconfig())
  14. # 摄像头初始化
  15. try:
  16. camera.init(0, format=camera.JPEG)
  17. except Exception as e:
  18. camera.deinit()
  19. camera.init(0, format=camera.JPEG)
  20. # 其他设置:
  21. # 上翻下翻
  22. camera.flip(1)
  23. #左/
  24. camera.mirror(1)
  25. # 分辨率
  26. camera.framesize(camera.FRAME_HVGA)
  27. # 选项如下:
  28. # FRAME_96X96 FRAME_QQVGA FRAME_QCIF FRAME_HQVGA FRAME_240X240
  29. # FRAME_QVGA FRAME_CIF FRAME_HVGA FRAME_VGA FRAME_SVGA
  30. # FRAME_XGA FRAME_HD FRAME_SXGA FRAME_UXGA FRAME_FHD
  31. # FRAME_P_HD FRAME_P_3MP FRAME_QXGA FRAME_QHD FRAME_WQXGA
  32. # FRAME_P_FHD FRAME_QSXGA
  33. # 有关详细信息,请查看此链接:https://bit.ly/2YOzizz
  34. # 特效
  35. camera.speffect(camera.EFFECT_NONE)
  36. #选项如下:
  37. # 效果\无(默认)效果\负效果\ BW效果\红色效果\绿色效果\蓝色效果\复古效果
  38. # EFFECT_NONE (default) EFFECT_NEG \EFFECT_BW\ EFFECT_RED\ EFFECT_GREEN\ EFFECT_BLUE\ EFFECT_RETRO
  39. # 白平衡
  40. # camera.whitebalance(camera.WB_HOME)
  41. #选项如下:
  42. # WB_NONE (default) WB_SUNNY WB_CLOUDY WB_OFFICE WB_HOME
  43. # 饱和
  44. camera.saturation(0)
  45. #-2,2(默认为0). -2灰度
  46. # -2,2 (default 0). -2 grayscale
  47. # 亮度
  48. camera.brightness(0)
  49. #-2,2(默认为0). 2亮度
  50. # -2,2 (default 0). 2 brightness
  51. # 对比度
  52. camera.contrast(0)
  53. #-2,2(默认为0).2高对比度
  54. #-2,2 (default 0). 2 highcontrast
  55. # 质量
  56. camera.quality(20)
  57. #10-63数字越小质量越高
  58. # socket UDP 的创建
  59. s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
  60. try:
  61. while True:
  62. buf = camera.capture() # 获取图像数据
  63. s.sendto(buf, ("192.168.25.19", 9090)) # 向服务器发送图像数据
  64. time.sleep(0.1)
  65. except:
  66. pass
  67. finally:
  68. camera.deinit()

 

 下面是pycahrm代码

  1. import socket
  2. import io
  3. from PIL import Image
  4. import numpy as np
  5. from flask import Flask, render_template, Response
  6. import cv2
  7. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
  8. s.bind(("192.168.25.19", 9090))
  9. app = Flask(__name__)
  10. @app.route('/video_feed')
  11. def video_feed():
  12. def generate_frames():
  13. while True:
  14. data, IP = s.recvfrom(100000)
  15. bytes_stream = io.BytesIO(data)
  16. image = Image.open(bytes_stream)
  17. img = np.asarray(image)
  18. frame = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) # ESP32采集的是RGB格式,要转换为BGR(opencv的格式)
  19. ret, buffer = cv2.imencode('.jpg', frame)
  20. frame = buffer.tobytes()
  21. yield (b'--frame\r\n'
  22. b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
  23. return Response(generate_frames(),
  24. mimetype='multipart/x-mixed-replace; boundary=frame')
  25. @app.route('/')
  26. def index():
  27. return render_template('index.html')
  28. if __name__ == '__main__':
  29. 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代码

  1. #该文件是学习csdn 并完成视频传输到网站
  2. from microdot import Microdot
  3. import time
  4. import camera
  5. from machine import reset
  6. import network
  7. def wifiConnect():
  8. wlan = network.WLAN(network.STA_IF)
  9. wlan.active(True)
  10. if not wlan.isconnected():
  11. print('connecting to network...')
  12. wlan.connect('HONOR50Pro', '00000000')
  13. while not wlan.isconnected():
  14. pass
  15. print('网络配置:', wlan.ifconfig())
  16. wifiConnect() #连接wifi
  17. app = Microdot()
  18. try:
  19. camera.init(0, format=camera.JPEG)
  20. except Exception as e:
  21. camera.deinit()
  22. camera.init(0, format=camera.JPEG)
  23. camera.flip(1)
  24. camera.mirror(1)
  25. camera.framesize(camera.FRAME_HVGA)
  26. camera.speffect(camera.EFFECT_NONE)
  27. camera.saturation(0)
  28. camera.brightness(0)
  29. camera.contrast(0)
  30. camera.quality(20)
  31. @app.route('/')
  32. def index(request):
  33. return '''<!doctype html>
  34. <html>
  35. <head>
  36. <title>Microdot Video Streaming</title>
  37. </head>
  38. <body>
  39. <h1>Microdot Video Streaming</h1>
  40. <img src="/video_feed" width="30%">
  41. </body>
  42. </html>''', 200, {'Content-Type': 'text/html'}
  43. @app.route('/video_feed')
  44. def video_feed(request):
  45. def stream():
  46. yield b'--frame\r\n'
  47. while True:
  48. frame = camera.capture()
  49. yield b'Content-Type: image/jpeg\r\n\r\n' + frame + \
  50. b'\r\n--frame\r\n'
  51. #time.sleep_ms(50)
  52. return stream(), 200, {'Content-Type':
  53. 'multipart/x-mixed-replace; boundary=frame'}
  54. if __name__ == '__main__':
  55. 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元,还可以吧,大家择优选择,以上就是所有的内容,如果有不清楚或者错误的地方请大家指点,如看到会及时回复。 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/383524
推荐阅读
相关标签
  

闽ICP备14008679号