| | |
| | | |
| | | import java.net.InetAddress; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.Arrays; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.TimeUnit; |
| | |
| | | |
| | | private void subscribe() { |
| | | MesCollectProperties.Mqtt mqtt = properties.getMqtt(); |
| | | String topic = normalizeTopicPrefix(mqtt.getTopicPrefix()) + "+/+"; |
| | | try { |
| | | client.subscribe(topic, mqtt.getQos()); |
| | | log.info("[subscribe][数采 MQTT 订阅成功:{}]", topic); |
| | | } catch (Exception e) { |
| | | log.error("[subscribe][数采 MQTT 订阅失败:{}]", topic, e); |
| | | for (String topic : resolveSubscribeTopics(mqtt)) { |
| | | try { |
| | | client.subscribe(topic, mqtt.getQos()); |
| | | log.info("[subscribe][数采 MQTT 订阅成功:{}]", topic); |
| | | } catch (Exception e) { |
| | | log.error("[subscribe][数采 MQTT 订阅失败:{}]", topic, e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 解析需要订阅的主题。 |
| | | * |
| | | * <p>显式配置 topics 优先;网关格式订阅整个前缀(gateway/#), |
| | | * 因为网关除 attributes 外还会发 connect / disconnect,后续也可能新增主题; |
| | | * 其余格式沿用 /YLCY/IMM/+/+ 两级通配。</p> |
| | | */ |
| | | private List<String> resolveSubscribeTopics(MesCollectProperties.Mqtt mqtt) { |
| | | if (StrUtil.isNotBlank(mqtt.getTopics())) { |
| | | return Arrays.stream(mqtt.getTopics().split(",")) |
| | | .map(String::trim) |
| | | .filter(StrUtil::isNotBlank) |
| | | .toList(); |
| | | } |
| | | String prefix = normalizeTopicPrefix(mqtt.getTopicPrefix()); |
| | | return Collections.singletonList(mqtt.isGatewayFormat() ? prefix + "#" : prefix + "+/+"); |
| | | } |
| | | |
| | | private String normalizeTopicPrefix(String prefix) { |
| | | if (StrUtil.isBlank(prefix)) { |
| | | return ""; |