Публикация данных на сервере RabbitMQ через Mqtt

Я написал простую программу на Python для подключения RabbitMqtt сервера и надеюсь создать очередь и опубликовать сообщения. Однако после создания соединения и создания очереди сообщение не было успешно опубликовано (когда я проверяю информацию о сообщении, я не могу найти никаких записей и данных). Интересно, я пропустил какие-то параметры или настройки в client.publish(), но не знаю, как это понять.

import paho.mqtt.client as mqtt


# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))

    # Subscribing in on_connect() means that if we lose the connection and
    # reconnect then subscriptions will be renewed.
    client.subscribe('SEEDQ')
    client.publish('SEEDQ', 'deqwdqwefqwefwefqwefqwe', 0, False)

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))


client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("15.78.xx.xx", 1883, 60)

client.loop_forever()

person QuickLearner    schedule 28.05.2016    source источник
comment
Так вы публикуете в теме SEEDQ? Вы не получите сообщения ни по одной теме, если не подпишетесь на эту тему, вы это сделали?   -  person barny    schedule 28.05.2016
comment
Да, надеюсь опубликовать в теме SEEDQ. А именно, следует ли мне изменить свой код на client.subscribe ('SEEDQ') и client.publish ('SEEDQ', 111, 0, False)? Спасибо   -  person QuickLearner    schedule 28.05.2016
comment
Да, нужно подписаться на получение сообщений,   -  person barny    schedule 28.05.2016
comment
Возможно, для одного приложения необычно публиковать и подписываться на одну и ту же тему, но, поскольку все подписчики на эту тему получат копии сообщения, это ничего не нарушит.   -  person barny    schedule 28.05.2016
comment
Я перешел на client.subscribe ('SEEDQ') и client.publish ('SEEDQ', 111, 0, False). Но RabbitMQ не получил сообщения. Я не знаю, почему я могу установить соединение, но не могу опубликовать сообщение?   -  person QuickLearner    schedule 28.05.2016
comment
Можете ли вы отредактировать / обновить в вопросе минимальный полный образец кода, который показывает проблему, чтобы я мог попробовать?   -  person barny    schedule 28.05.2016
comment
Вы пробовали добавить функцию обратного вызова on_publish, чтобы вы могли подтвердить, что публикация прошла успешно?   -  person barny    schedule 28.05.2016
comment
Я просто запустил коды, которые я разместил здесь, просто импортировав paho.mqtt.client и изменив '15 .xx.xx.xx 'на реальный адрес. Я назвал файл test.py и запустил его в PyCharm. Тогда у меня возникла проблема. Если возможно, не могли бы вы помочь мне попробовать это на вашей стороне? Спасибо   -  person QuickLearner    schedule 28.05.2016
comment
Я не использовал обратный вызов on_publish, потому что я впервые использую mqtt. Я знаю только подписаться и опубликовать ... Извините   -  person QuickLearner    schedule 28.05.2016


Ответы (1)


Проблема в том, что вы вызываете client.publish () до того, как соединение будет установлено. Переместите client.publish в функцию on_connect, ПОСЛЕ client.subscribe ('SEEDQ'), и она заработает.

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))

    # Subscribing in on_connect() means that if we lose the connection and
    # reconnect then subscriptions will be renewed.
#    client.subscribe("$SYS/#")
    client.subscribe('SEEDQ')
    client.publish('SEEDQ', 111, 0, False)

Выход:

Connected with result code 0
SEEDQ 111

К вашему сведению, я использовал общедоступный тестовый сервер на iot.eclipse.org, порт 1883.

К вашему сведению, есть очень полезный клиент браузера ЗДЕСЬ, использующий его и общедоступный тестовый сервер messagesight.demos.ibm .com порт 1883, вы можете подписаться на SEEDQ и увидеть публикацию вашего скрипта python, а также с помощью клиента браузера вы можете опубликовать его в SEEDQ из своего браузера, и ваш скрипт будет отображать сообщение, пока оно находится в loop_forever (). Очевидно, что использование этих тестовых серверов является общедоступным.

ОБНОВЛЕНИЕ вот полный код - это работает против общедоступных серверов, которые я показываю выше.

import paho.mqtt.client as mqtt

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))

    # Subscribing in on_connect() means that if we lose the connection and
    # reconnect then subscriptions will be renewed.
#    client.subscribe("$SYS/#")
    client.subscribe('SEEDQ')
    client.publish('SEEDQ', 111, 0, False)


# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

#client.connect('15.xx.xx.xx', 1883, 60)
#client.connect("iot.eclipse.org", 1883, 60)
client.connect("messagesight.demos.ibm.com", 1883, 60)

#client.publish('SEEDQ', 111, 0, False)

# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()
person barny    schedule 28.05.2016
comment
Спасибо, я переместил client.publish в функцию on_connect, RabbitMqtt по-прежнему указывает, что сообщения нет. Коды выкладываю следующим образом. - person QuickLearner; 28.05.2016
comment
Вы можете и должны отредактировать свой вопрос, чтобы отобразить исправленный код, а не создавать новый ответ. - person barny; 28.05.2016
comment
В очередной раз благодарим за помощь. Вторая ЗДЕСЬ ссылка - Ошибка сети. - person QuickLearner; 28.05.2016
comment
Хорошо, я изменил коды в своем вопросе. Удаляю ответ. - person QuickLearner; 28.05.2016
comment
Обновил второй ЗДЕСЬ - я все равно не должен был использовать URL-ссылку - person barny; 28.05.2016
comment
Я добавил полный код, который использовал. Это работает против общедоступного сервера - возможно, есть что-то в RabbitMQ или вашей среде, что останавливает работу кода в вашей среде. Попробуйте сами на публичном сервере. - person barny; 28.05.2016
comment
Кстати, я запускаю этот код из командной строки в Windows, используя Python 2.7. YMMV с использованием разных сред / ОС / версий - не могу вам с этим помочь - person barny; 28.05.2016
comment
Я также использую Windows и Python 2.7. Я предполагаю, что RabbitMQ отличается от публичного сервера. В любом случае, я проверю RabbitMQ и надеюсь найти проблему. Спасибо за ваше терпение. - person QuickLearner; 28.05.2016
comment
Только что установил rabbitmq локально. Пришлось включить плагин rabbitmq mqtt и перезапустить службу, а затем приведенный выше код отлично работает против него. Возможно, у вашего брокера есть нестандартные настройки, например, для безопасность / аутентификация, которые останавливают работу этого простого примера. - person barny; 28.05.2016