【问题标题】:Best way to do Request-Response to an Edge/near-device program对边缘/近设备程序进行请求-响应的最佳方式
【发布时间】:2023-02-24 20:10:45
【问题描述】:

我有一个处理多个租户的云服务器。我们有一个集成引擎来处理设备命令。有时,这些命令需要向物理设备发送信号或从串行/USB 端口读取。

这些设备命令视具体情况而定,我们拥有广泛的边缘程序,这些程序在这些集成中具有不同的技术堆栈,尤其是遗留技术。我现在的问题是,从云应用程序向其中一个集成程序发送命令(请求-响应)的最佳方式是什么。我的想法是这样的:

Cloud Server <-> Communication Service <-> Integration Program

我的云服务器是一个 ASP.NET Core 项目,所以我最初的想法是,更具体一些

ASP.NET Controller SignalR Hub <-> SignalR Windows Service to manage connections/calls <-> IPC <-> Integration Program

换句话说,为边缘程序构建请求-响应基础设施的最佳方式是什么,云服务器实际上可以向边缘程序发送命令,反之亦然。假设边缘程序在 NAT 后面等等,我认为通信服务需要建立连接(套接字、SignalR、MQTT?)然后云服务器链接(通过 GUID)并使用相同的连接将命令发送到集成程序。为了在不同的边缘程序之间共享通信堆栈,将使用中间的通信服务和 IPC 将数据传输到边缘程序。

典型的示例场景如下:云应用程序 UI 中有一个按钮“开门”,它是 IEdgeProgramCapabilities 中的一个方法,它向云服务器的 ASP.NET 控制器发送 HTTP POST 请求,后者找到正确的 SignalR 客户端并将“开门”请求发送到正确的通信服务(它应该持续连接,否则它不会工作),通信服务接收“开门”命令并将其传递给一个旧的.NET 4.5 程序,该程序用USB 连接到门控制器,得到响应 OK 并将其一路发送回云服务器。

运行通信服务和边缘程序的典型硬件是普通台式电脑、嵌入式设备和低端设备,因此通常不是服务器基础设施。

我注意到在 .NET 7 中,SignalR 可以执行请求-响应 (Signalr - It's possible to wait reponse from client?)。但真的很想知道是否有更好的方法来做到这一点。特别是关于 IEdgeProgramCapabilities。

【问题讨论】:

  • 我建议您看看 Azure IoT Hub,听起来它可能很适合您。

标签: c# asp.net .net asp.net-core signalr


【解决方案1】:

如果您使用 Azure 云,application insights 允许您创建一个中间件组件,基本上可以从您的请求/响应对象中跟踪您想要的任何内容。

https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core?tabs=netcorenew%2Cnetcore6

这适用于您应该已经在 C# 中使用的 ILogger 接口。

在您的中间件中,您可以制作一个远程处理程序,它将根据 http 请求中存在的任何内容获取请求,并记录您想要的任何内容,等待响应,然后将其与您想要的任何内容一起存储。

关键词是:ILogger、遥测和中间件。

我确信其他云提供商也有类似的系统,我只是不熟悉那些。

如果您希望设备日志中的特定数据存在,您可以将其作为响应处理的一部分存储到遥测部分的“CustomDimensions”字段中,基本上,无论您想要什么。

或者您可以将其直接追踪到应用程序洞察日志记录中。

如果您使用 ILogger 来跟踪您的消息,如果您不想使用应用程序洞察力,您还可以实施一个新的 ILogger。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多