当前位置: 首页 > 知识库问答 >
问题:

Azure IoTHub设备消息,消息正文上的路由筛选器不工作

贡和裕
2023-03-14

我正在使用Azure Logic应用程序按照中所述的说明创建物联网远程监控和通知https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-monitoring-notifications-with-azure-logic-apps.

遥测模拟器(Java使用com.microsoft.azure.sdk.iot-

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();
    }
}

对于查询字符串-temperatureAlert=“true”-一切正常。但对于查询字符串-$body。温度

共有1个答案

牧梓
2023-03-14

为了让IoT Hub知道消息是否可以根据其正文内容进行路由,消息必须包含描述正文内容和编码的特定标头。特别是,邮件必须同时具有这两个标头,才能在邮件正文上进行路由:

  • 应用程序/json的内容类型
  • 内容编码必须匹配以下之一:
    • utf-8
    • utf-16
    • utf-32

    此处在创建消息对象的语法下方添加以下两行:

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

 类似资料:
  • 我正在使用ActiveMQ Artemis 2.17.0,并且面临路由问题。 我实现了一个插件,它记录了before消息路由,我看到一些消息从路由到。 没有转移设置,主题和队列由生产者和消费者动态创建。有一个将目标映射到虚拟主题的设置 和都是有效的主题,但它们不应该被链接。 什么能解释这种行为?

  • 只有监听设备消息后,在就收到消息数据才会返回消息内容,否则,不返回接收的消息内容。 请求方式: "|4|2|2|\r" 返回值: "|4|2|2|1|\r" 监听成功 Arduino样例: softSerial.print("|4|2|2|\r");

  • 在搜索文档之后,我找不到任何关于如何在没有使用外部服务器的情况下使用FCM向设备发送消息的信息。 例如,如果我正在创建一个聊天应用程序,我将需要向用户发送关于未读消息的推送通知,因为他们不会一直在线,而且我不可能在后台有一个始终连接到实时数据库的持久服务,因为这会占用太多资源。 那么当某个用户“B”向他/她发送聊天消息时,我将如何向用户“a”发送推送通知呢?我需要一个外部服务器来完成这个任务吗?还

  • 我正在考虑将Socket.io集成到一个express应用程序中。 js有一个非常好的特性,可以通过socket.io消息调用快速路由。 不过,帆在其他方面比我需要的要多一点。我正在寻找一种方法,使socket.io请求转发到快速路由,而不必使用整个sails框架。我想这是一个很常见的需求,所以我很惊讶我没有找到一个npm模块来做这件事,但是找了很长时间,我什么也没有找到。Express.io会这

  • 我正试图让Jersey支持GSON,为此我了解到我需要实现一个自定义的MessageBodyWriter和MessageBodyReader。 现在我的问题是我找不到这两个接口的任何明确定义。 从文档中: 支持将Java类型转换为流的提供程序的契约。要添加MessageBodyWriter实现,请使用@Provider注释实现类。MessageBodyWriter实现可以使用Produces注释以

  • 我过去使用过Kafka,但从未使用过streams API。我的任务是构建一个可扩展的服务,该服务接受websocket连接,并根据用户id将出站消息从中心主题路由到正确的会话。 使用KStream看起来非常简单 但是筛选器命令是否消耗了主题中的每一条消息并在应用程序空间中执行筛选器?或者KStream KStream上的措辞 如果过滤器的唯一目的是使用某个主题的每一条消息,并扔掉那些不相关的消息