Java中如何订阅多个 MQTT 主题

我正在努力解决一个问题,或者可能是因为我的编程背景很小,问题是关于订阅多个主题并在 android 的多个文本视图中显示订阅的主题。

我曾经这样订阅它:

private void setSub(){
    try{
        client.subscribe(topic,0);
    }
    catch (MqttException e){
        e.printStackTrace();
    }
}

那么我在成功连接到 MQTT 客户端后调用了 setsub()函数

然后我已经实现了setCallBack方法,并在messageArrive下添加了该行,以使用我从订阅收到的消息有效负载更改文本视图值。

@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
    temp.setText(new String(message.getPayload()));
}

当然,当我定义另一个文本视图时,它只是采用了与第一个相同的结果。

所以我的问题是如何配置 MessageArrives 函数以在单个文本视图中显示每个主题?

提前谢谢你。

回答1:

您可以根据需要多次调用不同的主题。client.subscribe()

private void setSub(){
    try{
        client.subscribe(topic1,0);
        client.subscribe(topic2,0);
        client.subscribe(topic3,0);
    }
    catch (MqttException e){
        e.printStackTrace();
    }
}

回调是针对每条消息传递的,因此您只需设置 if 语句即可根据主题决定要更新的 textView。messageArrived()topic

@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
  if (topic.equals(topic1) {
    temp.setText(new String(message.getPayload()));
  } else if (topic.equals(topic2) {
    foo.setText(new String(message.getPayload()));
  }
}

但是,您不应该在回调中调用该方法,因为它发生在客户端线程上。您需要查看使用以进行更新。setText()runOnUiThread()

回答2:

我刚刚想通了

if (topic.contains("button") ) {
            temp.setText(new String(message.getPayload()));
        }
        else if (topic.contains("test"))
        {
            volt.setText(new String(message.getPayload()));
        }

我刚刚输入了要显示的每个主题的名称。

回答3:

尝试运行OnUiThread方法,因为onMessageArived()是一个客户端线程。

public void messageArrived(String topic, MqttMessage message) 
throws Exception {
    String msg = new String(message.getPayload());
    Log.i(TAG, "Message Arrived: " + msg);
    runOnUiThread(new Runnable(){
        public void run() {
            textView.setText(msg);
        }
    });
}    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MQTT协议,分组订阅(Group Subscription)允许多个客户端通过同一主题进行订阅,这个主题可以是一个逗号分隔的列表,其每个字符串代表一个有效的主题过滤器(Topic Filter)。MQTT服务器将会向每个订阅了该主题的客户端分别发布消息。 在Java使用MQTT实现组订阅,需要使用Paho MQTT客户端库。使用该库,可以创建非常轻量级的MQTT应用程序,以下是实现分组订阅的基本步骤: 1. 创建MQTT客户端实例,并打开与MQTT服务器的连接。 ``` MqttClient client = new MqttClient("tcp://localhost:1883", MqttClient.generateClientId()); client.connect(); ``` 2. 创建MqttTopic对象,表示需要订阅主题。 ``` MqttTopic topic = client.getTopic("example"); ``` 3. 创建MqttMessageListener实现对象,处理接收到的消息。 ``` MqttMessageListener listener = new MqttMessageListener() { @Override public void messageArrived(String topic, MqttMessage message) throws Exception { // 处理接收到的消息 } }; ``` 4. 创建MqttSubscribeOptions对象,设置订阅选项(如QoS级别)。 ``` MqttSubscribeOptions options = new MqttSubscribeOptions(); options.setQos(1); ``` 5. 使用客户端的subscribe()方法进行组订阅操作。 ``` client.subscribe(new String[] {"example","test"}, new int[]{1,1}); ``` 在上面的代码,第一个参数是一个字符串数组,包含需要订阅主题;第二个参数是一个整型数组,包含每个主题订阅选项(如QoS级别)。以上代码将订阅名为"example"和"test"的两个主题。 需要注意的是,MQTT规定组订阅内的每个客户端的ClientId必须唯一,否则其他客户端将无法订阅主题。在JavaMqttClient.generateClientId()方法可以生成一个唯一的ClientId。 总之,通过Java实现MQTT分组订阅,可以提高消息传输效率和性能,是一种非常实用和有效的消息传输方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值