赞
踩
最近买了一块esp32cam来玩了一下,发现网上现有的结合esp32cam的demo很多都是在局域网内,不能做到远距离监控,所以整合网上开源的部分代码并结合自己的知识体系来做了一个demo。
图片传输的话最简单的就是局域网内进行,将电脑和esp32连接同一个wifi即可。但这样的话不能实现远程监控,弊端非常大。远程传输可以用自己的服务器也能用内网穿透实现,开始做这个的时候我看某些博主使用的是frp来进行内网穿透,当时就感觉挺复杂的,所以这里我就用来自己常用的内网穿透方式,使用cpolar。
cpolar下载地址
打开cpolar.exe,因为mqtt通讯协议的底层是tcp协议,然后mqtt平台默认是占用1883端口,所以我们的命令是然后我们就可以看到内网穿透后的域名和端口。
提示:保存域名和端口一会要用
esp32cam官方库里面是没有mqtt相关依赖的所以我们需要自己下载。
import network
ssid='11'#wifi名
password = 'wjj200323'#密码
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
下载成功后可以在lib文件夹看见我们下载好的依赖。
import upip
upip.install('micropython-umqtt.simple')
提示:把里面的信息改成本机的,如wifi信息,域名端口填内网穿透后的
import network from time import sleep from machine import Pin, SPI from umqtt.simple import MQTTClient import ubinascii import camera # 连接到Wi-Fi网络 def connect_wifi(): ssid = '你的wifi名称' password = '你的wifi密码' wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print('连接到Wi-Fi网络...') wlan.connect(ssid, password) while not wlan.isconnected(): pass print('Wi-Fi连接成功!') print('IP地址:', wlan.ifconfig()[0]) else: print('Wi-Fi已连接!') # 初始化摄像头模块 def init_camera(): 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(10) # 10-63数字越小质量越高 # 连接到MQTT代理 def connect_mqtt(): #第一个参数是mqtt的id,唯一就行 #第二个参数是你的ip或者域名, #第三个是端口,如果是本机就不用填,默认1883 c = MQTTClient("esp32cam", "###","##") c.connect() # 调用connect()方法进行连接 return c # 发布图像到MQTT主题 def publish_image_to_mqtt(client): try: buf = camera.capture() base64_img = ubinascii.b2a_base64(buf).strip().decode('utf-8') client.publish('esp32', base64_img) #参数是mqtt的主题,要与服务端订阅一致不然接收不到数据, #client.publish('esp32cam', buf) except Exception as e: print('图像发布时出错:', e) # 主函数 def main(): connect_wifi() init_camera() client = connect_mqtt() while True: publish_image_to_mqtt(client) sleep(0.1)#越小发送数据越快 if __name__ == '__main__': main()
烧录成功后就可以在mqtt平台看见信息。
代码我已经上传gitee。服务端代码地址
将yml文件里面的ip,端口改成内网穿透后的就可以启动项目了,信息成功接收。
最后就可以访问网页了。
这样我第一次的博客分享就结束了,大家可以多交流,初学者了解了内网穿透技术也可以试试使用内网穿透技术让非本地,比如手机端,其他人的电脑来访问网页查看监控视频。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。