MQTT主题进阶

通过以前的学习,我们了解到主题是MQTT的核心概念之一。在本节课里,我们来一起进一步了解MQTT主题这一概念。我们将从以下几个方面来学习MQTT主题的高级知识:

  1. 主题基本形式

  2. 主题分级

  3. 主题通配符

  4. 主题应用注意事项

  5. 主题基本形式
    主题的最基本形式就是一个字符串。以下是几个主题示例:

myTopic

motorSpeed

MotorSpeed

current time

虽然主题看起来很简单,但是我们在使用主题时需要注意以下几点:

主题是区分大小写的。如上列表中的主题 motor_speed和Motor_speed是两个完全不同的主题。

主题可以使用空格 如以上列表中的current time,虽然有空格分隔current和time这两个词,但这实际是一个MQTT主题。不过,虽然我们可以使用空格,但是笔者强烈建议您不要在主题中使用空格。我们在开发时一不小心,可能就会漏掉空格,这将造成不必要的麻烦。

大部分MQTT服务端是不支持中文主题的,所以我们应使用英文字符或ASCII字符来作为MQTT主题。

  1. 主题分级
    MQTT主题可以是一个简单的字符串,比如motor_speed,myTopic。这些都是单一级别的主题。

为了更好的对主题进行管理和分类,我们可以对主题进行分级处理。MQTT主题各个级别之间可以使用”/”来分隔。如下例所示:

Tyler-1/motor/1/speed

在以上示例中一共有四级主题,分别是第1级 Tyler-1、第2级motor、第三级1、第4级speed。主题的每一级至少需要一个字符,比如以上示例中,数字1既是一级主题。

我们再来看几个分级主题的示例:

home/sensor/kitchen/temperature
home/sensor/kitchen/brightness
home/sensor/bedroom/temperature
home/sensor/bedroom/brightness

3 主题通配符
当客户端订阅主题时,可以使用通配符同时订阅多个主题。通配符只能在订阅主题时使用,下面我们将介绍两种通配符:单级通配符和多级通配符。

单级通配符: +

顾名思义,单级通配符可以代替一个主题级别。 以下为含有单极通配符的主题示例。

home/sensor/+/temperature

当客户端订阅了以上主题后,它将会收到以下主题的信息内容:

home/sensor/kitchen/temperature
home/sensor/bedroom/temperature

我们可以看到,在home后面的级别中,由于客户端订阅的主题使用了+ 单级通配符,因此无论home级别后面的内容是什么,客户端都能收到这些主题的信息。

相反,客户端将无法收到以下主题的信息。

home/sensor/bedroom/brightness
office/sensor/bedroom//temperature
home/screen/livingroom/temperature

以上主题的红色部分都是客户端无法收到信息的原因。这些红色的部分都是与客户端订阅的主题“home/sensor/+/temperature”不相符的部分。

多级通配符 #

单级通配符仅可代替一个主题级别,而多级通配符”#”可以涵盖任意数量的主题级别。如下示例所示, 多级通配符必须是主题中的最后一个字符。

home/sensor/#

当客户端订阅了以上含有”#”的主题后,可以收到以下主题的信息。

home/sensor/kitchen/temperature
home/sensor/bedroom/brightness
home/sensor/data

多级通配符可以代替多级主题信息,因此无论”home/sensor”后面有一级还是多级主题,都可以被订阅了”home/sensor/#”的客户端接收到。

  1. 主题应用注意事项
    – 以$开始的主题

以$开始的主题是MQTT服务端系统保留的特殊主题,我们不能随意订阅或者向其发布信息。以下是此类主题的示例:

$SYS/broker/clients/connected
$SYS/broker/clients/disconnected
$SYS/broker/clients/total
$SYS/broker/messages/sent
$SYS/broker/uptime

类似的主题还有很多。不过请记住一点,以$符号开头的主题是系统保留的特殊主题,我们不能随意订阅或者向其发布信息。

– 不要用 “/” 作为主题开头
MQTT允许使用“/”作为主题的开头,例如/home/sensor/data。但是这将这么做毫无意义,而且会额外产生一个没有用处的主题级别。所以我们应避免使用/作为主题的开头。

– 主题中不要使用空格
MQTT协议允许我们在主题中使用空格,但是阅读和调试含有空格的主题会显得异常困难。所以我们尽量不要在主题中使用空格或者特殊字符。

– 保持主题简洁明了
MQTT是一种轻量级的通讯协议,它常用于网络带宽受限的环境,因此我们应尽量让主题简洁明了,从而让设备间交互的内容更加简洁,以更好的适应网络带宽受限的环境。

– 主题中尽量使用ASCII字符
虽然很多MQTT设备支持UTF-8字符作为MQTT主题,但是笔者建议您在主题中尽量使用ASCII字符。

  • 在主题中嵌入客户端ID
    在主题中嵌入发布消息的客户端ID,这一操作可以为开发和管理MQTT信息提供便利。通过主题中的客户端ID内容,我们可以很容易的了解该主题信息是由哪一台设备所发布的。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用 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
发出的红包

打赏作者

暮誠雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值