MQTT主题匹配(Topics Matching)

通配符

在MQTT Version 5.0的4.7节中,提到了关于主题名称和主题过滤器的内容。主题通配符可以用在主题过滤器中,从而实现订阅多个主题,但不得在主题名称中使用通配符。MQTT中的通配符目前只有两个:‘#’和‘+’。

  • 层级分隔符(‘/’)
    MQTT中使用正斜杠(‘/’)作为每一级主题的分隔符,从而为主题名称提供层级结构。连续的正斜杠(“//”)表示长度为0的主题。

多级通配符(‘#’)

可以匹配包括父级和下属的多个子层级。字符可以单独存在,也可以作为匹配子主题存在,但无论哪种情况,‘#’必须为过滤器的最后一个字符。

  • 当‘#’单独存在时,将匹配所有的主题

    • “#”(匹配所有的主题,后文会提到,’$'开头的除外
  • 在匹配子主题时,例如订阅“sport/tennis/player1/#”,下列主题的信息都将收到:

    • “sport/tennis/player1”(该话题本身,因为包含父级)
    • “sport/tennis/player1/ranking”(该话题的下属层级)
    • “sport/tennis/player1/score/yesterday”(所有间接下属层级)
  • 在匹配子主题时,‘#’前面的字符必须是‘/’,下列书写方式将不被通过

    • “sport/tennis/#/player”(不是最后一个字符)
    • “sport/tennis/player#”(是最后一个字符,但前一位不是‘/’)

单级通配符(‘+’)

  • 单级匹配符只能匹配所在层级,且在使用时,必须占满整个层级。比如下列书写方式是被允许的:
    • “sport/+/player1”
    • “sport/+/#”(可以和其他通配符搭配使用)
    • “+/tennis”(匹配任意顶级主题)
    • “sport/tennis/+”(匹配tennis下一级的主题)
  • 在匹配主题时,例如订阅“sport/tennis/+”,下列主题的新信息都将被收到:
    • “sport/tennis/player1”
    • “sport/tennis/player2”
    • “sport/tennis/player3”
    • “sport/tennis/”(空主题,可以被匹配)

    但下列的话题将无法被订阅:
    • “sport/tennis”(父级主题不在当前层级,无法被匹配)
    • “sport/tennis/player1/score”(间接子主题不在当前层级,无法被匹配)
  • 下列书写方式是不被允许的:
    • “sport+/”(没有占满整个层级)

特殊符号:系统保留主题(‘$’)

在‘#’或‘/’进行匹配时,以‘$’开头的主题将不会被匹配到。 换言之,服务器将禁止客户端使用此类话题与其他客户端通信,以‘$’开头的话题作为系统保留主题,供内部使用,这些主题的消息不会被客户端所发布或订阅。在MQTT中,“$SYS/”被广泛用作包含特定于服务器的信息或控件API的主题的前缀。在下列例子中,展示了‘$’和两种通配符共存时的一些情况:

  • “#”(匹配不到以‘$’开头的主题)
  • “ + / monitor / Clients”将匹配不到“ $ SYS / monitor / Clients”
  • “ $ SYS / monitor / +”可以匹配到“ $ SYS / monitor / Clients”
以下是一个使用 Java 后台连接 MQTT 服务器并订阅主题的示例代码: ```java import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class MqttSubscriber { public static void main(String[] args) { String broker = "tcp://localhost:1883"; // MQTT 服务器地址 String clientId = "JavaMqttSubscriber"; // 客户端 ID,可以任意指定 String topic = "my/topic"; // 订阅的主题 // 创建 MQTT 客户端实例 try { MqttClient mqttClient = new MqttClient(broker, clientId, new MemoryPersistence()); // 设置回调函数,处理接收到的消息 mqttClient.setCallback(new MqttCallback() { public void connectionLost(Throwable throwable) { // 连接丢失时的处理逻辑 } public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { // 接收到消息时的处理逻辑 String messageContent = new String(mqttMessage.getPayload()); System.out.println("Received message: " + messageContent); } public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { // 消息发送完成时的处理逻辑 } }); // 连接到 MQTT 服务器 mqttClient.connect(); // 订阅主题 mqttClient.subscribe(topic); } catch (MqttException e) { e.printStackTrace(); } } } ``` 在这个示例代码中,我们使用了 Eclipse Paho MQTT 客户端库来连接 MQTT 服务器并订阅主题。你需要将 `broker` 变量设置为 MQTT 服务器的地址,将 `clientId` 变量设置为客户端 ID,将 `topic` 变量设置为订阅的主题。然后通过调用 `MqttClient` 类的 `connect()` 方法来连接到 MQTT 服务器,再调用 `subscribe()` 方法来订阅主题。在 `MqttCallback` 回调函数中,我们处理接收到的消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值