智能家居物联网平台
智能家居物联网平台
基于微服务+微信小程序实现的物联网平台,目前处于软件实现阶段:模拟了智能灯和温湿度感应器的使用状态,后续打算基于STM32制作硬件并接入,接入硬件后会将微信小程序改成Android版本
Gitee地址:仓库链接
技术栈
后端
- JDK:21
- Spring Boot:3.2.5
- Spring Cloud:2023.0.1
- Spring Cloud Alibaba:2023.0.1.0
- Spring Data JPA
- Nacos:2.5.2
- MQTT
- WebSocket
数据库
- MySQL:8.0
- Redis:6.2.x
- Influxdb:2.8.0
前端
- Uniapp
- Vue2
部署流程
需要先确保技术栈中所有的依赖均已安装,MQTT这里使用的中间件是EMQX(5.8.9),测试MQTT连接使用的是MQTTX。推荐将中间件安装在vmware中,我使用的Linux版本是20.04,yml文件中部分配置使用的是192.168.242.137而非本机地址,根据自己的配置进行替换
准备工作
- 安装
MySQL和Redis,替换账号密码 - 安装
MQTT中间件EMQX,并新建用户分配权限,将用户名和密码在yml中对应位置进行替换 - 安装
Influxdb,获取自己配置的用户名和密码进行替换,注意要先创建bucket:device_report - 安装
Nacos用于服务注册
1. 克隆仓库代码
- 后端使用
IDEA软件 - 仓库代码中
iot_miniprogram.zip为前端压缩包,解压后使用uniapp打开
2. MySQL中运行iot.sql文件
3. 启动所有服务
- gateway-service
- user-service
- device-service
4. 在uniapp中替换manifest.json文件中微信小程序的AppID并运行到微信小程序
5. 查看MySQL中用户表手机号,使用手机号进行登录,登录成功后可以开始体验
项目中所有的控制器controller、入参和回参都带注释,可以查看注释了解对应功能
MQTT主题说明
为了及时更新设备联网状态,使用了EMQX自带的主题上下线订阅。在yml文件中,预置订阅的主题$SYS/brokers/+/clients/#可以在设备上下线后推送通知。
**所有的设备在与MQTT建立连接时,设置的client_id为数据库中iot_device**表中的device_sn字段,这样服务器收到消息时可以通过sn(设备序列号)来标识每一个设备
MQTT所有消息体均使用JSON格式
WebSocket连接说明
在device-service服务中的WebsocketConfig文件中,可以看到建立连接时会校验token参数,由于token只有在登录成功后才会返回给用户,因此没有携带此参数的连接会被拒绝。这个权限校验方式可能还不太完善,后续会考虑使用其他校验方式
学习说明
本项目目前比较简单,微服务中只拆分了网关服务,用户服务和设备服务
- 网关服务主要用于负载均衡,
Nacos很多特性比如统一配置管理和自动刷新还没有使用; - 用户服务权限校验也只是引入了
JWT,后续打算使用Spring Security做权限校验 - 设备服务中
Influxdb的定时同步还可以继续优化,目前是逻辑是每2分钟同步一次温湿度消息,可能延迟会有点严重,再想想怎么同步好一点 - MQTT的监听消息逻辑中,会考虑使用消息队列
RabbitMQ或者异步处理,因为在实际操作中,出现过一个BUG,监听消息处理过程中,如果处理时间过长会影响MQTT的心跳,导致MQTT发生重连 - 最重要一点:目前智能灯的指令下发没有做确认操作,可能会出现指令下发了,但是硬件没有接收,这会导致数据库状态不对,需要对已下发的指令做短时间监听,硬件回传状态后再进行数据库的更改
