一、前言
本项目里用到的EMQX安装包
、视频监控推流工具、NGINX服务器部署包,MQTT调试助手等全部软件,都已经放在网盘里,需要的可以去下载:
https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
1.1 项目介绍
【1】项目开发背景
随着现代教育的不断发展,传统教室逐渐难以满足信息化和智能化教学的需求。智能教室的概念应运而生,致力于通过物联网技术提升课堂环境、提高教学管理效率和改进学习体验。以物联网技术为核心的智能教室监控系统通过综合的传感器和智能设备的协作,实现了对教室环境、师生出入和课堂活动的全面监控和管理,从而为教学提供更加舒适、安全和高效的环境支持。
智能教室监控系统通过对温湿度、光照、烟雾和火光等环境参数的实时检测,为教室环境的管理提供了自动化的解决方案。温湿度的检测能够帮助教室保持一个舒适的学习环境,而光照强度的监测与控制则可以确保教室的照明条件满足学习需求并优化能耗。当环境中检测到烟雾或火光时,系统能够迅速进行报警提醒,保障教室内的安全性。此外,本系统提供了实时的视频监控功能,能够通过支持RTMP协议的摄像头进行视频流传输,包括声音和图像,确保课堂活动的全程监控和记录。
本项目还引入了人脸识别技术,采用百度的人脸SDK完成人脸的识别处理,,教室的人员管理变得更加智能化。所有学生和教师在进入教室时会进行人脸识别自动签到,取代了传统的手动考勤方式,既方便又高效。为了全面掌握学生的学习状态,系统支持在上课期间定时截图并上传至服务器保存,便于管理人员了解教学情况和学生表现。
所有采集到的数据都会通过MQTT协议实时上传至云服务器进行存储和展示,采用华为云的物联网平台和ESC服务器以提供高效稳定的后台支持。数据的存储和展示将帮助教学管理部门更好地掌握教室的整体情况和环境变化,并提供详细的历史数据参考。系统设计了Windows电脑端的大屏显示,以Qt开发为基础,管理人员可以方便地查看教室实时监控和环境信息,提供直观、详细的可视化监控界面。此外,教室本地还安装了一个7寸LCD显示屏,实时显示教室的温湿度、光照、烟雾等环境信息,便于在现场及时了解情况。
硬件选型方面,本系统选用了STM32F103C8T6作为主控芯片,结合ESP8266模块实现无线网络通信,并使用多种传感器对教室环境进行检测。供电系统采用5V 2A的外置电源,以保证设备的稳定运行。这一套系统在硬件与软件的全面配合下,实现了教室环境的智能化监控,为智慧教育的实施提供了重要的技术支撑。
【2】设计实现的功能
本项目的智能教室监控系统基于物联网技术,实现了以下主要功能:
(1)教室温湿度检测 通过SHT30传感器实时采集教室内的温湿度数据,帮助监测和调节教室环境,确保一个舒适的学习和教学条件。
(2)光照强度检测与自动开关灯 利用光照强度传感器监测教室内的光线情况,系统可以根据检测到的光照水平,自动控制教室的灯光开关,从而优化照明效果并降低能源消耗。
(3)烟雾浓度检测与报警提醒 通过MQ2气体传感器实时检测教室内的烟雾浓度,当检测到异常烟雾时,系统会触发有源蜂鸣器进行报警提醒,以保障教室内的人员安全。
(4)火光检测与报警提醒 系统配备火光检测传感器,能够在检测到火光时进行快速报警,及时提醒相关人员采取安全措施,防止火灾事故的发生。
(5)实时视频监控 系统支持通过RTMP协议推流的监控摄像头进行视频监控,能够采集并传输实时的音频和视频数据,为教室的全面监控和安全提供保障。
(6)人脸识别与自动签到 系统引入人脸识别技术。每位学生和教师都会提前注册人脸信息。在上课期间,进入教室的人员会自动进行人脸识别并完成签到记录,从而实现智能化的考勤管理。
(7)定时截图与学习状态记录 系统支持上课期间定时对教室进行截图,并上传至服务器保存。管理人员可以通过查看截图了解学生的学习状态和课堂情况,为教学管理提供直观的参考数据,人脸识别对比是调用的百度的人脸SDK,处理之后,反馈给设备进行联动控制。
(8)数据上传与云端存储展示 通过ESP8266模块和MQTT协议,采集到的数据会实时上传到华为云物联网服务器,利用EMQX服务器进行数据展示和存储,使教学管理部门能够及时掌握教室环境的详细情况。
(9)Windows端可视化大屏监控 系统提供Windows电脑端的可视化大屏,以Qt开发为基础,实现实时显示教室的环境信息和视频监控,管理人员可以直观了解教室的整体运行情况。
(10)本地LCD显示屏显示环境信息 在教室本地安装了7寸LCD显示屏,能够实时显示教室内的温湿度、光照、烟雾等环境信息,方便师生在教室内直观了解当前环境状态。
1.2 设计思路
本项目的整体设计思路基于物联网技术,通过软硬件结合,实现智能教室环境的监控与管理。系统将教室的环境信息采集、数据分析处理和智能管理进行无缝集成,为教室提供安全、舒适和智能化的教学环境。具体设计思路如下:
1. 硬件架构设计
系统采用STM32F103C8T6作为主控芯片,通过连接各类传感器对教室内的环境参数进行采集。传感器模块包括SHT30温湿度传感器、光照强度传感器、MQ2烟雾传感器和火光检测传感器等。每个传感器通过I2C、ADC等接口与STM32主控芯片连接,实现数据采集功能。ESP8266模块作为无线通信模块,利用MQTT协议实现数据的上传和云端通信。此外,系统配备了7寸LCD显示屏用于本地显示环境信息和状态提示,以及有源蜂鸣器用于异常报警。电源采用5V 2A外置电源供电,以保障设备运行稳定性。
2. 数据采集与处理
STM32主控芯片定时从各个传感器采集环境数据,如温湿度、光照强度、烟雾浓度和火光信息。主控芯片对采集到的数据进行初步处理,例如数据去噪和状态判定。当数据超出设定的安全阈值时,触发蜂鸣器报警。同时,通过ESP8266模块,处理后的数据会被打包并通过MQTT协议发送到云端服务器进行进一步的存储和展示。
3. 网络通信与数据上传
系统采用ESP8266模块与互联网连接,通过MQTT协议将采集到的环境数据发送至部署在华为云的EMQX服务器,实现数据的实时传输和展示。数据传输的稳定性和实时性是本系统的重要保证,因此通信模块和协议选型均经过优化,以确保数据上传的高效性和可靠性。
4. 云端服务器设计
在云端部署了华为云的ESC服务器,运行Ubuntu 18.04操作系统。物联网服务器利用EMQX进行消息队列的管理,接收和处理传感器数据,同时通过NGINX服务器管理视频监控数据。RTMP协议支持实时视频流传输,使管理人员能够查看教室内的实时音视频情况。此外,所有采集到的环境数据会存储于云端数据库,供后续分析和管理使用。
5. 人脸识别与自动签到
系统集成了人脸识别功能,所有师生需预先在服务器注册人脸数据。上课期间,摄像头会采集进出教室的人员图像,并进行人脸识别。匹配成功的人员会被自动记录为签到,有效提高考勤管理效率,人脸识别对比是调用的百度的人脸SDK,处理之后,反馈给设备进行联动控制。
6. 实时视频监控与音视频数据管理
系统支持通过RTMP协议推流的视频监控功能,摄像头实时采集并推送教室内的音视频数据。结合NGINX服务器的RTMP模块,提供稳定的视频流播放服务。Windows端大屏可视化通过FFmpeg解码,实现视频流的渲染播放,提供管理人员直观的监控体验。
7. Windows端可视化大屏设计
利用Qt开发Windows电脑端的可视化大屏,管理人员可以通过大屏实时查看教室的环境信息和监控视频。可视化大屏具备直观的图形化界面,能展示温湿度、光照强度、烟雾浓度等信息,并提供历史数据查询和报警提醒功能。
8. 本地显示与状态提示
教室内安装的7寸LCD显示屏可实时显示当前的环境信息,如温湿度、光照强度等。配合蜂鸣器的报警功能,当检测到异常情况时,能够及时通过显示屏和蜂鸣器进行提示,保障师生的安全。
9. 系统整合与协同运行
整个系统通过主控芯片、传感器、摄像头、ESP8266模块、云端服务器和本地显示等多个模块的有机结合,确保数据采集、处理、传输、存储和展示的顺畅运行。硬件与软件协同工作,实现了教室环境的全面智能监控与管理。
1.3 系统功能总结
功能模块 | 功能描述 |
温湿度检测 | 使用SHT30传感器,实时检测并显示教室内的温湿度,确保环境的舒适性。 |
光照强度检测 | 通过光照强度传感器监测光线情况,自动控制教室内的灯光开关,实现智能照明管理。 |
烟雾检测与报警 | 利用MQ2气体传感器检测教室内的烟雾浓度,异常情况触发有源蜂鸣器报警,保障安全。 |
火光检测与报警 | 通过火光检测传感器实时检测火光情况,异常时进行报警提醒,防止火灾隐患。 |
实时视频监控 | 采用支持RTMP协议推流的监控摄像头,提供教室内音视频的实时监控,确保课堂活动的全面记录与监控。 |
人脸识别与签到 | 实现人脸识别功能,自动识别并记录学生和教师的进出信息,完成考勤签到。人脸识别对比是调用的百度的人脸SDK,处理之后,反馈给设备进行联动控制 |
定时截图保存 | 上课期间定时对教室情况进行截图,上传到服务器保存,便于管理人员了解课堂情况和学生学习状态。 |
数据上传云端 | 使用ESP8266模块通过MQTT协议将采集数据上传至华为云的EMQX服务器,提供实时数据展示与存储。 |
Windows端可视化大屏 | 基于Qt开发的Windows大屏显示系统,实时展示教室环境信息和监控画面,为教学管理人员提供直观的监控界面。 |
本地LCD显示 | 使用7寸LCD显示屏实时显示教室的温湿度、光照、烟雾等环境信息,方便教室内人员及时了解环境状态。 |
1.4 开发工具的选择
【1】设备端开发
STM32的编程语言选择C语言,C语言执行效率高,大学里主学的C语言,C语言编译出来的可执行文件最接近于机器码,汇编语言执行效率最高,但是汇编的移植性比较差,目前在一些操作系统内核里还有一些低配的单片机使用的较多,平常的单片机编程还是以C语言为主。C语言的执行效率仅次于汇编,语法理解简单、代码通用性强,也支持跨平台,在嵌入式底层、单片机编程里用的非常多,当前的设计就是采用C语言开发。
开发工具选择Keil,keil是一家世界领先的嵌入式微控制器软件开发商,在2015年,keil被ARM公司收购。因为当前芯片选择的是STM32F103系列,STMF103是属于ARM公司的芯片构架、Cortex-M3内核系列的芯片,所以使用Kile来开发STM32是有先天优势的,而keil在各大高校使用的也非常多,很多教科书里都是以keil来教学,开发51单片机、STM32单片机等等。目前作为MCU芯片开发的软件也不只是keil一家独大,IAR在MCU微处理器开发领域里也使用的非常多,IAR扩展性更强,也支持STM32开发,也支持其他芯片,比如:CC2530,51单片机的开发。从软件的使用上来讲,IAR比keil更加简洁,功能相对少一些。如果之前使用过keil,而且使用频率较多,已经习惯再使用IAR是有点不适应界面的。
【2】上位机开发
上位机的开发选择Qt框架,编程语言采用C++;Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。Qt能轻松创建具有原生C++性能的连接设备、用户界面(UI)和应用程序。它功能强大且结构紧凑,拥有直观的工具和库。
二、搭建视频监控流媒体服务器
2.1 购买云服务器
如果之前没有使用过华为云的ECS服务器,可以先申请试用1个月,了解服务器的基本使用然后再购买,不得不说提供这个试用服务还是非常不错。
产品试用领取地址: https://activity.huaweicloud.com/free_test/index.html
每天9:30开抢,每天限量100份,这个页面不仅有云服务器可以领取试用,还有云数据库、沙盒等其他产品。
我这里领取了 2核4G S6云服务器
,这个服务器是配套华为自研25GE智能高速网卡,适用于网站和Web应用等中轻载企业应用。
选择配置的时候发现S6规格的已经没有了,来晚了。
S6规格没有了,就选择了S3,2核,4GB的配置结算。
页面向下翻,下面选择系统预装的系统,我这里选择ubuntu 20.04,安装NGINX,来搭建流媒体服务器。
页面继续下翻,设置云服务器名称,设置系统的root密码。
接着就可以继续去支付了。
购买后等待一段时间,系统资源就即可分配完成。
2.2 登录云服务器
云服务器的管理控制台从这里进入: https://www.huaweicloud.com/product/ecs.html
在官网主页,点击产品,找到计算选项,就可以看到弹性云服务器ECS,点击进去就可以看到管理控制台的选项。
在弹性云服务器
的选项页面可以看到刚才购买的云服务器,如果点击进去提示该区域没有可用的服务器,说明区域选择的不对,在下面截图红色框框的位置可以看到可用的区域切换按钮,切换之后就行了。
点击服务器右边的更多
,可以对服务器重装系统、切换操作系统、关机、开机、重启、重置密码等操作。
接下来先点击登录,了解一下登录的流程,看看系统进去的效果。
云服务器支持SSH协议远程登录,可以在浏览器上直接使用CloudShell方式或者VNC方式登录,如果本身你自己也是使用Linux系统,可以在Linux系统里通过ssh命令直接登录,如果是在windows下可以使用SecureCRT登录。
其他登录方式。
最方便的登录方式,直接在控制台使用VNC在浏览器里登录,点击立即登录
。
根据提示输入用户名,密码后,按下回车键即可登录。
用户名直接输入root
,密码就是刚才配置云服务器时,填入的root密码。
注意: Linux下输入密码默认都是隐藏的,也就是在键盘上输入密码界面上是不会有反应的,自己按照正确的密码输入即可。
用户名、密码输入正确后,登录成功。
可以点击全屏模式,更好的操作。
2.3 使用CloudShell登录云服务器
在页面上直接点击CloudShell登录
按钮。CloudShell方式比VNC方式方便、流畅多了,也支持命令的复制粘贴。
输入密码点击连接。
登录成功进入终端。
2.4 使用SecureCRT登录云服务器
上面演示了两种登录方式,都是直接在浏览器里登录,这种两种方式比较来看,VNC方式效率最低,CloudShell
相对来说要方便很多。一般我自己正常开发时,都是使用第三方工具来登录的,如果本身自己开发环境的电脑就是Linux,MAC等,可以直接使用ssh命令登录,这种方式操作流畅方便。如果在windows下,可以使用第三方软件登录。
我现在使用的系统是win10,在windows系统下有很多远程终端软件支持SSH登录到Linux云服务器,我当前采用的使用SecureCRT 6.5
来作为登录终端,登录云服务器。
注意: SecureCRT 6.5
登录高版本Linux系统会出现Key exchange failed
问题,导致登录失败,比如: 登录ubuntu 20.04 系统。 出现这种问题需要对系统ssh配置文件进行添加配置。
添加配置的流程:
命令行输入:
vim /etc/ssh/sshd_config
在文件最后添加:
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
保存退出。
重启ssh服务
service ssh restart
如果不想这么麻烦的去修改配置文件,那么最简单的办法就是: 切换操作系统,换一个低版本的,比如:ubuntu18.04 即可。
在云服务器的控制台,找到自己的服务器,然后选择切换操作系统。
根据界面上的引导流程,切换即可。更换新的系统需要1~4分钟时间,稍微等待一下即可。
如果要使用远程SSH协议方式登录云服务器,需要具备以下几个前提条件。
[1]弹性云服务器状态为“运行中”。
[2]弹性云服务器已经绑定弹性公网IP,绑定方式请参见绑定弹性公网IP。
[3]所在安全组入方向已开放22端口,配置方式请参见配置安全组规则。
[4]使用的登录工具(如PuTTY,SecureCRT`)与待登录的弹性云服务器之间网络连通。例如,默认的22端口没有被防火墙屏蔽。
但是这些配置不用担心,在购买服务器后,根据引导一套走完,上面的这些配置都已经默认配置好了,不用自己再去单独配置。
系统切换成功后,打开SecureCRT 6.5
软件,进行登录。SecureCRT 6.5
整体而言还是挺好用的。
如果自己没有``SecureCRT,自己下载一个即可。当然,不一定非要使用
SecureCRT`,其他还有很多SSH远程登录工具,喜欢哪个使用哪个。
下面介绍``SecureCRT `登录的流程。
选择新建会话。
选择SSH2协议。
主机名就填服务器的公网IP地址,端口号默认是22,用户名填root。
自己云服务器的公网IP地址,在控制台可以看到。
软件点击下一步之后,可以填充描述信息,备注这个链接是干什么的。
选择刚才新建的协议端口点击连接。
云服务器连接上之后,软件界面会弹出对话框填充用户名、密码。
登录成功的效果如下。
软件可以配置一些选项,让界面符合Linux终端配色,可以修改字体大小、字体编码等等。
配置后的效果。
2.5 安装NFS服务器
为了方便向服务器上拷贝文件,可以采用NFS服务器、或者FTP服务器 这些方式。 我本地有一台ubuntu 18.04 系统笔记本,我这里采用NFS方式拷贝文件上去。
(1)安装NFS服务器
root@ecs-348470:~# sudo apt-get install nfs-kernel-server
(2)创建一个work目录方便当做共享目录使用
root@ecs-348470:~# mkdir work
(3)编写NFS配置文件
NFS 服务的配置文件为/etc/exports,如果系统没有默认值,这个文件就不一定会存在,可以使用 vim 手动建立,然后在文件里面写入配置内容。
/home/work *(rw,no_root_squash,sync,no_subtree_check,insecure)
配置文件里参数的含义:
(4)NFS服务器相关指令
/etc/init.d/nfs-kernel-server start #启动 NFS 服务
ufw disable #关闭防火墙
/etc/init.d/nfs-kernel-server restart #重启NFS服务
exportfs -arv #共享路径生效
(5)本地客户机挂载服务器的目录
wbyq@wbyq:~$ sudo mount -t nfs -o nolock 122.112.212.171:/home/work /home/wbyq/mnt/
(6)设置华为云服务器的安全策略
需要把华为云服务器的端口号开放出来,不然其他客户端是无法访问服务器的。
我这里比较粗暴直接,直接将所有端口号,所有IP地址都开放出来了。
**(7)本地客户机挂载服务器测试 **
挂载指令:
sudo mount -t nfs -o nolock 122.112.212.171:/home/work /home/wbyq/mnt/
2.6 安装NGINX(配置RTMP服务)
(1)下载编译时需要依赖的一些工具
root@ecs-348470:~# sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
(2)下载NGINX编译需要的软件包
root@ecs-348470:~# mkdir nginx
root@ecs-348470:~# cd nginx/
root@ecs-348470:~# wget http://nginx.org/download/nginx-1.10.3.tar.gz
root@ecs-348470:~# wget http://zlib.net/zlib-1.2.11.tar.gz
root@ecs-348470:~# wget https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz
root@ecs-348470:~# wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz
root@ecs-348470:~# wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
(3)下载后的文件全部解压
root@ecs-348470:~# tar xvf openssl-1.0.2k.tar.gz
root@ecs-348470:~# tar xvf nginx-rtmp-module-master.tar.gz
root@ecs-348470:~# tar xvf nginx-1.8.1.tar.gz
root@ecs-348470:~# tar xvf pcre-8.40.tar.gz
root@ecs-348470:~# tar xvf zlib-1.2.11.tar.gz
(4)配置NGINX源码,生成Makefile文件
root@ecs-348470:~# cd nginx-1.8.1/
root@ecs-348470:~# ./configure --prefix=/usr/local/nginx --with-debug --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.0.2k --add-module=../nginx-rtmp-module-master
执行完上一步之后,打开objs/Makefile文件,找到-Werror选项并删除。
(5)编译并安装NGINX
root@ecs-348470:~/nginx/nginx-1.8.1# make && make install
安装之后NGINX的配置文件存放路径:
/usr/local/nginx/nginx:主程序
(6)查看NGINX的版本号
root@ecs-348470:/usr/local/nginx/sbin# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.8.1
(5)在配置文件里加入RTMP服务器的配置
root@ecs-348470:~# vim /usr/local/nginx/conf/nginx.conf
打开文件后,在文件最后加入以下配置:
rtmp {
server {
listen 8888;
application live {
live on;
record all;
record_unique on;
record_path "./video"; #视频缓存的路径
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
}
}
}
这样配置之后,服务器收到RTMP流会在NGINX的当前目录下,创建一个video目录用来缓存视频。
客户端向服务器推流之后,服务器就会缓存视频到设置的目录。
(5)检查配置文件是否正确
root@ecs-348470:/usr/local/nginx/sbin# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
(6)NGINX常用的3个命令
sudo service nginx start
sudo service nginx stop
sudo service nginx restart
(7)启动NGINX服务器
sudo service nginx start
2.7 摄像头推流音视频到服务器
为了模拟摄像头实时监控推流,我这使用QT+FFMPEG编写了一个小软件,在windows下运行,推流本地笔记本电脑的数据到服务器。软件运行之后,将本地音频、视频编码之后通过RTMP协议推流到NGINX服务器。
软件可以去网盘里下载:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
软件运行效果:
推流工具运行过程中效果。
2.8 编写本地RTMP流播放器
在上面通过推流客户端模拟摄像头,已经将本地的摄像头数据实时推流到服务器了,那么还差一个播放器,为了方便能够在任何有网的地方实时查看摄像头的音频和图像,还需要编写一个RTMP流媒体播放器。
我这里的播放器内核是采用libvlc开发的,使用QT作为GUI框架,开发了一个流媒体播放器,可以实时拉取服务器上的流数据,并且还支持回放。因为服务器上的NGINX配置了自动保存的参数,可以将推上去的流按时间段保存下来。
软件可以去网盘里下载:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
输入服务器地址之后就可以拉取流进行播放。
点击获取回放列表,可以查看服务器上保存的历史视频回放播放。
2.9 配置监控摄像头
第一次使用摄像头,先使用网线将摄像头连接到家里路由器上,然后登录摄像头管理页面配置摄像头。
在摄像头上面有一个码,扫描之后就能看到使用办法。里面有一个软件下载下来,可以搜索摄像头IP。
详细过程看这里:https://www.showdoc.com.cn/sqIPC/7929920934644196
设置摄像头动态获取IP(非常重要)
摄像头用户名是admin 密码是12345
登录成功。
设置参数:
设置摄像头连接的WIFI:
**推流地址:**rtmp://111.160.79.93/live/video158
设置WIFI联网之后,摄像头就会自动去连接指定的WIFI,完成推流。
三、Linux下安装EMQX
本章节将介绍如何在 Ubuntu 系统中下载安装并启动 EMQX。
支持的 Ubuntu 版本:
• Ubuntu 22.04
• Ubuntu 20.04
• Ubuntu 18.04
3.1 官网地址
链接:https://www.emqx.io/docs/zh/v5.2/deploy/install-ubuntu.html
3.2 通过Apt源安装
EMQX 支持通过 Apt 源安装,免除了用户需要手动处理依赖关系和更新软件包等的困扰,具有更加方便、安全和易用等优点。
在命令行终端,复制下面的命令过去,按下回车键。
【1】通过以下命令配置 EMQX Apt 源:
curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash
【2】运行以下命令安装 EMQX:
sudo apt-get install emqx
【3】运行以下命令启动 EMQX:
sudo systemctl start emqx
过程如下:
3.3 EMQX常用的命令
sudo systemctl emqx start 启动
sudo systemctl emqx stop 停止
sudo systemctl emqx restart 重启
四、配置EMQX服务器
4.1 登录EMQX内置管理控制台
EMQX 提供了一个内置的管理控制台,即 EMQX Dashboard。方便用户通过 Web 页面就能轻松管理和监控 EMQX 集群,并配置和使用所需的各项功能。
在浏览器里输入: http://122.112.225.194:18083
就可以访问EMQX的后台管理页面。可以管理以连接的客户端或检查运行状态。
这里面的IP地址,就是自己ECS云服务器的公网IP地址。
打开浏览器后,输入地址后打开的效果:
默认用户名和密码:
用户名:admin
密码:public
第一次登录会提示你修改新密码,如果不想设置,也可以选择跳过(公网服务器部署,还是要修改密码安全些)。
下面修改新密码:
登录成功的页面显示如下:
4.2 MQTT配置
这里可以配置MQTT的一些参数,根据自己的需求进行配置。
4.3 测试MQTT通信
新建一个客户端,点击连接。
连接之后,然后点击订阅,和发布,如果下面消息能正常的接收。说明MQTT服务器通信是已经正常,没问题了。
并且在这个页面也可以看到主题发布
和主题订阅
的格式。
4.4 MQTT客户端登录服务器测试
接下来就打开我们自己的MQTT客户端登录MQTT服务器进行测试数据的通信。
端口选择: 1883
根据软件参数填入参数,登录,进行主题的发布和订阅。
说明: 目前还没有配置客户端认证,现在只要IP和端口输入正确,MQTT三元组可以随便输入,都可以登录上服务器的,服务器没有对三元组做校验。
EMQ X 默认配置中启用了匿名认证,任何客户端都能接入 EMQX。没有启用认证插件或认证插件没有显式允许/拒绝(ignore)连接请求时,EMQX 将根据匿名认证启用情况决定是否允许客户端连接。
然后打开EMQX
的管理后台,可以看到我们的设备已经登录服务器了,名字为test1
。
在订阅主题的页面也可以看到我们客户端设备订阅的主题。
4.5 客户端认证配置
EMQX 默认配置中启用了匿名认证,任何客户端都能接入 EMQX。没有启用认证插件或认证插件没有显式允许/拒绝(ignore)连接请求时,EMQX 将根据匿名认证启用情况决定是否允许客户端连接。
在正式产品里肯定是要启用认证的,不然任何设备都能接入。
下面就介绍如何配置 客户端认证。
【1】打开客户端认证页面
【2】选择密码认证
【3】选择内置数据库
【4】设置认证方式(都可以默认,不用改),直接点击创建。
【5】创建成功后,点击用户管理
【6】添加用户
【7】添加成功
【8】添加完毕之后,打开MQTT客户端可以进行测试。
登录的时候,MQTT用户名和密码必须输入正确,按照上一步添加的信息进行如实填写,否则是无法登录服务器的。
4.6 客户端授权配置
客户端授权页面可以配置每个客户端(设备)的主题发布,订阅权限。限制它是否可以发布主题,订阅主题。 如果有需要就可以进行配置。
http://127.0.0.1:18083/#/authorization/detail/built_in_database?tab=users
【1】创建数据源
【2】选择内置数据库
【3】完成创建
【4】点击权限管理
【5】选择客户端ID,点击添加
【6】配置权限
4.7 数据转发(集成)
在集成选项里,可以对设备数据处理。 比如:转发到自己的HTTP服务器,转发到自己其他的MQTT服务器,创建规则,某些事件触发某些动作等等。
选择数据桥接。
可以把数据发送端自己的HTTP服务器,或者发送到其他的MQTT服务器。
选择HTTP服务 (如果自己有HTTP服务器,可以将数据转发给自己的HTTP服务器)。
五、MQTT客户端消息互发测试
5.1 添加2个设备
为了方便测试设备间互相订阅主题,数据收发,在客户端认证页面至少添加2个设备。我这里分别添加了test1
和test2
。
5.2 设备间测试
设备A订阅设备B的主题,设备B订阅设备A的主题,实现数据互发。
设备A的MQTT信息:
MQTT服务器地址:122.112.225.194
MQTT服务器端口号:1883
MQTT客户端ID:AAA
MQTT用户名:test1
MQTT登录密码:12345678
订阅主题:BBB/#
发布主题:AAA/1
发布的消息:{ "msg": "我是AAA设备" }
设备B的MQTT信息:
MQTT服务器地址:122.112.225.194
MQTT服务器端口号:1883
MQTT客户端ID:BBB
MQTT用户名:test2
MQTT登录密码:12345678
订阅主题:AAA/#
发布主题:BBB/1
发布的消息:{ "msg": "我是BBB设备" }
六、安装MYSQL数据库
安装MySQL数据库,存储EMQX服务器上传的数据。方便在智慧大屏上观看数据历史趋势记录。
【1】安装数据库
sudo apt install mysql-server
【2】启动数据库
sudo /etc/init.d/mysql start
以超级用户权限启动MySQL数据库服务。在Linux系统中,sudo
是以超级用户权限执行命令的关键字,/etc/init.d/mysql start
部分是指示系统启动MySQL数据库服务的命令。
正常提示如下:
[ ok ] Starting mysql (via systemctl): mysql.service.
【3】查看MYSQL版本
可以通过运行以下命令来验证安装结果,该命令将输出系统中所安装的 MySQL 版本和发行版。
mysql --version
我的版本提示如下:
mysql Ver 14.14 Distrib 5.7.42, for Linux (x86_64) using EditLine wrapper
【4】配置数据库
既然 MySQL 数据库安装成功了,需要设置一些参数来保证以后配置的服务器和数据库的安全。
执行以下命令:
sudo mysql_secure_installation
(1)运行后第一个看到的提示是,询问你是否验证密码插件。它通过检查用户密码的强度来增强 MySQL 数据库的安全性,允许用户仅设置强密码。按 Y 接受 VALIDATION 或按 RETURN 键跳过。 我是直接按RETURN键跳过(我这数据库用来环境测试的)。
(2)接下来,会看到设置 root 密码的提示。输入密码并按回车键。 注意,出于安全原因,在控制台中键入的任何内容都不会显示(只要键盘上输入了就行了)。 期间会提示输入两次密码。输入后按回车确认即可。
(3)接下来,会看到一个提示,询问你是否删除所有匿名用户,输入 Y 表示是。对于此处的任何其他提示,输入 Y 表示是。也就是接下来的提示全部输入 Y 按下回车确认即可。
最后提示,全部完成。
【5】配置防火墙
sudo ufw enable
sudo ufw allow mysql
sudo ufw enable
命令用于启用Ubuntu系统中的防火墙功能,确保系统能够使用防火墙来过滤网络流量,从而提高系统的安全性。
sudo ufw allow mysql
命令用于在防火墙中允许MySQL服务的网络通信。这个命令将会打开MySQL默认端口(3306),以便客户端可以连接到MySQL服务器。如果你不开放该端口,MySQL客户端将无法连接到MySQL服务器,从而导致无法进行数据库操作。
【6】配置服务器IP地址
现在需要配置服务器的接口,从而服务器能够侦听远程可访问的接口。需要编辑“mysqld.cnf”文件。运行以下命令。
vim /etc/mysql/mysql.conf.d/mysqld.cnf
打开文件后往下翻,找到 bind-addrress
。
默认情况下,绑定地址为“127.0.0.1”。为公网接口添加绑定地址,为服务网络接口添加另一个绑定地址。可以将所有 IP 地址的绑定地址配置为“0.0.0.0”。
修改之后都要记得重启服务器:
sudo /etc/init.d/mysql restart
提示如下:
[ ok ] Restarting mysql (via systemctl): mysql.service.
【7】命令行客户端工具
MYSQL本身带了一个命令行客户端工具,可以登录MySQL数据库服务器。
在命令行输入:
mysql -u root -p
这个命令用于以root用户身份登录MySQL数据库服务器。
mysql
是MySQL数据库的命令行客户端工具,通过在终端中执行该命令,可以打开MySQL数据库的命令行界面。
参数-u root
指定了要使用的用户名为root,即超级管理员账户。你也可以将root
替换为其他具有访问权限的MySQL用户名。
参数-p
表示在登录时需要输入密码。当你执行该命令后,系统会提示你输入root用户的密码,输入正确的密码后,就能成功登录到MySQL数据库服务器。
输入上面的命令之后,接着提示就会让你输入密码。 也就是刚才配置数据库输入的root密码。
当输入mysql的密码后。出现了mysql的版本信息,并进入了命令行终端,即说明配置成功了。
如果要退出命令行,输入:quit
按下回车确认即可。
到这里算是可以正常使用MySQL了。
【8】调整用户身份验证
通常,在未执行任何配置的情况下在 Ubuntu 上全新安装 MySQL 后,访问服务器的用户将使用身份验证套接字 (auth_socket) 插件进行身份验证。
auth_socket 的使用会阻碍服务器使用密码对用户进行身份验证。不仅会引发安全问题,而且还会使用户无法使用外部程序(如 phpMyAdmin)访问数据库。需要将身份验证方法从 auth_socket 更改为使用 mysql_native_password。
按照【7】的步骤打开 MySQL 控制台,并在mysql终端上运行以下命令。
SELECT user,authentication_string,plugin,host FROM mysql.user;
可以看到输出下面的信息。
从上图中,可以确认 root 用户确实使用 auth_socket 插件进行了身份验证。需要使用下面的“ALTER USER”命令切换到“密码验证”的使用。确保使用安全密码(应超过 8 个字符,结合数字、字符串和特殊符号),因为它将替换你在执行上述命令“sudo mysql_secure_installation” 时设置的密码。
在MySQL终端命令格式:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
这行命令是用来修改MySQL数据库中root用户在本地(localhost)访问时的身份验证方式和密码的。
参数含义如下:
•
ALTER USER 'root'@'localhost'
: 表示要修改在本地(localhost)访问的名为'root'的用户。•
IDENTIFIED WITH mysql_native_password
: 表示要将用户的身份验证方式更改为mysql_native_password,这是MySQL中较旧的身份验证方式。•
BY 'your_password'
: 表示将用户的密码更改为'your_password'。你需要将"your_password"替换为实际想要设置的密码。
执行这行命令后,将会把root用户在本地(localhost)访问时的身份验证方式修改为mysql_native_password,并设置对应的密码为'your_password'。
我在MySQL终端运行的命令格式:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'abc12345678';
修改之后,输入quit
退出MySQL终端。
然后重新在Linux终端输入: mysql -u root -p
重新登录MySQL终端验证测试。
再次查看身份验证方式:
SELECT user,authentication_string,plugin,host FROM mysql.user;
可以看到已经修改成功了。
修改之后都要记得重启服务器:
sudo /etc/init.d/mysql restart
提示如下:
[ ok ] Restarting mysql (via systemctl): mysql.service.
【9】数据库可视化工具
MYSQL安装好之后,如果每次输入sql语句时,都要使用命令行的模式输入命令来使用,未免也太枯燥了点。所以就出现了连接数据库的可视化工具。
连接数据库的可视化工具有很多。有mysql官方的mysql workbench,有DataGrip,还有navicat等等。
这里我选用的是navicat
,这是市面上比较常用的工具。
官网下载地址:https://navicat.com.cn/download/navicat-premium
下载下来,直接双击安装即可。
安装好之后默认有14天的免费使用时间,后续如果想继续使用这个百度可以解决。
进入界面后的效果。
【10】navicat连接数据库
(1)新建连接,选择MySQL
输入自己MySQL服务器的信息:
然后点击左下角的测试连接。 如果出现连接成功的提示,就没问题了。
点击确定之后,点击左上角的数据库名称,鼠标右键打开选项,进行连接即可。
【11】如果连接报错 1130,解决办法
ERROR 1130: Host xxx.xxx.xx.xxx is not allowed to connect to this MySQL server
解决办法。
先进入MySQL终端:mysql -u root -p
按顺序执行下面的命令:
(1)use mysql;
(2)select 'host' from user where user='root';
#修改host值(以通配符%的内容增加主机/IP地址),当然也可以直接增加IP地址。
(3)update user set host = '%' where user ='root';
#刷新MySQL的系统权限相关表。
(4)flush privileges;
(5)select 'host' from user where user='root';
七、STM32设备端代码
下面是设备硬件端代码main.c
代码。
#include "stm32f1xx.h" // 包含STM32 F1系列微控制器的相关头文件
#include "sht30.h" // 包含SHT30温湿度传感器的头文件
#include "light_sensor.h" // 包含光照传感器的头文件
#include "mq2_sensor.h" // 包含MQ2烟雾传感器的头文件
#include "flame_sensor.h" // 包含火焰传感器的头文件
#include "lcd_display.h" // 包含LCD显示屏相关的头文件
#include "esp8266.h" // 包含ESP8266 Wi-Fi模块的头文件
#include "buzzer.h" // 包含蜂鸣器的头文件
#include "camera_module.h" // 包含摄像头模块的头文件
#include "face_recognition.h" // 包含人脸识别模块的头文件
#include "timer.h" // 包含定时器相关的头文件
// 函数原型
void System_Init(void); // 系统初始化函数
void Read_Sensors(void); // 读取传感器数据的函数
void Handle_Environment(void); // 处理环境相关的函数(如控制光照、触发警报)
void Transmit_Data(void); // 数据传输函数
void Capture_Video(void); // 视频捕获函数
void Handle_Face_Recognition(void); // 处理人脸识别的函数
// 全局变量
float temperature, humidity; // 温度和湿度的全局变量
uint16_t light_intensity; // 光强度值
uint16_t smoke_level; // 烟雾浓度值
uint8_t flame_detected; // 火焰检测标志
int main(void)
{
// 系统初始化
System_Init();
while (1)
{
// 读取传感器值
Read_Sensors();
// 处理环境条件(例如控制照明、触发警报)
Handle_Environment();
// 将数据传输到云端服务器
Transmit_Data();
// 视频捕获和流媒体处理
Capture_Video();
// 处理用于考勤的人脸识别
Handle_Face_Recognition();
}
}
void System_Init(void)
{
// 初始化外设和通信模块
HAL_Init();
SystemClock_Config(); // 配置系统时钟
SHT30_Init(); // 初始化SHT30温湿度传感器
LightSensor_Init(); // 初始化光照传感器
MQ2_Init(); // 初始化MQ2烟雾传感器
FlameSensor_Init(); // 初始化火焰传感器
LCD_Init(); // 初始化LCD显示屏
ESP8266_Init(); // 初始化ESP8266 Wi-Fi模块
Buzzer_Init(); // 初始化蜂鸣器
CameraModule_Init(); // 初始化摄像头模块
FaceRecognition_Init(); // 初始化人脸识别模块
// 在LCD显示初始信息
LCD_DisplayString("Initializing...\nSmart Classroom System");
}
void Read_Sensors(void)
{
// 读取温湿度
SHT30_Read(&temperature, &humidity);
// 读取光照强度
light_intensity = LightSensor_Read();
// 读取烟雾浓度
smoke_level = MQ2_Read();
// 检测火焰
flame_detected = FlameSensor_Read();
// 在本地LCD屏幕上显示数据
char buffer[64];
snprintf(buffer, sizeof(buffer), "Temp: %.2fC\nHum: %.2f%%\nLight: %d\nSmoke: %d\nFlame: %s",
temperature, humidity, light_intensity, smoke_level, flame_detected ? "Yes" : "No");
LCD_DisplayString(buffer);
}
void Handle_Environment(void)
{
// 根据光照强度控制灯光
if (light_intensity < LIGHT_THRESHOLD)
{
Light_On(); // 开灯
}
else
{
Light_Off(); // 关灯
}
// 如果检测到烟雾,触发警报
if (smoke_level > SMOKE_THRESHOLD)
{
Buzzer_On(); // 开启蜂鸣器
ESP8266_SendAlert("Smoke detected in the classroom!"); // 发送警报信息
}
else
{
Buzzer_Off(); // 关闭蜂鸣器
}
// 如果检测到火焰,触发警报
if (flame_detected)
{
Buzzer_On(); // 开启蜂鸣器
ESP8266_SendAlert("Flame detected in the classroom!"); // 发送警报信息
}
}
void Transmit_Data(void)
{
// 准备数据负载
char payload[128];
snprintf(payload, sizeof(payload), "{\"temperature\":%.2f,\"humidity\":%.2f,\"light_intensity\":%d,\"smoke_level\":%d,\"flame_detected\":%d}",
temperature, humidity, light_intensity, smoke_level, flame_detected);
// 通过ESP8266将数据传输到云端
ESP8266_SendData(payload);
}
void Capture_Video(void)
{
// 使用摄像头模块捕获并流式传输视频数据
CameraModule_CaptureAndStream();
}
void Handle_Face_Recognition(void)
{
// 执行人脸识别并处理考勤
if (FaceRecognition_CheckForMatch())
{
FaceRecognition_LogAttendance(); // 记录考勤
ESP8266_SendData("{\"event\":\"attendance_recorded\"}");
}
}
八、总结
这套基于物联网技术设计的智能教室监控系统充分利用了传感器和嵌入式设备,通过物联网实现教室环境的智能监控与管理。该系统支持对教室环境温湿度的实时检测和数据采集,确保教室内环境舒适。光照强度检测模块可监测教室的光线情况,自动控制灯光的开关,优化教室内的照明条件,提高节能性。烟雾检测和火焰检测模块实时监控教室内的安全情况,一旦检测到异常,会通过蜂鸣器报警,保障教室内人员的安全。
在实时视频监控方面,该系统集成了支持RTMP协议推流的摄像头,能够实时传输声音和图像。通过人脸识别功能,系统能够自动识别并记录学生和教师的进出情况,实现无接触签到。上课期间,系统还支持定时截图上传到服务器,从而更好地了解学生的学习状态和课堂表现。
所有采集到的数据将通过ESP8266-WIFI模块利用MQTT协议上传至华为云的物联网服务器,进行数据展示和存储。同时,Windows电脑端的大屏可视化界面提供了直观的教室实时监控和环境信息展示,方便教学管理人员查看和管理。教室内的LCD显示屏也能实时显示环境信息,方便现场人员了解情况。
技术实现上,STM32开发使用Keil5软件,采用C语言编程;Windows大屏端的可视化界面通过Qt开发,使用C++编写。系统在华为云的ESC服务器上部署Ubuntu 18.04系统,搭建EMQX物联网服务器和NGINX服务器来处理数据与视频流。视频监控部分通过NGINX的RTMP模块实现实时推流,Windows端利用FFmpeg进行视频解码和播放,确保流畅的监控体验。数据存储采用MySQL数据库,方便历史数据的管理和查询。
硬件选型方面,系统主控芯片选用了STM32F103C8T6,温湿度传感器采用SHT30,烟雾检测使用MQ2气体传感器,火焰检测则采用火光传感器。显示设备为7寸LCD显示屏,通过ESP8266实现联网与通信,供电使用外置5V 2A电源,确保系统稳定运行。
整体而言,该智能教室监控系统功能齐全,集成了环境检测、安全报警、人脸识别和视频监控等功能,提供了一个高度自动化和智能化的教室环境。系统架构基于物联网技术,与华为云和多种硬件模块协同工作,为智慧校园的建设提供了一个有力的解决方案。