ESP32CAM物联网教学06
拍照上传互联网
在上节课中,小智的物联网视频小车,在与家用的云台监控摄像头的PK中,各具优势,难分高下,这让小智下定决心,再次增强物联网小车的功能,提升小车的智能水平。
- 视频上传互联网的必备条件
ESP32Cam使用的视频传输程序是CameraWebServer(在第一课和第五课中用的都是这个乐鑫公司提供的官方程序),从程序的命名理解,这应该是一个专门针对照相机的网页服务。也就是说ESP32Cam在本地的局域网内部,充当一个网页服务器的功能,只要在这个网络桥段内(同一个路由器之内)的所有联网设备,都能利用浏览器访问这个网页服务器ESP32Cam,都能查看到摄像头的视频(经过试验,可以两个以上的设备(电脑或手机)同时访问到http://192.168.1.184这个网页。但是只有一个设备能查看到摄像头的视频流,只有等到第一个设备断开摄像头的视频流,第二个设备才能连接“StartStream”并接收摄像头的视频流)。
那么这个ESP32Cam的网页服务能不能发布到互联网,让我们随时随地都能联网接收并查看视频流呢?这个以我们个人的能力是很困难的,这个技术较内网穿透,或者叫路由器的端口映射(有兴趣的可以自己去网上查阅教程),同时还需要网络运营商的技术支持。所以我们把这个CameraWebServer推到公网上面,这个是很不现实的。
- 巴法云的图片上传服务
我们既然做不到把ESP32Cam摄像头的视频流推送到互联网上面,那就取一个折中的办法,把拍到的照片上传到互联网。这样我们至少能利用互联网,也能查看到摄像头拍摄到的图片!
巴法云物联网就为我们提供了照片上传的服务。
我们通过百度“巴法云”,可以访问到巴法云的官网。使用之前,先用邮箱注册一个用户。然后就可以用用户名(邮箱)和密码登录巴法云官网了。
这个是户登录后的巴法云使用操作台。我们点击私钥后面的眼睛,可以查看私钥,这个后面编程的时候会用到。巴法云为用户提供了“TCP创客云”“图存储”和“MQTT设备云”三个服务,我们可以用鼠标点击这三个按钮,在这三个服务之间进行切换。当然巴法云还提供了一个“博客教程”,可以帮助用户解决巴法云使用过程中的一些困难。
如图所示是TCP创客云的使用界面(用鼠标点击TCP创客云,会切换到这个界面),我们可以点击新建主题,创建一个新的“话题”,新建的话题会显示在3话题列表中(从话题列表中可以看出,我已经新建了一个名为ceshi的话题)。
这样我们就可以往这个ceshi的话题中输入一些内容,让后往这个话题推送消息了。如果有其他的联网设备订阅了这个话题,其他设备就能接收到你在这里发送的消息了。相反,如果其他联网设备往这个话题发送消息,发送的消息也会在这里显示的。这里就是巴法云的物联网服务器。
几乎所有的物联网都是用这种“话题”的方式,进行消息的接收和转发的。这个是不是和我们的微信聊天有点相似,所有订阅了这个“话题”联网设备,就像是加入了一个群的好友,群内的好友,谁都可以往群里发消息;不管是谁在群里发了消息,其他的好友都能第一时间收到(只要你是在线的)。
我们点击图存储按钮,就能切换到如图界面,如图所示,我已经建立了一个名为tupian的图存储话题,并且向这个话题上传过图片了。
- Cap拍照上传
要想让ESP32Cam开发板使用巴法云,就必须给米思齐安装巴法云的驱动库文件,安装如图所示(在第二课后详细介绍从云端下载驱动库的介绍)
编写拍照上传程序。从左侧的积木仓库底部,找到巴法云的积木块,编辑如图的程序,程序的算法是:在初始化是,让ESP32Cam连接家里的WiFi,并利用私钥连接到巴法云服务器;程序订阅了一个名为ceshi的话题,如果从这个话题接收到了消息,且消息的内容为cap的话,就调用摄像头拍照上传功能(拍完照片就上传到名为tupian的图存储话题中)。程序中的这两个话题,在前面都已经在巴法云服务器中创建完成了。
这个程序还是有一个BUG,不能这样就上传烧写到ESP32Cam开发板中。在图中的米思齐窗口上端的菜单栏中,一个</>的按钮,这个是积木编程和代码编程的切换状态。点击这个按钮,可以切换到代码编程状态。
我们从积木编程切换到代码编程时,积木程序会自动编译成C语言的程序代码。我们找到程序初始化部分setup(),找到其中的那句代码,并修改为:
config.frame_size = FRAMESIZE_QVGA;
为什么要这样呢?这个是因为原来的图片默认大小为FRAMESIZE_UXGA(1600 X1200),图片太大了,加上网络上传的速度跟不上,所以使用这个程序很难把图片上传成功。而我们这里把图片缩小一些,改为FRAMESIZE_QVGA(320*240),不到原来的5%,这样的照片上传起来就轻松多了,也非常容易上传成功了。
- Cap拍照上传测试
我们把上面的程序烧写到ESP32Cam开发板中,我们拔出开发板,稍等5秒后重新插入电脑(让ESP32Cam重新接通电源重启程序,以后每一次通电重启都是这种情况的),在米思齐的串口监视器中,可以看到ESP32Cam通电后,首先连接WiFi,接着连接到巴法云服务器,并订阅了一个ceshi话题。然后就是等待,每个一段时间,开发板会重新检测与巴法云的连接状态。
接着,我们在电脑的浏览器中,访问巴法云服务器,并在ceshi话题中输入cap,并把这个消息推送出去。在回过头看米思齐的串口监视器,ESP32Cam接收到了cap拍照的指令,就拍照屏发送照片,紧接着下一行返回一个照片的网址,表示这张照片已经发送成功了。我们可以利用这个网址查看照片,当然也可以在巴法云的“云存储”中查看到这张照片了。
- 物联网门锁的升级版
这个cap拍照上传程序的成功实现,让我们想起了第二课的“物联网门锁”应用案例,如果我们给物联网门锁增加这个拍照上传的功能,那情况就会变得大不一样了:当小智在按门铃时,姑姑在电脑中,就可以发送cap的拍照指令,ESP32Cam就能把按门铃的小智的照片拍下来,并上传到巴法云物联网服务器,这样姑姑就能看到是谁在按门铃了,也可以放心的打开家里的大门啦!
当然,我们也可以设置程序,让ESP32Cam定时地拍照片上传保存,这样的应用场景应该还有很多,你还能想到哪些呢?
- 避坑经历的笔记
在这个米思齐的cap拍照上传程序中,有一个非常大、非常恶心的坑,必须要郑重的记录一下的。
我们才编译这个程序时,有时候会很顺利,有时候则会编译到一半就卡死掉出现了这样的错误。
开始碰到这样的错误时,我最先怀疑的难道是程序错了吗?于是我就开始了拍错的过程:
首先,我们查阅了巴法云的官方文档,并下载了官方的程序。在本课开始的时候就提到了,用户登录巴法云后,在巴法云操作界面中有“博客教程”,这个是巴法云提供的官方教程,我们可以查阅到巴法云的使用方法,还提供了示例程序的下载。
我们在巴法云的官方教程中找到这篇,并从文章中间的连接中下载到了这个cap的示例程序代码,程序是Arduino IDE中的C语言代码。我们用Arduino IDE打开这个程序,并编译烧写到ESP32Cam开发板中,发现这个程序运行起来没有问题。当接收到cap拍照命令后,开发板能拍照、并把图片上传到巴法云。
接来了第二步,就是对比分析米思齐的代码和这个官方的Arduino IDE代码,看看这两个程序是否有什么不同。经过认真地对比,发现这两个程序中的功能块代码都相同,就是排列的前后顺序不一样而已。
难道是代码功能块的顺序也会造成程序的编译的错误?
第三步,我调整了米思齐中的程序功能块的排列顺序,让他尽可能地和Arduino IDE中的顺序一致,结果编译成功了。,所以确定了我之前的判断。
最后,经过不断的尝试,突然发现了造成这个编译错误的原因,也找到了解决问题的方法了:在积木块编程中,这个程序分成了“初始化”和“接收执行拍照指令”这两块,
这两个积木块的位置,决定了编译代码的顺序 !!!
当初始化的积木块“低于”接收拍照指令的时候,编译是成功的;相反,当初始化积木块“高于”接收拍照指令的时候,编译是失败的。
至于为什么是这样的结果,我们至今不得而知。但是我们确实非常幸运地,发现了这个问题,并找到了这个问题的解决办法。有时候真的是这样,闽南有句俗语叫“天公惜憨孩”,机会是留给有准备的人。