目录
-
前言 -
架构图 -
一、设备接入 -
二、处理设备遥测数据 -
三、设备控制 -
四、管理后台 -
五、数据存储 -
六、规则引擎
-
-
环境准备 -
1、安装EMQX -
2、创建解决方案 -
3、安装Dapr开发环境 -
4、使用MASA DaprStarter搭建开发环境
-
前言
架构图

一、设备接入
2、针对不能联网的设备,例如只能通过红外、短信、等其他非互联网技术通讯的,采用设备网关统一接管,这里主要涉及硬件相关内容我们不深入讨论。橙色线框部分
二、处理设备遥测数据
三、设备控制
四、管理后台
五、数据存储
六、规则引擎
环境准备
1、安装EMQX
2、创建解决方案
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”,即 “分布式应用运行时”。是一个开源项目,由微软发起
使用MASA DaprStarter搭建开发环境
安装Dapr
https://docs.dapr.io/getting-started/install-dapr-cli/
https://github.com/dapr/cli/releases

安装Docker Desktop
https://docs.docker.com/desktop/install/windows-install/
初始化Dapr

执行dapr init 有了bin目录后看准时机把下载好的两个压缩包复制进去
例如:C:\Users\Administrator\.dapr 下的bin目录中,该目录下的压缩包会自动解压
如果失败可以通过 Dapr uninstall 命令卸载后重试。
安装成功后通过 Dapr -v 可以看到如下版本信息


代码开发
新建WebApi项目PubDemo和SubDemo,并分别安装Dapr.Client和Masa.Contrib.Development.DaprStarter.AspNetCore后者方便我们在开发环境管理dapr的生命周期。
我们在SubDemo项目中额外安装Dapr.AspNetCore。
在PubDemo的Program.cs添加
{
builder.Services.AddDaprStarter(builder.Configuration.GetSection("DaprOptions"), false);
}
"AppId": "pub-demo-webapi",
"AppPort": 18009,
"AppIdSuffix": "",
"DaprGrpcPort": 20333,
"DaprHttpPort": 20334,
"LogLevel": "debug"
}
"AppId": "sub-demo-webapi",
"AppPort": 19009,
"AppIdSuffix": "",
"DaprGrpcPort": 20233,
"DaprHttpPort": 20234,
"LogLevel": "debug"
}
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:19009",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
//注册 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();
此终结点将响应 /dapr/subscribe 上的请求。调用此终结点时,它将自动查找使用 Topic 属性修饰的所有 WebAPI 操作方法,并指示 Dapr 为这些方法创建订阅。
我们在SubDemo新建一个WebApi接口来订阅Pub数据
{
[Route("api/[controller]")]
[ApiController]
public class SubTestController : ControllerBase
{
[Topic("pubsub", "testdata")]
[HttpPost("testdata")]
public void TestData([FromBody] string testStrData)
{
Console.WriteLine("Subscriber received : " + testStrData);
}
}
}
kind: Component
metadata:
name: pubsub
spec:
type: pubsub.redis
version: v1
metadata:
- name: redisHost
value: localhost:6379
- name: redisPassword
value: ""
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);
}
}
}
测试效果
应用完全启动后,在命令行通过dapr list可以看到DaprStarter已经帮我们启动好了两个Dapr实例。




我们打开zipkin还可以看到链路信息。这里仅作演示,后面我们会接入强大的MASA Stack全家桶,使用其中的TSC服务分析链路,信息会更方便和直观。


