使用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的方式有很多,可以参考官方文档
国内如果访问缓慢,建议直接下载msi文件安装
安装一路下一步即可。
安装Docker Desktop
直接参考官方文档,这里不过多赘述
初始化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项目PubDemo和SubDemo,并分别安装Dapr.Client和Masa.Contrib.Development.DaprStarter.AspNetCore后者方便我们在开发环境管理dapr的生命周期。 我们在SubDemo项目中额外安装Dapr.AspNetCore。 在PubDemo的Program.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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
App复杂动画实现——Rive保姆级教程 | 京东云技术团队
作者:京东物流 沈明亮 在App开发过程中,如果想实现动画效果,可以粗略分为两种方式。一种是直接用代码编写,像平移、旋转等简单的动画效果,都可以这么干,如果稍微复杂点,就会对开发工程师的数学功底、图形图像学功底有很高的要求。 另一种方式,可以让UI同学配合,一次性出多张图片或者直接出一张GIF图,通过短时间内快速轮播图片的方式来实现复杂动画效果,这种方式真正实现起来还是有挺多问题的,比如缺少对动画过程的控制、图片尺寸的适配等等。那么,有没有更好的解决方案呢? 有的,Rive。 简介 Rive是专门为简化动画的实现而生的,设计师可以在其官网通过拖拉拽实现各种复杂动画效果,设计完毕后导出动画文件,工程师可以在App里直接导入此文件,配合相应的SDK即可实现。 其官网有详细的开发文档,同时也有自己的社区资源,我们可以直接从社区里下载别人设计好的动画效果进行学习。另外特别重要的是,Rive支持跨平台,同时支持Android、iOS、Flutter、JS、React、C++等等,本文以Flutter的实现为例介绍。 一个完整的例子 登陆Rive官网进行设计,并导出相应的动画文件,Rive的动画文...
- 下一篇
如何科学判断研发团队是否在健康工作?(内附量表)
研发效能管理覆盖了交付速度、质量和价值三个维度,但文化建设、团队氛围和客户协作等其他因素对团队工作的影响又该如何度量和管理呢? LigaAI 在 John Cutler 的一篇分享中找到了答案:团队健康度评分。就像我们都很关心自己的身体健康一样,研发管理者也应该时刻关注「研发团队的健康」,定期度量和检测与成功、健康有关的关键指标,并在每日管理中发现问题,持续进步。 具体是怎么做的? John Cutler 制作了一个「团队健康日查表」,拟定了 12 个与团队健康状态相关的问题,分别为其赋予了权重值并每日更新打分。 通过分析和对比每日评分,就能比较清晰地掌握研发团队的工作状态和表现,在必要时及时投入指导。 (表格获取自 Medium,由 LigaAI 翻译整理) 下面就和 LigaAI 一起了解 John Cutler「健康日查表」的具体问题以及对应的原始分计算规则(下文简写为规则)吧! # 今天,我们的团队…… Q1 - 判断题:至少有一人与客户进行了交流吗? 规则:「没有人与客户交流」计 0 分,「有交流」计 1 分;如果有跨职能成员参与交流,则再加 1 分。 不要把客户隔离在一线。...
相关文章
文章评论
共有0条评论来说两句吧...