Я не могу соединить Java-приложение с Python-приложением, используя MQTT - PullRequest
0 голосов
/ 31 мая 2019

Я создал приложение на python, которое отправляет сообщения каждые 3 секунды.Это сообщение отправлено брокеру комаров MQTT.С другой стороны, у меня есть приложение Java, которое подписано на тему сообщения.Когда я запускаю два приложения, приложение Java никогда ничего не получает.

Брокер mqtt, показанный в коде, неверен, я изменил его для конфиденциальности.

Однако, когда я использую mosquitto дляопубликовать сообщение, приложение Java получает сообщение.

import paho.mqtt.client as mqtt
import time
import logging

# Enable logging
logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO)

logger = logging.getLogger(__name__)

broker='100.100.100.100'
port=1883

def on_log(client, userdata, level, buf):
    logger.info(buf)

def on_connect(client, userdata, flags, rc):
    if rc==0:
        client.connected_flag=True # set flag
        logger.info("Conexion establecida")
    else:
        logger.info("Conexion no establecida code = "+ str(rc))
        client.loop_stop()

def on_disconnect(client, userdata, rc):
    logger.info("Se desconecta el publicador \n")

def on_publish(client, userdata, mid):
    logger.info("Se publica un dato, mid "+ str(mid))

mqtt.Client.connected_flag=False #Crea un flag en la clase

client = mqtt.Client("jmacias_pub")     #Se crea una nueva instancia
client.on_log = on_log
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_publish = on_publish

client.connect(host=broker, port=port)
client.loop_start()

while not client.connected_flag: #wait in loop
    logger.info("In wait loop")
    time.sleep(1)

while True:
    time.sleep(3)
    logger.info('Publicando')
    ret = client.publish('rtu/delete','0|[192.168.1.1-866e]', 0)
    ret = client.publish('rtu/delete','0|[192.168.1.2-866e]', 1)
    ret = client.publish('rtu/delete','0|[192.168.1.3-866e]', 2)

client.loop_stop()
client.disconnect()
package com.speedforge.mqtt;

import java.util.concurrent.TimeUnit;

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;


/**
 * A sample application that demonstrates how to use the Paho MQTT v3.1 Client blocking API.
 */
public class Subscriber implements MqttCallback {
    //Subscribe topics
    static final String TOPIC_ALL="/rtu/delete";
    //Publish topics
    static final String TOPIC_DELETE="/rtu/delete";
    static final String TOPIC_INFO="/rtu/info";
    static final String TOPIC_DESPLOY="/rtu/desploy";


    private final int qos = 2;
    private static MqttClient client;
    //private static MqttClient replay_client;

    public Subscriber(String broker) throws MqttException {
        String host = String.format(broker);
        String clientId = "MQTT-Java-Example";

        MqttConnectOptions conOpt = new MqttConnectOptions();
        conOpt.setCleanSession(true);

        Subscriber.client = new MqttClient(host, clientId, new MemoryPersistence());
        Subscriber.client.setCallback(this);
        Subscriber.client.connect(conOpt);
        Subscriber.client.subscribe(Subscriber.TOPIC_ALL, qos);
    }

    /*
    public void sendMessage(String payload) throws MqttException {
        MqttMessage message = new MqttMessage(payload.getBytes());
        message.setQos(qos);
        this.client.publish(this.topic, message); // Blocking publish
    }
    */

    /**
     * @see MqttCallback#connectionLost(Throwable)
     */
    public void connectionLost(Throwable cause) {
        System.out.println("Connection lost because: " + cause);
        System.exit(1);
    }

    /**
     * @see MqttCallback#deliveryComplete(IMqttDeliveryToken)
     */
    public void deliveryComplete(IMqttDeliveryToken token) {

    }

    /**
     * @see MqttCallback#messageArrived(String, MqttMessage)
     */
    public void messageArrived(String topic, MqttMessage message) throws MqttException {
        System.out.println("Se recibe un nuevo mensaje del topic: "+ topic);
        String msg = new String(message.getPayload());
        System.out.println("Payload: " + msg);
    }

    public static void main(String[] args) throws MqttException {
        String broker       = "tcp://100.100.100.100:1883";
        System.out.println("Comienza la subscripcion");
        Subscriber s = new Subscriber(broker);

        try {
            TimeUnit.SECONDS.sleep(60);
            //Thread.sleep(10000);
        } catch (InterruptedException e) {
            System.out.println("Se obtiene una excepcion del temporizador "+e);
        }

        Subscriber.client.disconnect();
        Subscriber.client.close();
        System.out.println("Finaliza");
    }
}

Я должен получить данные, отправленные приложением python в приложение java

1 Ответ

0 голосов
/ 31 мая 2019

Решено, тема, которая использовалась в python, была

rtu / delete 

и в java

/ rtu / delete

Просто незнакомый символ '/'

...