乐趣区

关于.net:使用MASA全家桶从零开始搭建IoT平台一环境准备

前言

本系列文章以 IoT 开发小白的角度,从零开始应用.Net 为次要技术搭建一个简略的 IoT 平台,因为是入门系列,所有代码以围绕 IoT 根底业务场景为主,不会波及 DDD 等设计思维。

架构图

这里是咱们整个 IoT 平台的架构图。

一、设施接入

1、针对能够联网的设施,间接通过 MQTT 协定连贯到咱们的 MQTT 服务上(能够应用国内的阿里云、Onenet 也能够应用开源 EMQX 实现)。绿色线框局部
2、针对不能联网的设施,例如只能通过红外、短信、等其余非互联网技术通信的,采纳设施网关对立接管,这里次要波及硬件相干内容咱们不深刻探讨。橙色线框局部

二、解决设施遥测数据

咱们通过 MQTT Hub 订阅设施公布到 MQTT 的音讯,并通过 Dapr 的 Pub/Sub 形式发送给咱们的 IoT Core 集群,咱们能够通过 MQTT 5.0 协定中的共享订阅形式实现咱们高可用集群。蓝色线框局部

三、设施管制

间接在 IoT Core 中间接向 MQTT 公布控制指令。红色箭头所示

四、治理后盾

治理后盾咱们采纳 Blazor 搭建联合 MASA Auth 实现权限管制,红色线框局部,在 IoT Core 和 IoT UI 两头有一层 Gateway,次要是不便咱们在这一层 Mock 一些依赖的第三方业务接口,例如某个环节我须要从生产的 MES 零碎获取某些信息能力持续上面的操作,咱们能够在 Gateway 层去 Mock 这些接口和数据,不便咱们测试。

五、数据存储

业务数据咱们存储到关系型数据库中,设施的音讯数据(遥测数据),咱们存储到时序库中,不便统计查找,和生成报表。

六、规定引擎

针对不同类型的音讯,咱们能够在规定引擎中配置,使音讯能够走不同的解决流程,例如接入的第三方零碎设施,设施音讯可能是加密的,咱们就通过规定引擎将这种类型的音讯发送到第三方零碎解密之后再存储到数据库中,也能够在这里针对遥测数据进行剖析和过滤,产生分级告警信息,发送到对应的解决零碎或者干系人邮箱等。

环境筹备

1、装置 EMQX

1、运行以下命令获取 Docker 镜像:

docker pull emqx/emqx:5.0.20

2、运行以下命令启动 Docker 容器

docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.0.20

2、创立解决方案

创立解决方案 MASA.IoT,别离增加
1、WebApi 我的项目 MASA.IoT.Core,对应架构图中 IoT Core
2、WebApi 我的项目 MASA.IoT.Hub,对应架构图中 IoT Hub
3、Blazor 利用 MASA.IoT.UI, 对应架构图中的 IoT.UI, 也就是治理后盾
4、类库 MASA.IoT.Common,寄存一些动态的公共办法

3、装置 Dapr 开发环境

Dapr 的全称是“Distributed Application Runtime”,即“分布式应用运行时”。是一个开源我的项目,由微软发动
对 Dapr 不理解的同学能够学习,鬼老师的 Dapr 系列文章

应用 Masa DaprStarter 搭建开发环境

装置 Dapr

Windows 装置 Dapr 的形式有很多,能够参考官网文档

https://docs.dapr.io/getting-started/install-dapr-cli/

国内如果拜访迟缓,倡议间接下载 msi 文件装置

https://github.com/dapr/cli/releases

装置一路下一步即可。

装置 Docker Desktop

间接参考官网文档,这里不过多赘述

https://docs.docker.com/desktop/install/windows-install/

初始化 Dapr

命令行执行

dapr init

这里如果有相似网络谬误,那就须要思考魔法上网或者间接到 dapr 的 github 上下载 dashboard_darwin_amd64.zip
daprd_windows_amd64.zip 两压缩包,
执行 dapr init 有了 bin 目录后 看准机会 把下载好的两个压缩包复制进去
例如:C:\Users\Administrator\.dapr 下的 bin 目录中,该目录下的压缩包会主动解压
如果失败能够通过 dapr uninstall 命令卸载后重试。
装置胜利后通过 dapr -v 能够看到如下版本信息

在 Docker Desktop 中会创立三个容器

代码开发

咱们新建两个 WebApi 我的项目,模仿微服务之间通过 dapr 调用的场景。
新建 webapi 我的项目 PubDemoSubDemo,并别离装置 Dapr.ClientMasa.Contrib.Development.DaprStarter.AspNetCore后者不便咱们在开发环境治理 dapr 的生命周期。
咱们在 SubDemo 我的项目中额定装置 Dapr.AspNetCore
PubDemoProgram.cs 增加

if (builder.Environment.IsDevelopment())
{builder.Services.AddDaprStarter(builder.Configuration.GetSection("DaprOptions"), false);
}

