1. 前言
1.1 项目需求背景
假设你要建立若干个气象站,这若干个气象站可能分布到各个地点,并使用终端设备实时查看各个气象站的温度,适度,气压等数据。
1.2 你能了解到什么
- 树莓派如何连接外设
- 物联网中设备的数据上行是如何处理的
1.3 需要什么前置知识
- 约等于中级水平的GO语言相关知识
- 了解一点消息队列的pub/sub模式和product/consumer
- 了解一点硬件串口相关知识
1.4 本篇文章的侧重点
本篇文章针对于没有了解过树莓派和IOT基本数据上行流程的开发人员,通过案例讲解,最终完成一套简单的标准数据上报。
对于文中涉及的golang相关知识点,不做讲解,如果对代码有不了解地方或者发现了代码中的bug,可以在github或者文章留言区留言。
2. 整体架构及说明
整体来说分为以下几个模块
- 边缘服务器 (即树莓派 + BME280,可联网,无固定IP)
- 云服务器 (一个带IP的服务器,因为是演示项目,因此只部署单点)
- 用来展示数据的终端 (app,小程序,H5 。。。)
其中边缘服务器和云服务器会在文中多次提及
2.1 raspi边缘服务器说明
硬件配置
- 树莓派4B
- 64G sd卡
- 键盘 & 鼠标 & 显示器(有HDMI接口即可)
- BME280 环境传感器
软件配置
- OS: Ubuntu
- go1.21
2.2 家庭使用的WIFI
- 保证树莓派可以正常联网即可
2.3 开发环境
- 普通的开发设备MacOS or Windows都可以 ,能够连接WIFI和搭建go1.21开发环境即可。
2.4 云端服务器说明
由于是演示项目,因此没有什么性能要求。
云端服务器硬件配置
- cpu: 2核
- 内存: 2G
- 硬盘: 40G
程序运行环境及中间件配置
- go1.21
- emq企业版: 5.4
- kafka: 3.6
- redis: 7.2
- docker & docker-compose
3. 涉及代码及代码说明
3.1 程序地址
GitHub - hawkj/my_iot: 一个基于树莓派操作设备的框架
3.2 程序目录说明
总体目录说明
总体目录,大体上只有以上3块内容,后面会具体讲解代码的使用。
3.3 程序配置修改
3.3.1 云服务器环境配置变量修改
修改 /你的代码路径/my_iot/iot_server/.env 文件
内网IP可以通过 ipconfig 命令查找,如果是买的云服务器,也可以直接在云服务器后台查找。
3.3.2 树莓派边缘服务器向云服务器发送上行命令地址修改
修改 /你的代码路径/my_iot/raspi/config/raspi_conf.yaml 文件
其中的site-info可以理解为气象站的名称,这里可以理解为“气象站一号”,未来也可以加入经纬度来计算某一区域内的气象信息。
3.3.3 开发机向树莓派部署代码脚步修改
修改 /你的代码路径/my_iot/raspi/deploy/deploy.sh 文件
- remote_server中的IP部分指的是树莓派的连上wifi以后的局域网IP。在执行这个部署脚本时,先保证开发机和树莓派都连接到了相同的wifi,同属一个网络。
- remote_directory指的是树莓派上放置源代码的目录。
3.3.4 开发机向云服务器部署代码脚步修改
修改 /你的代码路径/my_iot/iot_server/deploy/deploy.sh 文件
- remote_server中的IP部分指的是云服务器的公网IP
- remote_directory指的是云服务器上放置源代码的目录。
4. 树莓派边缘服务器搭建
4.1 树莓派系统安装
- 在树莓官网下载 Raspberry Pi Imager 。地址为:Raspberry Pi OS – Raspberry Pi
- 我在树莓派上安装的系统是ubuntu带桌面,其他linux的系统也是可以的。
- 树莓派安装OS的文章网上有很多,如果遇到问题可自行查找。
4.2 连接BME280到树莓派并进行调试
4.2.1 BME280 硬件接口介绍
这里接口定义只需简单了解下即可。如果想了解BME280详细资料,可自行上网查找。
4.2.2 BME280 硬件连接到树莓派
连接 BME280 到树莓派的 GPIO 引脚。BME280 通常使用 I2C 连接,包括电源(VCC)、地(GND)、数据线 SDA(Serial Data)、时钟线 SCL(Serial Clock)。确保正确连接。
- VCC -> 3.3V(树莓派上的 3.3V 电源)
- GND -> GND(树莓派上的地)
- SDA -> SDA(树莓派上的 GPIO2)
- SCL -> SCL(树莓派上的 GPIO3)
连接完如上图。这一步大胆按照说明去做就行。
4.2.3 在树莓派上查看BME280环境传感器的I2C地址
我们在树莓派上使用I2C命令来查看BME280的地址
在命令行执行命令: i2cdetect -y 1
记住这个值 0x77
修改 /你的代码路径/my_iot/common/constants/constants.go 文件,将BME280I2CAddress设置为你得到的值
4.2.4 测试BME280
以下命令在开发机执行
- cd /你本地的源代码路径/my_iot/raspi/deploy
- sh ./deploy.sh
以下命令在树莓派(边缘服务器)上执行
- cd /树莓派上的上传代码目录/raspi/device
- go test -run Test_Bme280
当看到如下输出
说明bme280已可以正常工作。至此,树莓派+BME280已可以正常运行。下面我们来进行云端的配置。
5. 云端服务器搭建
5.1 设备上行消息到服务器整体流程
IOT设备一般的数据上行方式如上图所示。
1. 设备通过各自的topic将消息使用mqtt协议上传到server(这里使用的是emqx)
2. emqx 将数据转发到kafka队列中进行业务数据持久化
3. 业务端通过消费kafka队列中的消息,完成具体的业务逻辑。
5.2 中间件启动
以下操作在本地开发机上执行
- cd /你本地的源代码路径/my_iot/iot_server/deploy
- sh ./deploy.sh
以下操作在云服务器上执行
- cd /你的云服务器上传目录/iot_server
- sudo docker-compose up -d
在启动前请检查 iot_server 目录下的 .env 文件中的 INTERNAL_IP 内网地址。要确保这个内网地址设置正确。
5.2.1 kafka 创建用于接受emq消息的topic
在云服务器端执行
sudo docker exec -it kafka /opt/bitnami/kafka/bin/kafka-topics.sh --create --topic device-upload --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
5.3 emqx 消息转发设置
5.3.1 log in emqx
登录 EMQX Dashboard 替换你自己的云服务器IP。
首次登录用户名/密码:admin/public
5.3.2 设置连接器
kafka连接器只有emq企业版才有,这就是我们选择企业版的原因。
做如下设置:
kafka:9092 也可以改为{你的云服务器内网IP}:9092。这里可以直接使用kafka是因为所有中间件在docker-compose文件中被设置到了一个网络里。如果你没有使用docker-compose启动中间件,这里就需要改成你的内网IP。
最后,在连接器列表中看到
即配置连接器成功。
5.3.3 emq消息转发kafka规则设置
入口
新增规则
SELECT
topic,payload,clientid
FROM
"device/upload/#"
在此页面中,点击页面右边的添加动作按钮
做如下配置
至此,完成emq消息转发给kafka进行持久化配置。
6. 启动项目
6.1 启动SME280传感器
进入树莓派服务器
先换一下源,执行: go env -w GOPROXY=https://goproxy.cn,direct
- cd 你的树莓派代码目录/raspi/deploy
- sh ./build_job.sh
- sh ./start_job.sh bme280 {}
JOB进程启动后,可以根据启动后指定的log目录,进去看一下是否有错误信息。
6.2 启动云服务端消费程序
登录你云服务器
先换一下源,执行: go env -w GOPROXY=https://goproxy.cn,direct
- cd /你的云服务器代码上传目录/iot_server/deploy
- sh ./build_job.sh
- sh ./start_job.sh device_upload_consumer {}
JOB进程启动后,可以根据启动后指定的log目录,进去看一下是否有错误信息。
6.3 启动应用服务接口
登录你云服务器
- cd /你的云服务器代码上传目录/iot_server/deploy
- sh ./service_start web_socket
6.4 查看站点气象数据
Api 请求地址:
curl --location 'http://{你的云服务器域名或公网IP:}8901/api/device/info?device_code=bme280' \
--header 'Site-Id: weather_station_1'
请求参数说明
- Site-Id (header 传递) 气象站点ID
- device_code (query 传递) 设备编码
请求header中传递的Site-Id,来自于项目配置文件中的site-info。如果多站点配置,只需要修改不通站点的site-info就可以。
返回数据:
// 返回数据中的 timestamp , 为消息在边缘服务器最初被生产出来的时间。
{
"code": 0,
"data": "{\"humidity\":19.166992,\"pressure\":101042.2,\"temperature\":24.76,\"timestamp\":1704887724}"
}
6.5 远程访问边缘服务器
由于边缘服务器是没有独立IP的,因此我们不可以直接访问。
常用的解决方法是:
1. 边缘服务器进行反向SSH连接到某个云服务器。我们先SSH登录这个有独立IP的云服务器,然后再SSH登录到边缘服务器即可。同样道理,当反向SSH通道建立成功后,我们也可以先把代码上传到云服务器上,然后从云服务器上部署代码到边缘服务器,再登录边缘服务器启动程序。
2. 使用vpn解决
PS
至此,一个BME280环境传感器从产生数据到最后在终端展现的完整流程就结束了。
本篇文章作为入门篇只介绍了单一站点(weather_station_1),单一设备(BME280环境传感器)的数据上行流程,相较于正式项目,还有一些需要补充的内容。
由于个人精力有限,后续有精力会继续完成。
未完成的部分文章来源:https://www.toymoban.com/news/detail-805517.html
- 服务器下行消息到设备
- 设备数据写进influxDB等时序数据库,进行数据的时段分析
- 边缘计算相关,比如数据告警,如果设备在一段时间内数据出现异常(举例:一分钟内平均温度高于40摄氏度),进行数据上报。
- 设备数据结构比较简单,只有一个型号,没有对应的设备初始化流程,比如生成设备ID及对应的设备属性(设备在线、离线等判断)
- 上行/下行 链路数据追踪。
- 等等
欢迎感兴趣的小伙伴提交pull request来补充新功能或者逻辑修改。文章来源地址https://www.toymoban.com/news/detail-805517.html
到了这里,关于【树莓派IOT入门】模拟搭建一个气象站的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!