订阅多个MQTT主题

时间:2018-07-13 16:15:24

标签: java android mqtt paho subscribe

我正在苦苦挣扎,或者可能是因为我的编程背景很小,所以问题在于订阅多个主题并在android的多个textview中显示订阅的主题

我曾经这样订阅它:

private void setSub()
{
    try{

        client.subscribe(topic,0);

    }
    catch (MqttException e){
        e.printStackTrace();
    }
}

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

然后,我实现了setCallBack方法,并在messageArrived下添加了以下行,以使用从订阅中收到的消息有效负载来更改textview值

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

当然,当我定义另一个textview时,其结果与第一个相同。

所以我的问题是如何配置MessageArrived函数以在单个textview中显示每个主题?

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以根据需要根据不同的主题多次致电client.subscribe()

private void setSub()
{
    try{

        client.subscribe(topic1,0);
        client.subscribe(topic2,0);
        client.subscribe(topic3,0);

    }
    catch (MqttException e){
        e.printStackTrace();
    }
}

每条消息都将messageArrived()回调传递给topic,因此您只需设置一个if语句即可根据主题决定要更新哪个textView。

@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()进行更新。

答案 1 :(得分:0)

我已经弄清楚了,

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

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