c# - Azure IoT Hub:无法使用 AMQP 协议调用直接方法
问题描述
我一直在尝试使用 AMQP 协议进行直接方法调用。但不能让它工作。我相信如果我没记错的话,可以通过 AMQP 调用直接方法。但它适用于 MQTT。任何线索将不胜感激。
这是代码:
using Microsoft.Azure.Devices.Client;
using Microsoft.Azure.Devices.Shared;
using Newtonsoft.Json;
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace VirtualIoTDevice
{
internal class Program
{
private const string DeviceConnectionString = "device-connection-string";
private const string DEVICE_ID = "device01";
private static DeviceClient _device;
private static async Task Main(string[] args)
{
Console.WriteLine("Initializing virtual IoT device..");
using (_device = DeviceClient.CreateFromConnectionString(DeviceConnectionString, DEVICE_ID))
{
await _device.OpenAsync();
await _device.SetMethodHandlerAsync("showMessage", ShowMessage, null);
Console.ReadKey();
}
}
private static Task<MethodResponse> ShowMessage(MethodRequest methodRequest, object userContext)
{
Console.WriteLine("***Direct message received***");
Console.WriteLine(methodRequest.DataAsJson);
var responsePayload = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(new { response = "Message shown!" }));
return Task.FromResult(new MethodResponse(responsePayload, 200));
}
}
}
这是调用直接方法的命令:
az iot hub invoke-device-method -n "iothub-name" -d "device01" --method-name "showMessage"
解决方案
好的,我知道您的问题是什么:在最新版本的 SDK 中,在阻塞线程方面发生了一些变化。我不知道这是有意的改变还是回归。
但是,在您的情况下,Console.ReadKey()
首先以某种方式阻止 AMQP 连接。MQTT 不受此影响 - 这可能表明它可能是一种回归。
因此,如果您更改Console.ReadKey()
为例如await Task.Delay(-1)
它在我的测试中再次起作用。
推荐阅读
- android - 通过 NFC 发送 NdefRecord 但接收 android.nfc.tech.IsoDep
- flutter - 如何使用 Shortcuts/Intent/Actions 在 Flutter 中注册应用程序全局操作?
- oracle - 选择 DISTINCT 结果后的字符串连接
- javascript - JavaScript:动态更改数据范围规则的值
- azure-devops - 使用 azure dev ops 拉取请求代码覆盖率失败
- reactjs - 所以我使用 moment.js 来查找来自后端(UTC)的时间和来自 moment.js 的本地时间的时差
- bash - 是否可以在 Bash 脚本的 switch case 中结合两个条件?
- javascript - Javascript元素选择和修改
- reactjs - Firebase 云功能部署时出错
- amazon-web-services - AWS Quicksight - KPI 订单不匹配