树莓派IOT入门:实战搭建气象站教程

1. 前言

1.1 项目需求背景

假设你要建立若干个气象站,这若干个气象站可能分布到各个地点,并使用终端设备实时查看各个气象站的温度,适度,气压等数据。

1.2 你能了解到什么

  • 树莓派如何连接外设
  • 物联网中设备的数据上行是如何处理的
  • 1.3 需要什么前置知识 

  • 约等于中级水平的GO语言相关知识
  • 了解一点消息队列的pub/sub模式和product/consumer
  • 了解一点硬件串口相关知识
  • 1.4 本篇文章的侧重点

    本篇文章针对于没有了解过树莓派和IOT基本数据上行流程的开发人员,通过案例讲解,最终完成一套简单的标准数据上报。

    对于文中涉及的golang相关知识点,不做讲解,如果对代码有不了解地方或者发现了代码中的bug,可以在github或者文章留言区留言。

    2. 整体架构及说明

    整体来说分为以下几个模块

    1. 边缘服务器 (即树莓派 + BME280,可联网,无固定IP)
    2. 云服务器 (一个带IP的服务器,因为是演示项目,因此只部署单点)
    3. 用来展示数据的终端 (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环境传感器)的数据上行流程,相较于正式项目,还有一些需要补充的内容。

    由于个人精力有限,后续有精力会继续完成。

    未完成的部分

  • 服务器下行消息到设备
  • 设备数据写进influxDB等时序数据库,进行数据的时段分析
  • 边缘计算相关,比如数据告警,如果设备在一段时间内数据出现异常(举例:一分钟内平均温度高于40摄氏度),进行数据上报。
  • 设备数据结构比较简单,只有一个型号,没有对应的设备初始化流程,比如生成设备ID及对应的设备属性(设备在线、离线等判断)
  • 上行/下行 链路数据追踪。
  • 等等
  • 欢迎感兴趣的小伙伴提交pull request来补充新功能或者逻辑修改。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 树莓派IOT入门:实战搭建气象站教程

    发表评论