WedX - журнал о программировании и компьютерных науках

Отправка сообщения из облака на устройство Azure IoT

В настоящее время у меня есть esp8266, отправляющий сообщения в Azure с использованием примера кода, найденного здесь. Приведенный ниже код — это моя попытка вызвать прямой метод на Arduino с использованием библиотек Java. Я создал объект с теми же атрибутами, что и модель, определенная в файле simplesample_mqtt.c. Затем я вызываю MethodResult.invoke(deviceId, methodName, responseTimeout, connectTimeout, device); и передаю объект устройства, deviceId и метод, который я хотел бы вызвать, но я получаю исключение тайм-аута.

BackEndApplication.java

package com.microsoft.docs.iothub.samples;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import com.microsoft.azure.sdk.iot.service.devicetwin.DeviceMethod;
import com.microsoft.azure.sdk.iot.service.devicetwin.MethodResult;
import com.microsoft.azure.sdk.iot.service.exceptions.IotHubException;

public class BackEndApplication {

    // Connection string for your IoT Hub
    // az iot hub show-connection-string --hub-name {your iot hub name}
    public static final String iotHubConnectionString = "HostName=Something.azure-devices.net;SharedAccessKeyName=Owner;SharedAccessKey=jdjdjdjdjdjdjdjdjdjd";

    // Device to call direct method on.
    public static final String deviceId = "DeviceIdUsedByArduino";

    // Name of direct method and payload.
    public static final String methodName = "TurnFanOn";

    public static final Long responseTimeout = TimeUnit.SECONDS.toSeconds(30);
    public static final Long connectTimeout = TimeUnit.SECONDS.toSeconds(5);

    public static void main(String[] args) {
        try {
            System.out.println("Calling direct method...");
            ContosoAnemometer device = new ContosoAnemometer();
            device.DeviceId = deviceId;
            device.WindSpeed = 1;
            device.Temperature = 1;
            device.Humidity = 1;

            // Create a DeviceMethod instance to call a direct method.
            DeviceMethod methodClient = DeviceMethod.createFromConnectionString(iotHubConnectionString);

            // Call the direct method.
            MethodResult result = methodClient.invoke(deviceId, methodName, responseTimeout, connectTimeout, device);

            if (result == null) {
                throw new IOException("Direct method invoke returns null");
            }

            // Show the acknowledgement from the device.
            System.out.println("Status: " + result.getStatus());
            System.out.println("Response: " + result.getPayload());
        } catch (IotHubException e) {
            System.out.println("IotHubException calling direct method:");
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println("IOException calling direct method:");
            System.out.println(e.getMessage());
        }
        System.out.println("Done!");
    }
}

iot_configs.h

#define IOT_CONFIG_CONNECTION_STRING    "HostName=Something.azure-devices.net;DeviceId=DeviceIdUsedByArduino;SharedAccessKey=somthing="

Ответ по Arduino

Connected to wifi
Fetching NTP epoch time failed! Waiting 2 seconds to retry.
Fetched NTP epoch time is: 1527899856
IoT Hub SDK for C, version 1.1.29
IoTHubClient accepted the message for delivery
Message Id: 0 Received.
Result Call Back Called! Result is: IOTHUB_CLIENT_CONFIRMATION_OK 

Вызвано исключение

Calling direct method...
IotHubException calling direct method:
IoT Hub not found! {"errorCode":404103,"trackingId":"09128374091283749028h-G:5-TimeStamp:06/02/2018 00:39:09","message":"Timed out waiting for device to subscribe.","timestampUtc":"2018-06-02T00:39:09.7655165Z"} 
Done!

Ответы:


1

См. этот пример о том, как запустить простой метод устройства c. В этом примере используется IoTHubClient_LL_SetDeviceMethodCallback, чтобы задать прямой метод для обратного вызова серверной части. Образец, который вы упомянули, просто для действия.

[Обновление]:

На самом деле существуют различия между WITH_METHOD и WITH_ACTION в сериализаторе Azure-iot-sdk-c. ACTION можно вызвать через сообщение «облако-устройство» из серверной части, тогда как METHOD необходимо обрабатывать в DeviceMethodCallback.

Прямые методы являются синхронными и либо выполняются успешно, либо завершаются ошибкой по истечении времени ожидания (по умолчанию: 30 секунд, можно установить до 3600 секунд). Устройство может вернуть тело сообщения в результате работы метода, но это не обязательно для метода. Нет никаких гарантий в отношении упорядочения или какой-либо семантики параллелизма при вызовах методов. Прямые методы следуют шаблону запрос-ответ и предназначены для связи, требующей немедленного подтверждения их результата.

Если вы хотите использовать МЕТОД вместо ДЕЙСТВИЯ, вам необходимо объявить функцию в модели с помощью макроса WITH_METHOD и реализовать обработку обратного вызова метода устройства с помощью IoTHubClient_LL_SetDeviceMethodCallback.

04.06.2018
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]