I currently have an esp8266 sending messages to Azure using the example code found here. The code bellow is my attempt to call the direct method on the arduino using the java libraries. I created an object that has the same attributes as the model defined in the simplesample_mqtt.c
. Then I call MethodResult.invoke(deviceId, methodName, responseTimeout, connectTimeout, device);
and pass in the device object, the deviceId and the method I would like to invoke but I'm getting a time out exception.
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="
Response on 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
Exception Thrown
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!