并在配置文件中增加 DaprOptions 配置

  "DaprOptions": {
    "AppId": "pub-demo-webapi",
    "AppPort": 18009,
    "AppIdSuffix": "","DaprGrpcPort": 20333,"DaprHttpPort": 20334,"LogLevel":"debug"
  }

同样在 SubDemo 增加上述内容, 留神端口号不要反复。

  "DaprOptions": {
    "AppId": "sub-demo-webapi",
    "AppPort": 19009,
    "AppIdSuffix": "","DaprGrpcPort": 20233,"DaprHttpPort": 20234,"LogLevel":"debug"
  }

这里须要留神在 SubDemo 我的项目中 AppPort 须要与 launchSettings.json 中利用的启动端口保持一致,这里都是 19009,这个AppPort 不是 dapr 的端口 而是须要与 dapr sidecar 通信的应用程序的端口地址。

    "SubDemo": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "launchUrl": "swagger",
      "applicationUrl": "http://localhost:19009",
      "environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}

SubDemo 中还须要订阅相干的配置,残缺代码如下

var builder = WebApplication.CreateBuilder(args);
// 注册 Dapr
// 将 AddDapr 扩大办法附加到 AddControllers 扩大办法会注册必要的服务以将 Dapr 集成到 MVC 管道中
builder.Services.AddControllers().AddDapr();
if (builder.Environment.IsDevelopment())
{builder.Services.AddDaprStarter(builder.Configuration.GetSection("DaprOptions"), false);
}
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();
if (app.Environment.IsDevelopment())
{app.UseSwagger();
    app.UseSwaggerUI();}
app.UseHttpsRedirection();
app.UseAuthorization();
// 将 CloudEvents 中间件增加到 ASP.NET Core 中间件管道中
app.UseCloudEvents();
app.MapControllers();
// 终结点路由配置中对 MapSubscribeHandler 的调用会将 Dapr 订阅终结点增加到应用程序。app.MapSubscribeHandler();
app.Run();

留神这里,app.MapSubscribeHandler();
此终结点将响应 /dapr/subscribe 上的申请。调用此终结点时,它将主动查找应用 Topic 属性润饰的所有 WebAPI 操作方法,并批示 Dapr 为这些办法创立订阅。
咱们在 SubDemo 新建一个 WebApi 接口来订阅 Pub 数据

namespace SubDemo.Controllers
{[Route("api/[controller]")]
    [ApiController]
    public class SubTestController : ControllerBase
    {[Topic("pubsub", "testdata")]
        [HttpPost("testdata")]
        public void TestData([FromBody] string testStrData)
        {Console.WriteLine("Subscriber received :" + testStrData);
        }
    }
}

这里 Topic 第一个参数为 pubsub 组件名称,第二个参数为订阅的主题名称。默认的 pubsub 组件配置在 C:\Users\Administrator.dapr\components 目录下。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: pubsub
spec:
  type: pubsub.redis
  version: v1
  metadata:
  - name: redisHost
    value: localhost:6379
  - name: redisPassword
    value: ""

SubDemo 编写结束,接下来再 PubDemo 中增加一个测试 Api

using Dapr.Client;
using Microsoft.AspNetCore.Mvc;

namespace PubDemo.Controllers
{[Route("api/[controller]")]
    [ApiController]
    public class PubTestController : ControllerBase
    {
        private readonly Dapr.Client.DaprClient daprClient;
        public PubTestController()
        {daprClient = new DaprClientBuilder().Build();}
        [HttpPost]
        public async Task PostTestDataAsync([FromBody] string testStrData)
        {await daprClient.PublishEventAsync("pubsub", "testdata", testStrData);
        }
    }
}

这里间接通过 PublishEventAsync 办法向 testdata 写入一条文本信息。

测试成果

咱们同时启动 SubDemo 和 PubDemo 两个我的项目。
利用齐全启动后,在命令行通过 dapr list 能够看到 DaprStarter 曾经帮咱们启动好了两个 dapr 实例。

在 SubDemo 的日志中,咱们能够看到 Dapr 启动和订阅胜利的日志

咱们调用 PubDemo 中的测试 Api,能够在 SubDemo 的日志看到生产胜利的日志

也能够在 redis 中看到对应的记录

咱们关上 zipkin 还能够看到链路信息。这里仅作演示,前面咱们会接入弱小的 MASA Stack 全家桶,应用其中的 TSC 服务剖析链路信息会更不便和直观。

还能够查看依赖关系,十分不便。

全文完结。
以上就是明天要讲的内容,本文仅仅简略介绍了咱们 IoT 后盾的根本架构,下一章咱们讲设施的生命周期


如果你对咱们的 MASA Framework 感兴趣,无论是代码奉献、应用、提 Issue,欢送分割咱们

WeChat:MasaStackTechOps
QQ:7424099

退出移动版