Java Azure IoTHub设备消息,消息正文上的路由筛选器不工作
我正在使用Azure Logic应用程序按照中所述的说明创建物联网远程监控和通知 遥测模拟器(Java使用com.microsoft.azure.sdk.iot->iot设备客户端->1.14.0版本)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=“#连接字符串
公共类模拟设备{
//用于通过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知道消息是否可以根据其正文内容进行路由,消息必须包含描述正文内容和编码的特定标题。特别是,邮件必须同时具有这两个标头,才能在邮件正文上进行路由:
- “utf-8”
- “utf-16”
- “utf-32”
msg.setContentEncoding("utf-8");
msg.setContentType("application/json");
msg.setContentEncoding("utf-8");
msg.setContentType("application/json");