如何识别收到消息的MQTT主题?

时间:2019-01-07 18:34:35

标签: java mqtt

客户端已订阅x /#主题。有可能在主题x / start和x / stop中接收消息,并且根据主题,它会执行操作。我不知道如何识别开始或停止主题中的内容。

在当前代码中,我在JSON中发送“操作”键:“开始”或“停止”。我想删除此密钥,并使用上面所述的格式,以标识主题。

他们认为需要任何进一步的信息,请要求我编辑该帖子!

JDK 8

代码:

 private MqttCallback callback = new MqttCallback() {
        public void connectionLost(Throwable throwable) {
            try {
                connect();
            } catch (MqttException e) {
                e.printStackTrace();
            }
        }

        public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
            String messageReceived = new String(mqttMessage.getPayload());
            actionPerformed(messageReceived);
        }

        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        }

    };

private void actionPerformed(String message) throws IOException {
    ClientDTO clientDTO = new ObjectMapper().readValue(message, ClientDTO.class);
    if (clientDTO.getAction().equalsIgnoreCase("start")) {
        startView(clientDTO);
    } else if (clientDTO.getAction().equalsIgnoreCase("stop")) {
        stopView();
    }

}

public void connect() throws MqttException {
    MqttConnectOptions options = new MqttConnectOptions();
    options.setUserName("a_nice_username");
    options.setPassword("a_cool_password".toCharArray());
    options.setAutomaticReconnect(true);
    MqttClient client = new MqttClient("someaddress", MqttClient.generateClientId());
    client.setCallback(callback);
    try {
        client.connect(options);
        client.subscribe(topic);
        TaskbarIcon.alteraIconeOnline();
    } catch (Exception e) {
        TaskbarIcon.alteraIconeOffline();
    }
}

public void tipoConexao(int tipoConex) throws IOException {
    switch (tipoConex) {
        case 0:
            topic += "/operador/" + getIdReceived() + "/#";
            System.out.println(topic);
            break;

        //etc

    }

1 个答案:

答案 0 :(得分:4)

此方法中的s是主题:public void messageArrived(String s, MqttMessage mqttMessage)

here有据可查:

  

已到达邮件

     

void messageArrived(java.lang.String主题,MqttMessage消息)抛出java.lang.Exception

     

从服务器收到消息时将调用此方法。

     

此方法由MQTT客户端同步调用。在此方法之前,不会将确认发送回服务器   干净地返回。

     

如果此方法的实现引发异常,则客户端将关闭。下次重新连接客户端时,任何   服务器将重新传送QoS 1或2消息。

     

在运行此方法的实现时到达的其他任何消息,将在内存中累积,然后进行备份   在网络上。

     

如果应用程序需要保留数据,则应确保在从此方法返回之前(如之后)保留数据   从此方法返回的消息被认为是   已交付,并且无法复制。

     

可以在此回调的实现中发送新消息(例如,对此消息的响应),但是   实现一定不能断开客户端的连接,因为那样会   无法发送对正在处理的消息的确认,   就会发生死锁。

     

参数:

     

topic -消息中主题的名称发布至

     

消息-实际消息。

     

投掷:

     

java.lang.Exception -如果发生终端错误,应关闭客户端。