前言

本系列文章以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/v1alpha1kind: Componentmetadata:  name: pubsubspec:  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