DeviceMessage Azure IoTHub, фильтр маршрута для тела сообщения не работает - PullRequest
0 голосов
/ 06 сентября 2018

Я создаю удаленный мониторинг и уведомления IoT с помощью приложений логики Azure в соответствии с инструкциями, изложенными в https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-monitoring-notifications-with-azure-logic-apps.

Телеметрический симулятор (Java использует com.microsoft.azure.sdk.iot -> iot-device-client -> версия 1.14.0)

public class SimulatedDevice {
    // The device connection string to authenticate the device with your IoT hub.
    // Using the Azure CLI:
    // az iot hub device-identity show-connection-string --hub-name {YourIoTHubName}
    // --device-id MyJavaDevice --output table
    private static String connString = "#ConnectionString";

    private static IotHubClientProtocol protocol = IotHubClientProtocol.AMQPS;
    private static DeviceClient client;

    // Specify the telemetry to send to your IoT hub.
    private static class TelemetryDataPoint {
        public double temperature;
        public double humidity;
        public String isTrue = "true";

        // Serialize object to JSON format.
        public String serialize() {
            Gson gson = new Gson();
            return gson.toJson(this);
        }
    }

    // Print the acknowledgement received from IoT Hub for the telemetry message
    // sent.
    private static class EventCallback implements IotHubEventCallback {
        public void execute(IotHubStatusCode status, Object context) {
            System.out.println("IoT Hub responded to message with status: " + status.name());

            if (context != null) {
                synchronized (context) {
                    context.notify();
                }
            }
        }
    }

    private static class MessageSender implements Runnable {
        public void run() {
            try {
                // Initialize the simulated telemetry.
                double minTemperature = 20;
                double minHumidity = 60;
                Random rand = new Random();
                int i = 0;

                while (i < 100000) {
                    // Simulate telemetry.
                    double currentTemperature = minTemperature + rand.nextDouble() * 15;
                    double currentHumidity = minHumidity + rand.nextDouble() * 20;
                    TelemetryDataPoint telemetryDataPoint = new TelemetryDataPoint();
                    telemetryDataPoint.temperature = currentTemperature;
                    telemetryDataPoint.humidity = currentHumidity;

                    // Add the telemetry to the message body as JSON.
                    String msgStr = telemetryDataPoint.serialize();

                    byte[] bodyClone = msgStr.getBytes(StandardCharsets.UTF_8);
                    Message msg = new Message(bodyClone);

                    // Add a custom application property to the message.
                    // An IoT hub can filter on these properties without access to the message body.
                    msg.setProperty("temperatureAlert", (currentTemperature > 30) ? "true" : "false");
                    msg.setMessageType(MessageType.DEVICE_TELEMETRY);

                    System.out.println("Sending message string: " + msgStr);
                    System.out.println("Sending message: " + msg);

                    Object lockobj = new Object();

                    // Send the message.
                    EventCallback callback = new EventCallback();
                    client.sendEventAsync(msg, callback, lockobj);

                    synchronized (lockobj) {
                        lockobj.wait();
                    }
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                System.out.println("Finished.");
            }
        }
    }

    public static void main(String[] args) throws IOException, URISyntaxException {

        // Connect to the IoT hub.
        client = new DeviceClient(connString, protocol);
        client.open();

        // Create new thread and start sending messages
        MessageSender sender = new MessageSender();
        ExecutorService executor = Executors.newFixedThreadPool(1);
        executor.execute(sender);

        // Stop the application.
        System.out.println("Press ENTER to exit.");
        System.in.read();
        executor.shutdownNow();
        client.closeNow();
    }
}

Для QueryString - temperatureAlert = "true" - все работает нормально. Но для строки запроса - $ body.tempera> 30 - я не получаю никаких сообщений.

1 Ответ

0 голосов
/ 06 сентября 2018

Чтобы IoT Hub знал, можно ли маршрутизировать сообщение на основе содержимого его тела, сообщение должно содержать специальные заголовки, которые описывают содержимое и кодировку его тела.В частности, сообщения должны иметь оба этих заголовка, чтобы маршрутизация на теле сообщения работала:

  1. Тип содержимого «application / json»
  2. Кодировка содержимого должна соответствовать одному из:
    • "utf-8"
    • "utf-16"
    • "utf-32"

Здесь добавьте ниже две строкичуть ниже синтаксиса для создания объекта сообщения:

msg.setContentEncoding("utf-8");
msg.setContentType("application/json");
...