2015-05-19 6 views
2

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

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.

ответ

0

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

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() 

Так ваш Publisher код, где создать новый клиент для отправки одного письма, которое своего рода массовое убийство

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)) 
+2

Издатель код должен также назвать mqttc. start_loop() перед входом в то время True: loop, чтобы обеспечить отправку сообщений keep-alive, и что большие публикации могут быть обработаны (на самом деле не требуются в этом случае, но в хорошем виде) – hardillb

+1

Shazin, мой человек, где правильно. Спасибо чувак. Я люблю тебя. – GonzaloGo