Двунаправленная связь через IoTHub / Xamarin App / ESP8266

Работаем над новым продуктом, который будет использовать ESP8266, приложение Xamarin и Azure IoTHub, чтобы обеспечить двунаправленную связь для устройств клиентов.

У нас есть связь C2D (Cloud 2 Device) и D2C (Device 2 Cloud), работающая правильно как в приложении, так и в ESP, но мы не находим никакой информации о настройке IoTHub для интерпретации входящих сообщений телеметрии, обработки их соответствующих " Кому: "и поместите их обратно в тему C2D, которая должна позволить нашему целевому устройству получить их.

Что мы пробовали:

  1. Логические приложения. Мы могли запускать входящие сообщения в очередь, но не знали, какой HTTP-запрос сделать, чтобы переадресовать его обратно в концентратор событий C2D.
  2. Нам удалось перенаправить каждое сообщение в очередь, но библиотека PCL для Xamarin не может подключаться к очередям служебной шины Azure (облом).

Я нашел ссылку на стажера в Microsoft, разрабатывающего прямую связь устройства с устройством для устройства открывания гаражных ворот, но библиотека, которую она использует, доступна только для приложений UWP, что не так удобно, когда мы действительно хотим ориентироваться на iOS, Android и UWP (причина выбора Xamarin в первую очередь).

https://blogs.windows.com/buildingapps/2016/09/08/device-to-device-communication-with-azure-iot-hub/#ykPJrVE734GpSEzV.97

Кто-нибудь мог запускать условные события C2D с помощью портала Azure?


person C Johnson    schedule 04.01.2017    source источник
comment
Вы пробовали лазурные функции? Вы можете подписаться на триггер конечной точки с включенным концентратором событий и иметь соответствующую логику для фильтрации и перенаправления сообщений или использовать API концентратора iot для связи с устройством.   -  person George Trifonov    schedule 10.01.2017
comment
Я отправлю ответ, который работает для моего решения.   -  person C Johnson    schedule 21.01.2017


Ответы (1)


В ходе бесед с командой Microsoft Azure мы определили, что веб-задание в сочетании с маршрутом к очереди было для нас лучшим решением.

Все сообщения направляются в очередь, и по мере их поступления в очередь веб-задание обрабатывает сообщение и отправляет сообщение, используя объект ServiceBus Messaging, чтобы отправить ответное сообщение из облака на устройство.

Вот код для всех, кто хочет его использовать.

Пока исходный отправитель сообщения указывает свойство «Кому» в сообщении через посредника, оно будет доставлено на это устройство в реестре. Для использования вам потребуются пакеты NuGet для служебной шины и Azure.Messaging. Этот код скопирует все сообщение и отправит его на желаемое устройство реестра.

private const string queueName = "<queue_name>";
    private const string IoTHubConnectionString = "HostName=<your_host>;SharedAccessKeyName=<your_service_user>;SharedAccessKey=<your sas>";
    // This function will get triggered/executed when a new message is written 
    // on an Azure Queue called <queue_name>.
    public static void ReceiveQueueMessages(
        [ServiceBusTrigger(queueName)] BrokeredMessage message,
        TextWriter log)
    {
        if (message.To == null)
        {
            //message = null
            return;
        }
        else
        {
            //Retrieve the message body regardless of the content as a stream
            Stream stream = message.GetBody<Stream>();
            StreamReader reader;

            if (stream != null)
                reader = new StreamReader(stream);
            else
                reader = null;

            string s;
            Message serviceMessage;

            if ( reader != null )
            {
                s = reader.ReadToEnd();
                serviceMessage = new Microsoft.Azure.Devices.Message(Encoding.ASCII.GetBytes(s));
            }
            else
            {
                serviceMessage = new Microsoft.Azure.Devices.Message();
            }

            foreach (KeyValuePair<string, object> property in message.Properties)
            {
                serviceMessage.Properties.Add(property.Key, property.Value.ToString());
            }
            SendToIoTHub(message.To.ToString(), serviceMessage);
        }
    }

    static async void SendToIoTHub(string target, Microsoft.Azure.Devices.Message message)
    {
        // Write it back out to the target device

        ServiceClient serviceClient = ServiceClient.CreateFromConnectionString(IoTHubConnectionString);

        var serviceMessage = message;
        serviceMessage.Ack = DeliveryAcknowledgement.Full;
        serviceMessage.MessageId = Guid.NewGuid().ToString();

        try
        {
            await serviceClient.SendAsync(target, serviceMessage);
        }
        catch
        {
            await serviceClient.CloseAsync();
            return;
        }

        await serviceClient.CloseAsync();
    }
person C Johnson    schedule 20.01.2017