Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Azure IoTHub设备消息,消息正文上的路由筛选器不工作_Java_Azure_Azure Logic Apps_Azure Iot Hub_Azure Iot Sdk - Fatal编程技术网

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

Java Azure IoTHub设备消息,消息正文上的路由筛选器不工作,java,azure,azure-logic-apps,azure-iot-hub,azure-iot-sdk,Java,Azure,Azure Logic Apps,Azure Iot Hub,Azure Iot Sdk,我正在使用Azure Logic应用程序按照中所述的说明创建物联网远程监控和通知 遥测模拟器(Java使用com.microsoft.azure.sdk.iot->iot设备客户端->1.14.0版本) 公共类模拟设备{ //用于通过IoT集线器验证设备的设备连接字符串。 //使用Azure CLI: //az iot集线器设备标识显示连接字符串--集线器名称{YourIoTHubName} //--设备id MyJavaDevice--输出表 私有静态字符串connString=“#连接字符串

我正在使用Azure Logic应用程序按照中所述的说明创建物联网远程监控和通知

遥测模拟器(Java使用com.microsoft.azure.sdk.iot->iot设备客户端->1.14.0版本)

公共类模拟设备{
//用于通过IoT集线器验证设备的设备连接字符串。
//使用Azure CLI:
//az iot集线器设备标识显示连接字符串--集线器名称{YourIoTHubName}
//--设备id MyJavaDevice--输出表
私有静态字符串connString=“#连接字符串”;
专用静态IoTubClientProtocol=IoTubClientProtocol.AMQPS;
专用静态设备客户端;
//指定要发送到IoT集线器的遥测。
专用静态类遥测数据点{
公众双温;
公众双湿;
公共字符串isTrue=“true”;
//将对象序列化为JSON格式。
公共字符串序列化(){
Gson Gson=新的Gson();
返回gson.toJson(this);
}
}
//打印从IoT集线器接收到的遥测消息确认
//发送。
私有静态类EventCallback实现IoTubEventCallback{
public void execute(IotHubStatusCode状态、对象上下文){
System.out.println(“IoT集线器以状态响应消息:“+status.name()”);
if(上下文!=null){
已同步(上下文){
context.notify();
}
}
}
}
私有静态类MessageSender实现Runnable{
公开募捐{
试一试{
//初始化模拟遥测。
双温=20;
双温湿度=60;
Random rand=新的Random();
int i=0;
而(i<100000){
//模拟遥测。
双电流温度=最小温度+随机数下一倍频()*15;
双电流湿度=最小湿度+rand.nextDouble()*20;
遥测数据点遥测数据点=新遥测数据点();
遥测数据点温度=当前温度;
遥测数据点湿度=当前湿度;
//将遥测作为JSON添加到消息正文中。
字符串msgStr=telemetryDataPoint.serialize();
byte[]bodyClone=msgStr.getBytes(StandardCharsets.UTF_8);
Message msg=新消息(bodyClone);
//向消息中添加自定义应用程序属性。
//IoT集线器可以在不访问消息正文的情况下过滤这些属性。
msg.setProperty(“TemperatureAllert”,(currentTemperature>30)?“true”:“false”);
msg.setMessageType(MessageType.DEVICE_遥测);
System.out.println(“发送消息字符串:+msgStr”);
System.out.println(“发送消息:+msg”);
Object lockobj=新对象();
//发送消息。
EventCallback callback=新的EventCallback();
sendEventAsync(消息、回调、lockobj);
已同步(lockobj){
lockobj.wait();
}
睡眠(1000);
}
}捕捉(中断异常e){
System.out.println(“完成”);
}
}
}
publicstaticvoidmain(字符串[]args)抛出IOException、URISyntaxException{
//连接到物联网集线器。
客户端=新设备客户端(连接字符串、协议);
client.open();
//创建新线程并开始发送消息
MessageSender=新建MessageSender();
ExecutorService executor=Executors.newFixedThreadPool(1);
执行人。执行人(发送方);
//停止应用程序。
System.out.println(“按回车键退出”);
System.in.read();
执行者。关机现在();
client.closeNow();
}
}

对于查询字符串-temperatureAlert=“true”-一切正常。但是对于查询字符串-$body.temperature>30-则我不会收到任何消息。

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

  • “应用程序/json”的内容类型
  • 内容编码必须与以下内容之一匹配:
    • “utf-8”
    • “utf-16”
    • “utf-32”
  • 此处在创建消息对象的语法下方添加以下两行:

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