基于.NET 制作一个气象站 IoT 应用

Posted DotNET技术圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于.NET 制作一个气象站 IoT 应用相关的知识,希望对你有一定的参考价值。

点击“阅读原文”获得最佳阅读体验。

和单片机不同,使用 Linux 开发板、现成的传感器套件以及合适的后端技术几乎可以做成任何东西。为了更好的整合前面章节介绍的内容,本文将制作一个简单的气象站(也许叫环境信息收集装置更合适),至于为何选择制作一个气象站,因为难度不高制作不复杂,并且温湿度传感器花费较低的价格即可获得,可以以低廉的价格换取一个 cool stuff。本文将使用 .NET 6 编写一个控制台应用程序,通过本文你可以学到:

  1. I2C I2cDevice 类的使用;

  2. 摄像头设备 VideoDevice 类的使用;

  3. Iot.Device.Bindings NuGet 包的使用;

  4. 时序数据库 TimescaleDB 的简单使用;

  5. Quartz 定时任务的使用;

  6. 在控制台应用中进行依赖注入;

  7. 使用 Docker 拉取镜像、部署应用。

  • 硬件需求

  • 电路

  • 准备工作

  • 配置 TimescaleDB 数据库

  • 安装摄像头的依赖库

  • 编写代码

  • 项目结构

  • 项目依赖

  • 数据库上下文与实体类

  • 配置文件

  • 初始化与依赖注入配置

  • 配置定时任务

  • 部署应用

  • 发布到文件

  • 构建 Docker 镜像

  • 后续工作

  • OWNER postgres ENCODING metrics (
    WITHOUT ZONE device_id weather_type temperature humidity pressure image_base64 create_hypertable( [ Time DateTime.Now;

    [ DeviceId [ WeatherType [ Temperature [ Humidity [ Pressure [ ImageBase64 : _connectString;

    connectString)

    _connectString connectString;


    optionsBuilder)

    AppContext. optionsBuilder.

    modelBuilder)

    modelBuilder. . .

    这里使用了一个传递数据库连接字符串的构造函数,连接字符串从 appsettings.json 文件中读取。由于 metrics 表是无主键的,还需要使用 HasNoKey() 进行标记。EF Core 由于使用了实体跟踪,因此无法对无主键的表进行修改,只能通过执行 SQL 的方式插入数据,在 Metrics.cs 中新增方法:

    context, metrics)

    row context.Database. row


    ServiceProvider config . .context i2cSettings i2c I2cDevice.bme videoSettings video VideoDevice. . . . . .: context)

    Task.()
    );


    bme (Bme280)AppConfig.ServiceProvider. bme. bme.PressureSampling Sampling.UltraHighResolution;
    bme.TemperatureSampling Sampling.UltraHighResolution;
    bme.HumiditySampling Sampling.UltraHighResolution;

    bme.p);
    bme.t);
    bme.h);

    bme.
    DeviceId Dns. Temperature Math. Humidity Math. Pressure Math. ;

    video (VideoDevice)AppConfig.ServiceProvider. image video. Convert. config (IConfigurationRoot)AppConfig.ServiceProvider. client
    json client. (
    (


    context)

    Task.()
    metrics metrics.WeatherType metrics.ImageBase64 context (WeatherContext)AppConfig.ServiceProvider. Metrics. );

    trigger TriggerBuilder. . .jobDetail JobBuilder. . .factory scheduler factory.scheduler.scheduler.mcr.microsoft.com/dotnet/core/sdk:6.0-focal-arm32v7 build
    /app

    src .
    /app/WeatherMetrics.ConsoleApp
    dotnet restore
    dotnet publish -c release -r linux-arm -o out

    mcr.microsoft.com/dotnet/core/runtime:6.0-focal-arm32v7 runtime
    /app
    /app/WeatherMetrics.ConsoleApp/out ./

    apt update && apt install -y --allow-unauthenticated v4l-utils libc6-dev libgdiplus libx11-dev

    [metrics
    DESC

    硬件是软件的基础,对收集到的数据后续可以使用其他技术进行处理,比如可以使用 ASP.NET 编写 WEB 应用对数据进行展示,或者可以使用 ML.NET 构建机器学习模型对天气进行预测等等。

    张高兴的 .NET IoT 入门指南:制作一个气象站

    距离上一篇《张高兴的 .NET Core IoT 入门指南》系列博客的发布已经过去 2 年的时间了,2 年的时间 .NET 版本发生了巨大的变化,.NET Core 也已不复存在,因此本系列博客更名为 《张高兴的 .NET IoT 入门指南》,我也重新审阅了之前的内容进行了相应的更改以保证内容的时效性。

    和单片机不同,使用 Linux 开发板、现成的传感器套件以及合适的后端技术几乎可以做成任何东西。为了更好的整合前面章节介绍的内容,本文将制作一个简单的气象站(也许叫环境信息收集装置更合适),至于为何选择制作一个气象站,因为难度不高制作不复杂,并且温湿度传感器花费较低的价格即可获得,可以以低廉的价格换取一个 cool stuff。本文将使用 .NET 6 编写一个控制台应用程序,通过本文你可以学到:

    1. I2C I2cDevice 类的使用;
    2. 摄像头设备 VideoDevice 类的使用;
    3. Iot.Device.Bindings NuGet 包的使用;
    4. 时序数据库 TimescaleDB 的简单使用;
    5. Quartz 定时任务的使用;
    6. 在控制台应用中进行依赖注入;
    7. 使用 Docker 拉取镜像、部署应用。

    硬件需求

    名称 描述 数量
    Orange Pi Zero Linux 开发板 x1
    BME280 提供温度、湿度以及气压数据 x1
    USB 摄像头 提供环境图像 x1
    杜邦线 传感器与开发板的连接线 若干

    电路

    传感器 接口 开发板接口
    BME280 SDA TWI0_SDA (Pin 3)
    SCL TWI0_SCK (Pin 5)
    VCC 5V (Pin 4)
    GND GND (Pin 6)
    USB 摄像头 USB USB

    准备工作

    配置 TimescaleDB 数据库

    TimescaleDB 是一款基于 PostgreSQL 插件的时序数据库。考虑到收集的环境数据是按时间进行索引,并且数据基本上都是插入,没有更新的需求,因此选用了时序数据库作为数据存储。TimescaleDB 是 PostgreSQL 的一款插件,可以通过先安装 PostgreSQL 之后再安装插件的形式部署 TimescaleDB,这里直接使用 TimescaleDB 的 Docker 镜像进行部署。

    1. 拉取 TimescaleDB 镜像:
    docker pull timescale/timescaledb:latest-pg14
    
    1. 创建卷,用于持久化数据库数据:
    docker volume create tsdb_data
    
    1. 运行镜像,端口映射为 54321,密码配置为弱密码 @Passw0rd
    docker run -d --name timescaledb -p 54321:5432 --restart=always -e POSTGRES_PASSWORD=\'@Passw0rd\' -e TZ=\'Asia/Shanghai\' -e ALLOW_IP_RANGE=0.0.0.0/0 -v tsdb_data:/var/lib/postgresql timescale/timescaledb:latest-pg14
    
    1. 使用熟悉的数据库管理工具(如 Navicat)创建数据库 WeatherMetrics
    CREATE DATABASE "WeatherMetrics"
    WITH OWNER = postgres ENCODING = \'UTF8\';
    
    CREATE TABLE metrics (
       time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT \'now()\',
       device_id VARCHAR(50) NULL,
       weather_type VARCHAR(50) NULL,
       temperature DECIMAL(5, 2) NULL,
       humidity DECIMAL(5, 2) NULL,
       pressure DECIMAL(8, 2) NULL,
       image_base64 TEXT NULL
    );
    
    SELECT create_hypertable(\'metrics\', \'time\');
    

    time 表示采集数据的时间,device_id 记录采集设备的 id,weather_type 记录从心知天气获取的天气名,temperature 记录传感器获取的温度,humidity 记录传感器获取的湿度,pressure 记录传感器获取的气压,image_base64 记录摄像头采集的图像。