项目背景
1.在学习了很多基础知识后,对所学内容的一个结合汇总以及通过具体的场景进行联系。
2.为后续的暑期实习和秋招提前做项目上的准备。
项目简介
本项目主要实现的功能为:复杂环境的监控,环境信息的传输,服务器对环境信息的处理和对客户端连接的处理,客户端的实现和与服务器的通信过程。项目中涉及:stm32,硬件驱动,C/C++,Python,Linux系统及网络编程,线程池,QT,Mysql等等知识点,涉及内容广泛,可做练手使用。
项目结构
本项目讲主要分为四部分分享,包括下位机stm32端,rk3568Linux服务器端,QT客户端,阿里云物联网模型设置。下面简要介绍每部分所实现的功能。
1.下位机stm32端:
环境检测:单总线驱动DHT11获取温湿度;ADC获取光照强度以及雨滴检测器的数值;此处可任意加传感器模块,使用对应协议驱动即可。
数据存储:使用spi总线驱动w25q64芯片对数据进行读取和存储。
主动装置:定时器pwm控制sg90舵机转向模拟开关门;gpio驱动led模拟系统运行状态以及电灯;舵机sg90(pwm驱动)配合超声波模块hc-sr04(输入捕获检测)实现监控功能;pwm驱动直流电机模拟风扇旋转,4个按键通过单机,双击,长按实现不同的设置和显示转换功能;编码器用于对监测上下限参数的调整;蜂鸣器对异常情况进行报警。
外部通信:串口转蓝牙模块(透传)实现和外部蓝牙设备的通信;串口转esp01s(内置mqtt协议)实现与阿里云物联网模型实现通信;模拟iic总线驱动0.96存oled屏幕显示相关参数。
软件设计:看门狗设置防止程序跑飞;适当情况关中断保证单总线通信正常;对中断优先级进行设置;全局变量通过指针结构体进行优化。
大体功能如图1所示(功能不全):

2.rk3568Linux服务器端
父进程epoll+线程池服务器架构设计:基于socket实现C/S结构的tcp通信;使用epoll对应的函数簇实现对连接套接字的监控;在有连接请求时通过分配线程池中的线程实现与客户端的通信工作,具体结构如图2所示。

子进程与阿里云和父进程通信:通过阿里云提供的Python程序获取阿里云物联网下发的环境信息;对下发信息进行解包以及组包通过共享内存转发置父进程。
线程处理函数:使用状态机思想分离不同状态的处理逻辑;实现与qt客户端的通信以及和阿里云物联网平台的通信工作;通过Mysql的API操作我位于Linux上的数据库,实现登录,注册,账户管理等功能,具体如图3所示(此为初始版本,最终版本可能有所差异):

3.QT客户端
网络信息界面:显示自身ip和服务器ip信息;实现其他界面的切换按钮实现包括环境显示,设置,登录,具体如图4所示:

登录、注册、人员管理界面:登录界面实现人员登录功能;注册界面实现人员注册功能;人员管理界面实现人员信息的展示,对人员信息的修改功能,具体界面如图5所示:

环境显示界面:实现下位机环境状态的显示,包括但不限于:超声波监控数据,温湿度,下雨状态,电机风扇状态,门状态,系统是否安全的评估等等。
环境设置界面:实现对下位机可操作器件的设置功能,包括但不限于:超声监控的设置,led,门状态等等,具体界面设计如图6所示:

4.阿里云物联网
mqtt协议简介:mqtt协议可通过主题的订阅和发布来实现两端通信,订阅用于接收信息,而发布用于发送自己的信息。阿里云物联网官网:https://iot.console.aliyun.com/
主要使用使用图7中的产品,设备,服务端订阅,云产品流转功能:

产品:对一类产品进行表征的一个概念,产品中存在topic列表,该topic列表就是用于发布和订阅的主题,也就是理解为通信的频道。
设备:位于产品之下一层的概念,代表同一类产品中不同的具体产品。
服务端订阅:实现stm32到Linux服务器的环境信息流转,可将stm32上传的信息转发到RK3568Linux服务器端做后续操作。
云产品流转:实现QT客户端->linux服务器->阿里云->stm32的链路,可将linux下发的环境设置信息转发到stm32下位机端进行设置。
本部分仅对各部分的功能做介绍,其具体实现可参考网上教程以及阿里云物联网官方提供的教程。
分享计划
计划分下位机,服务器,客户端进行分享,在后面会陆续给出三个部分的具体实现、设计和部分关键代码,在完成后对项目代码进行开源,同时欢迎各位大佬在项目分享的过程中分享自己的想法,对项目的实现进行自己的优化和评论,博主希望在和大家交流的过程中相互学习,共同进步。