树莓派IOT入门:实战搭建气象站教程
1. 前言
1.1 项目需求背景
假设你要建立若干个气象站,这若干个气象站可能分布到各个地点,并使用终端设备实时查看各个气象站的温度,适度,气压等数据。
1.2 你能了解到什么
1.3 需要什么前置知识
1.4 本篇文章的侧重点
本篇文章针对于没有了解过树莓派和IOT基本数据上行流程的开发人员,通过案例讲解,最终完成一套简单的标准数据上报。
对于文中涉及的golang相关知识点,不做讲解,如果对代码有不了解地方或者发现了代码中的bug,可以在github或者文章留言区留言。
2. 整体架构及说明
整体来说分为以下几个模块
- 边缘服务器 (即树莓派 + BME280,可联网,无固定IP)
- 云服务器 (一个带IP的服务器,因为是演示项目,因此只部署单点)
- 用来展示数据的终端 (app,小程序,H5 。。。)
其中边缘服务器和云服务器会在文中多次提及
2.1 raspi边缘服务器说明
硬件配置
软件配置
2.2 家庭使用的WIFI
2.3 开发环境
2.4 云端服务器说明
由于是演示项目,因此没有什么性能要求。
云端服务器硬件配置
程序运行环境及中间件配置
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 文件
3.3.4 开发机向云服务器部署代码脚步修改
修改 /你的代码路径/my_iot/iot_server/deploy/deploy.sh 文件
4. 树莓派边缘服务器搭建
4.1 树莓派系统安装
4.2 连接BME280到树莓派并进行调试
4.2.1 BME280 硬件接口介绍
这里接口定义只需简单了解下即可。如果想了解BME280详细资料,可自行上网查找。
4.2.2 BME280 硬件连接到树莓派
连接 BME280 到树莓派的 GPIO 引脚。BME280 通常使用 I2C 连接,包括电源(VCC)、地(GND)、数据线 SDA(Serial Data)、时钟线 SCL(Serial Clock)。确保正确连接。
连接完如上图。这一步大胆按照说明去做就行。
4.2.3 在树莓派上查看BME280环境传感器的I2C地址
我们在树莓派上使用I2C命令来查看BME280的地址
在命令行执行命令: i2cdetect -y 1
记住这个值 0x77
修改 /你的代码路径/my_iot/common/constants/constants.go 文件,将BME280I2CAddress设置为你得到的值
4.2.4 测试BME280
以下命令在开发机执行
以下命令在树莓派(边缘服务器)上执行
当看到如下输出
说明bme280已可以正常工作。至此,树莓派+BME280已可以正常运行。下面我们来进行云端的配置。
5. 云端服务器搭建
5.1 设备上行消息到服务器整体流程
IOT设备一般的数据上行方式如上图所示。
1. 设备通过各自的topic将消息使用mqtt协议上传到server(这里使用的是emqx)
2. emqx 将数据转发到kafka队列中进行业务数据持久化
3. 业务端通过消费kafka队列中的消息,完成具体的业务逻辑。
5.2 中间件启动
以下操作在本地开发机上执行
以下操作在云服务器上执行
在启动前请检查 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
JOB进程启动后,可以根据启动后指定的log目录,进去看一下是否有错误信息。
6.2 启动云服务端消费程序
登录你云服务器
先换一下源,执行: go env -w GOPROXY=https://goproxy.cn,direct
JOB进程启动后,可以根据启动后指定的log目录,进去看一下是否有错误信息。
6.3 启动应用服务接口
登录你云服务器
6.4 查看站点气象数据
Api 请求地址:
curl –location 'http://{你的云服务器域名或公网IP:}8901/api/device/info?device_code=bme280' \
–header 'Site-Id: weather_station_1'
请求参数说明
请求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环境传感器)的数据上行流程,相较于正式项目,还有一些需要补充的内容。
由于个人精力有限,后续有精力会继续完成。
未完成的部分
欢迎感兴趣的小伙伴提交pull request来补充新功能或者逻辑修改。