Управление программой с помощью MQTT и Python

Эй, ребята. Так что я относительно новичок в Python и полный новичок в MQTT. Итак, пытаюсь сделать простое подключение двух программ через MQTT. Одна из программ является издателем:

   import paho.mqtt.client as mqtt
   import sys, tty, termios 
   ## Publisher reads a keyboard input 
   def getch():
       fd = sys.stdin.fileno()
       old_settings = termios.tcgetattr(fd)
       try:
           tty.setraw(sys.stdin.fileno())
           ch = sys.stdin.read(1)
       finally:
           termios.tcsetattr(fd,termios.TCSADRAIN, old_settings)
           return ch

   while True:
   ##Publisher connects to MQTT broker
       mqttc= mqtt.Client("python_pub")
       mqttc.connect("iot.eclipse.org", 1883)
       char= getch()
       mqttc.publish("Labbo/control", str(char))
       mqtt.Client()

Итак, в основном издатель считывает ключевой ввод и отправляет его брокеру. А клиентская программа должна считывать нажатие клавиши и реагировать соответствующим образом:

   import paho.mqtt.client as mqtt

   def on_connect(client, userdata, flags, rc):
       print("Connected with result code "+str(rc))
       client.subscribe("Labbo/control")

   def on_message(client, userdata, msg):
       print(msg.topic+" "+str(msg.payload))
   ## v v PROBLEM LINE v v ## 
   char=str(msg.payload)
   ## ^ ^ PROBLEM LINE ^ ^ ##
   client = mqtt.Client()
   client.on_connect = on_connect
   client.on_message = on_message  
   client.connect("iot.eclipse.org", 1883, 60)
   ##The program just needs to close itself upon entering "x" on the Publisher
   while True:
       if char=="x":
          break

Это простая тестовая программа, но у меня были большие проблемы с попыткой «прочитать» полезную нагрузку MQTT.


person GonzaloGo    schedule 19.05.2015    source источник


Ответы (1)


Ваш код подписчика зацикливается, не делая ничего продуктивного. Это должно быть изменено следующим образом

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
   print("Connected with result code "+str(rc))
   client.subscribe("Labbo/control")

def on_message(client, userdata, msg):
   print(msg.topic+" "+str(msg.payload))
   char = str(msg.payload)
   if char == 'x':
       client.disconnect()

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("iot.eclipse.org", 1883, 60)
client.loop_forever()

Так же как и ваш код издателя, где он создает нового клиента для отправки одного письма, что является излишним

import paho.mqtt.client as mqtt
import sys, tty, termios
## Publisher reads a keyboard input 
def getch():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    try:
        tty.setraw(sys.stdin.fileno())
        ch = sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd,termios.TCSADRAIN, old_settings)
    return ch


##Publisher connects to MQTT broker
mqttc= mqtt.Client("python_pub")
mqttc.connect("iot.eclipse.org", 1883)
mqttc.loop_start()

while True:
    char= getch()
    mqttc.publish("Labbo/control", str(char))
person shazin    schedule 19.05.2015
comment
Код издателя также должен вызывать mqttc.start_loop() перед входом в цикл while True:, чтобы гарантировать отправку сообщений проверки активности и возможность обработки больших публикаций (на самом деле в этом случае это не требуется, но хорошая форма) - person hardillb; 19.05.2015