当前位置:   article > 正文

JAVA spring-integration-mqtt配置接收字节流_java 如何解析mqtt返回的16进制数据?

java 如何解析mqtt返回的16进制数据?

引子:最近在做物联网这一块,需求是根据传感器推送过来的数据,动态实时展示到前端页面

由于没做过这一块,之前只搭建过mqtt服务器,经过一番波折之后,了解到传感器的数据传送原理是这样的:

首选传感器(目前用的是温湿度传感器测试)通电后,将收集到的数据推送到支持mqtt通讯的转换器上面,转换器链接自己的mqtt服务器,并且对默认订阅和推送主题进行写码之后,在自己的项目中链接上mqtt服务器,并且订阅该转换器默认推送主题,启动项目后,每隔一秒,转换器就会收到传感器推送的数据,然后通过主题推送到项目里面来

最坑的来了

由于转换器上默认mqtt是透传的,就是说收到什么内容就会推送什么内容,然后传感器是使用RS485输出,用的是MODBUS-RTU数据帧格式,也就是说项目中接收到的是字节流,但是spring-mqtt默认配置不支持接收字节流文件,所以导致控制台输出的数据一直是乱码.

下面是开启spring-mqtt支持接收字节流数据方式

1.引入maven

  1. <dependency>
  2. <groupId>org.springframework.integration</groupId>
  3. <artifactId>spring-integration-mqtt</artifactId>
  4. </dependency>

2.inbound函数中开启bytes转换器

  1. // 设置转换器,接收bytes
  2. DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter();
  3. converter.setPayloadAsBytes(true);
  4. adapter.setConverter(converter);

3.收到的消息转换为byte[ ]

  1. // 如果不设置转换器这里强转byte[]会报错
  2. byte[] payLoad = (byte[])message.getPayload();

4,拿到byte[]数组之后就好办啦,可以转换为16进制字符串

String s = HexUtils.bytes2HexString(bytes)

5.根据报文示例对16进制字符串进行解析 拿到想要的数据

最后贴上两段关键代码

开启强转

 

  1. @Bean
  2. public MessageProducer inbound() {
  3. MqttPahoMessageDrivenChannelAdapter adapter =
  4. new MqttPahoMessageDrivenChannelAdapter(host, clientId, mqttClientFactory());
  5. adapter.setCompletionTimeout(5000);
  6. // 设置转换器,接收bytes
  7. DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter();
  8. converter.setPayloadAsBytes(true);
  9. adapter.setConverter(converter);
  10. adapter.addTopic(topic, 2);
  11. adapter.setOutputChannel(mqttInputChannel());
  12. //恢复间隔–控制在故障之后适配器会尝试重新连接的时间间隔,默认为10000ms(10s)
  13. adapter.setRecoveryInterval(10000);
  14. logger.info("中央客户端clientId:{},正在连接,EMQ地址:{},使用端口号:{}", clientId, host, "1884");
  15. return adapter;
  16. }

处理数据

  1. @Bean
  2. //ServiceActivator注解表明当前方法用于处理MQTT消息,inputChannel参数指定了用于接收消息信息的channel。
  3. @ServiceActivator(inputChannel = "mqttInputChannel")
  4. public MessageHandler handler() {
  5. return message -> {
  6. String topic = message.getHeaders().get("mqtt_receivedTopic").toString();
  7. String qos = message.getHeaders().get("mqtt_receivedQos").toString();
  8. System.out.println("接收消息主题:" + topic);
  9. System.out.println("接收消息Qos:" + qos);
  10. //湿度
  11. Double hum = SensorCoverUtils.getHum(message.getPayload());
  12. //温度
  13. Double tem = SensorCoverUtils.getTem(message.getPayload());
  14. System.out.println("温度是" + tem);
  15. System.out.println("湿度是" + hum);
  16. };
  17. }

工具类

  1. /**
  2. * @param b 字节数组
  3. * @return 16进制字符串
  4. * @throws
  5. * @Title:bytes2HexString
  6. * @Description:字节数组转16进制字符串
  7. */
  8. public static String bytes2HexString(byte[] b) {
  9. StringBuffer result = new StringBuffer();
  10. for (int i = 0; i < b.length; i++) {
  11. result.append(String.format("%02X", b[i]));
  12. result.append(' ');
  13. }
  14. return result.toString().trim();
  15. }
  16. /**
  17. * @param src 16进制字符串
  18. * @return 字节数组
  19. * @throws
  20. * @Title:hexString2Bytes
  21. * @Description:16进制字符串转字节数组
  22. */
  23. public static byte[] hexString2Bytes(String src) {
  24. int l = src.length() / 2;
  25. byte[] ret = new byte[l];
  26. for (int i = 0; i < l; i++) {
  27. ret[i] = Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
  28. }
  29. return ret;
  30. }
  31. /**
  32. * 获取湿度
  33. */
  34. public static Double getHum(byte[]bytes) {
  35. String s = HexUtils.bytes2HexString(bytes);
  36. String substring1 = s.substring(9, 11);
  37. String substring2 = s.substring(12, 14);
  38. double humidity = (double) Integer.parseInt(substring1 + substring2, 16) / 10;
  39. return humidity;
  40. }
  41. /**
  42. * 获取温度
  43. */
  44. public static Double getTem(byte[]bytes) {
  45. String s = HexUtils.bytes2HexString(bytes);
  46. String substring3 = s.substring(15, 17);
  47. String substring4 = s.substring(18, 20);
  48. double Temp = (double) Integer.parseInt(substring3 + substring4, 16) / 10;
  49. return Temp;
  50. }

结束语

很感谢某起大佬的耐心指点,又是远程,又是找资料和解读,虽然过程中很想放弃,但还是坚持了下来,在成长的道路上又迈进了坚实的一步,结果总是美好的.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/200731
推荐阅读
相关标签
  

闽ICP备14008679号