Azure IoT Hub: невозможно вызвать прямой метод с использованием протокола AMQP - PullRequest
0 голосов
/ 19 февраля 2019

Я пытался сделать прямой вызов метода, используя протокол 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"

1 Ответ

0 голосов
/ 19 февраля 2019

Хорошо, я знаю, в чем ваша проблема: в последней версии SDK произошли некоторые изменения в отношении блокировки потоков.Я не знаю, было ли это намеченным изменением или регрессом.

Однако, в вашем случае Console.ReadKey() каким-то образом блокирует AMQP от подключения в первую очередь.Это не влияет на MQTT - это может указывать на то, что это может быть регрессия.

Так что, если вы измените Console.ReadKey() на, например, await Task.Delay(-1), это снова работает в моем тесте.

...