赞
踩
首选传感器(目前用的是温湿度传感器测试)通电后,将收集到的数据推送到支持mqtt通讯的转换器上面,转换器链接自己的mqtt服务器,并且对默认订阅和推送主题进行写码之后,在自己的项目中链接上mqtt服务器,并且订阅该转换器默认推送主题,启动项目后,每隔一秒,转换器就会收到传感器推送的数据,然后通过主题推送到项目里面来
由于转换器上默认mqtt是透传的,就是说收到什么内容就会推送什么内容,然后传感器是使用RS485输出,用的是MODBUS-RTU数据帧格式,也就是说项目中接收到的是字节流,但是spring-mqtt默认配置不支持接收字节流文件,所以导致控制台输出的数据一直是乱码.
- <dependency>
- <groupId>org.springframework.integration</groupId>
- <artifactId>spring-integration-mqtt</artifactId>
- </dependency>
- // 设置转换器,接收bytes
- DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter();
- converter.setPayloadAsBytes(true);
- adapter.setConverter(converter);
- // 如果不设置转换器这里强转byte[]会报错
- byte[] payLoad = (byte[])message.getPayload();
String s = HexUtils.bytes2HexString(bytes)
- @Bean
- public MessageProducer inbound() {
-
- MqttPahoMessageDrivenChannelAdapter adapter =
- new MqttPahoMessageDrivenChannelAdapter(host, clientId, mqttClientFactory());
- adapter.setCompletionTimeout(5000);
-
- // 设置转换器,接收bytes
- DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter();
- converter.setPayloadAsBytes(true);
-
- adapter.setConverter(converter);
-
- adapter.addTopic(topic, 2);
- adapter.setOutputChannel(mqttInputChannel());
- //恢复间隔–控制在故障之后适配器会尝试重新连接的时间间隔,默认为10000ms(10s)
- adapter.setRecoveryInterval(10000);
- logger.info("中央客户端clientId:{},正在连接,EMQ地址:{},使用端口号:{}", clientId, host, "1884");
- return adapter;
- }
- @Bean
- //ServiceActivator注解表明当前方法用于处理MQTT消息,inputChannel参数指定了用于接收消息信息的channel。
- @ServiceActivator(inputChannel = "mqttInputChannel")
- public MessageHandler handler() {
- return message -> {
-
- String topic = message.getHeaders().get("mqtt_receivedTopic").toString();
- String qos = message.getHeaders().get("mqtt_receivedQos").toString();
- System.out.println("接收消息主题:" + topic);
- System.out.println("接收消息Qos:" + qos);
- //湿度
- Double hum = SensorCoverUtils.getHum(message.getPayload());
- //温度
- Double tem = SensorCoverUtils.getTem(message.getPayload());
-
- System.out.println("温度是" + tem);
- System.out.println("湿度是" + hum);
-
- };
- }
- /**
- * @param b 字节数组
- * @return 16进制字符串
- * @throws
- * @Title:bytes2HexString
- * @Description:字节数组转16进制字符串
- */
- public static String bytes2HexString(byte[] b) {
- StringBuffer result = new StringBuffer();
- for (int i = 0; i < b.length; i++) {
- result.append(String.format("%02X", b[i]));
- result.append(' ');
- }
- return result.toString().trim();
- }
-
-
-
- /**
- * @param src 16进制字符串
- * @return 字节数组
- * @throws
- * @Title:hexString2Bytes
- * @Description:16进制字符串转字节数组
- */
- public static byte[] hexString2Bytes(String src) {
- int l = src.length() / 2;
- byte[] ret = new byte[l];
- for (int i = 0; i < l; i++) {
- ret[i] = Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
- }
- return ret;
- }
-
-
-
- /**
- * 获取湿度
- */
- public static Double getHum(byte[]bytes) {
- String s = HexUtils.bytes2HexString(bytes);
- String substring1 = s.substring(9, 11);
- String substring2 = s.substring(12, 14);
- double humidity = (double) Integer.parseInt(substring1 + substring2, 16) / 10;
- return humidity;
- }
-
- /**
- * 获取温度
- */
- public static Double getTem(byte[]bytes) {
- String s = HexUtils.bytes2HexString(bytes);
- String substring3 = s.substring(15, 17);
- String substring4 = s.substring(18, 20);
- double Temp = (double) Integer.parseInt(substring3 + substring4, 16) / 10;
- return Temp;
- }
很感谢某起大佬的耐心指点,又是远程,又是找资料和解读,虽然过程中很想放弃,但还是坚持了下来,在成长的道路上又迈进了坚实的一步,结果总是美好的.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。