使用 MQTT 和 Python 控制程序
Controlling Program with MQTT and 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
这是一个简单的测试程序,但我在尝试 "read" MQTT 负载时遇到了很多麻烦。
您的订阅者代码正在循环,但没有做任何有成效的事情。必须改成如下
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))
哟,伙计们。所以我是 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
这是一个简单的测试程序,但我在尝试 "read" MQTT 负载时遇到了很多麻烦。
您的订阅者代码正在循环,但没有做任何有成效的事情。必须改成如下
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))