- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
Azure IoT 中心支持 AMQP、MQTT、HTTP 协议(protocol)。为了自定义这些协议(protocol),我们有 Azure IoT 协议(protocol)网关。我可以找到关于 MQTT 协议(protocol)定制的好示例。我需要一些使用 Azure IoT 协议(protocol)网关进行基于 TCP 的协议(protocol)自定义的示例代码。
编辑(为了得到答案):OP所询问的是一个使用Azure协议(protocol)网关支持基于TCP的专有协议(protocol)的示例。目前 IoT 中心仅支持 AMQP、MQTT 和 HTTP。虽然这些协议(protocol)实际上依赖于 TCP,但如果没有额外的 AMQP、MQTT 或 HTTP 层,集线器不支持直接 TCP 连接。正如所解释的here ,我们需要一个基于自定义 TCP 协议(protocol)的基本示例。
想象一个基本设备,它只能在给定的 IP 地址/端口上通过 TCP 发送一些专有的有效负载:我们需要一个网关自定义示例,允许该设备将数据发送到集线器。
协议(protocol)网关当前代码设计不佳,严重依赖 MQTT。
还添加一些赏金。
最佳答案
由于所有 MQTT 代码,默认协议(protocol)网关示例确实有些令人困惑。协议(protocol)网关的工作原理是为连接到网关的每个自定义协议(protocol)设备“模拟”IoTHub 连接。
要执行从 TCP 设备到 IoTHub 设备的转换,您首先需要代表设备连接到 IoTHub。这是网关部分。以下是此 IoTHubConnection 的核心要素。
namespace GatewayTest
{
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using DotNetty.Buffers;
using Microsoft.Azure.Devices.ProtocolGateway.Identity;
using Microsoft.Azure.Devices.ProtocolGateway.IotHubClient;
using Microsoft.Azure.Devices.ProtocolGateway.Messaging;
public class IoTHubConnection : IMessagingChannel<IMessage>
{
private readonly string iotHubHostName;
private readonly Func<IDeviceIdentity, Task<IMessagingServiceClient>> deviceClientFactory;
private readonly Func<string, Task> onMessage;
private IMessagingServiceClient deviceClient;
private IDeviceIdentity deviceIdentity;
public IoTHubConnection(
string iotHubHostName,
Func<IDeviceIdentity, Task<IMessagingServiceClient>> deviceClientFactory,
Func<string, Task> onMessage)
{
this.iotHubHostName = iotHubHostName;
this.deviceClientFactory = deviceClientFactory;
this.onMessage = onMessage;
}
public event EventHandler CapabilitiesChanged;
public async Task OpenAsync(string deviceId, string deviceKey)
{
this.deviceIdentity = this.GetDeviceIdentity(deviceId, deviceKey);
if (this.deviceIdentity != UnauthenticatedDeviceIdentity.Instance)
{
this.deviceClient = await this.deviceClientFactory(this.deviceIdentity);
this.deviceClient.BindMessagingChannel(this);
}
}
public async Task CloseAsync()
{
await this.deviceClient.DisposeAsync(null);
this.deviceClient = null;
}
public void Handle(IMessage message)
{
var messageBody = message.Payload.ToString(Encoding.UTF8);
this.onMessage(messageBody);
this.deviceClient.CompleteAsync(message.Id);
}
public Task SendMessage(string message)
{
var buffer = Unpooled.WrappedBuffer(Encoding.UTF8.GetBytes(message));
var deviceMessage = this.deviceClient.CreateMessage($"devices/{this.deviceIdentity.Id}/messages/events", buffer);
return this.deviceClient.SendAsync(deviceMessage);
}
protected virtual void OnCapabilitiesChanged(EventArgs e)
{
this.CapabilitiesChanged?.Invoke(this, e);
}
private IDeviceIdentity GetDeviceIdentity(string userName, string deviceKey)
{
IotHubDeviceIdentity ideviceIdentity;
if (!IotHubDeviceIdentity.TryParse($"{this.iotHubHostName}/{userName}", out ideviceIdentity))
{
return UnauthenticatedDeviceIdentity.Instance;
}
ideviceIdentity.WithDeviceKey(deviceKey);
return ideviceIdentity;
}
}
}
deviceClientFactory 回调方法应按如下所示和 this line 中所示实现。在 Github 的 ProtocolGateway 存储库中。
deviceClientFactory = IotHubClient.PreparePoolFactory(
"IotHubConnectionString",
400,
TimeSpan.FromMinutes(3),
iotHubClientSettings,
PooledByteBufferAllocator.Default,
new ConfigurableMessageAddressConverter("TopicNameConversion"));
当 Tcp 设备连接到该协议(protocol)时,您应该创建此 IoTHubConnection 的实例,并将消息从设备发送到 IoTHubConnection,反之亦然。下面的代码显示了如何完成此操作的一个非常简单的版本。
private const int BufferSize = 1024;
private byte[] buffer = new byte[BufferSize];
private IoTHubConnection ioTHubConnection;
private NetworkStream stream;
private async Task Start()
{
listener = new TcpListener(IPAddress.Any, port);
listener.Start();
var client = await listener.AcceptTcpClientAsync();
ioTHubConnection = new IoTHubConnection("IoTHubName", deviceClientFactory, OnIoTHubMessage);
stream = client.GetStream();
// Read DeviceId and DeviceKey from some sort of StartConnection-message send by the TcpClient.
await ioTHubConnection.OpenAsync("DeviceId", "DeviceKey");
stream.BeginRead(buffer, 0, BufferSize, ReadTcpStreamCallback, null);
}
private void ReadTcpStreamCallback(IAsyncResult ar)
{
var bytesRead = stream.EndRead(ar);
if (bytesRead > 0)
{
var message = System.Text.Encoding.ASCII.GetString(result);
ioTHubConnection.SendMessage(message);
// Read again.
stream.BeginRead(buffer, 0, BufferSize, ReadTcpStreamCallback, null);
}
}
private async Task OnIoTHubMessage(string message)
{
// Potentially do some translation on the IoTHub message
// and send it to the Device
var byteData = Encoding.UTF8.GetBytes(message);
stream.BeginWrite(byteData, 0, byteData.Length, SendTcpCallback, null);
}
private void SendTcpCallback(IAsyncResult ar)
{
stream.EndWrite(ar);
}
关于c# - Azure IoT 中心中的 TCP 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42839683/
我有一个用例,我需要将文件从 Azure blob 位置下载到在 IoT 中心注册的 IoT 设备。 在本例中,我将向 IoT 设备发送指令(通过 IoT 中心),以将文件从 Azure blob 位
Azure 物联网套件和物联网中心之间的区别及其用法是什么?请告诉我 .NET 在物联网中如何工作的基础知识。感谢您的帮助! 最佳答案 Azure IoT Suite 只是 IoT Hub 的加速器。
我订阅 Aws Iot 主题; 12345678/state 我尝试编写一条规则来获取该主题的有效负载 12345678/shadow/update 我按照以下步骤编写了我的规则; 我的查询字符串是
使用与 Azure IoT Explorer 中输入的相同 DTDL 模型创建 Azure IoT 中心和数字孪生资源后,Explorer 表示设备未被识别为 IoT P&P 设备。 DTDL 模型使
我似乎无法在任何地方获取此信息。我想知道如果发送此消息的设备未在 IoT 中心注册,遥测消息会发生什么情况。 这是因为我发现来自 IoT 中心中未注册设备的一些消息正在被处理到内置事件中心,并在内置事
我们已经使用 AWS-IoT 服务创建了一个事物。我们已经针对该特定事物创建了一个主题。订阅者已订阅该主题,发布者正在向该主题发送消息。 以下是发布者消息传递顺序: message 0 message
首先,抱歉我的英语水平。 我是一名来自韩国的高中生,正在使用 Azure IoT 中心进行项目。 我正在开发一个项目,其中树莓派设备将值发送到 Azure IoT 中心。我想将此数据保存在 Azure
iotedge logs 暴露的日志在哪里?命令存储? 通常在 Linux 上会在哪里? 最佳答案 只需执行 docker inspect 及以下 LogPath您将获得容器的当前位置。例如。对于
我打算使用 IoT 中心利用其双向功能更新我的 Edison 设备的固件,尽管我不确定在哪里可以找到有关如何操作的详细说明。我在该主题上找到的唯一信息是 HERE但没有详细说明如何做到这一点,更多的是
我想知道 IoT Central 将存储我的遥测数据多长时间。感谢您提前的每一个回答! 最佳答案 定价页面注明数据保留期为 30 天。 https://azure.microsoft.com/en-a
我的目标是使用 serverless framework 在 AWS 上创建一个系统让多个 IoT 设备将 JSON 有效负载发送到 AWS IoT,然后将其保存到 DynamoDB。 除了创建 EC
正如主题行所示,我想知道 Azure IoT 中心作业和 Azure 自动设备管理之间到底有什么区别。 今年早些时候,我使用 IoT 中心作业为 IoT 中心中的所有设备设计了固件更新,在更多地了解
我想通过数据记录器将数据发送到 MS Azure 或 AWS IoT 平台。我该怎么做? 最佳答案 Azure IoT 中心公开设备端点: Device endpoints For each devi
我正在将图像从 Raspberry Pi 发送到 Cloud IoT Core。这是可行的,但我现在意识到,当将其存储在 Google Cloud Storage 中时,我还需要文件的文件名(或我添加
我想编写一个 C# 应用程序,它从 IoT Edge hub 中获取消息。在将它们发送到 IoT 中心之前,先在 IoT Edge 设备上执行此操作。 我想为我的 IoT 边缘模块编写端到端测试。为此
我不明白什么时候 Azure IoT 中心可以优于 Azure IoT Central。从迄今为止的读数来看,IoTcentral 在所有方面似乎都更好。任何人都可以向我解释一下 IoT hub 在哪
我想编写一个 C# 应用程序,它从 IoT Edge hub 中获取消息。在将它们发送到 IoT 中心之前,先在 IoT Edge 设备上执行此操作。 我想为我的 IoT 边缘模块编写端到端测试。为此
我不明白什么时候 Azure IoT 中心可以优于 Azure IoT Central。从迄今为止的读数来看,IoTcentral 在所有方面似乎都更好。任何人都可以向我解释一下 IoT hub 在哪
我正在 .NET Core 3 中开发 Web 应用程序,我正在使用 Microsoft.Azure.Devices.RegistryManager 访问 Azure Iot 中心。 当我调用 reg
我们将 IoT Edge 与 DPS 结合使用,我们需要在配置时提供额外信息,以便在正确的 IoT 中心配置设备并提供特定的孪生信息。我们注意到 DPS 提供了一个 solution for this
我是一名优秀的程序员,十分优秀!