【发布时间】:2019-06-17 17:25:20
【问题描述】:
我在编写与 MQTT 服务器通信并检查我可以使用本地网页控制的 GPIO 引脚的实际状态的代码时遇到问题(我仍在学习)。
我的问题是我不知道如何在函数内部进行无限循环,该函数将检查 pin 的实际状态并将其与 MQTT 发送的最后状态进行比较,如果有变化,它将向 MQTT 发布新值。
#!/usr/bin/env python2
import paho.mqtt.client as mqtt
import urllib
from time import sleep
import RPi.GPIO as GPIO
#Conf GPIO Number for relays
out_1 = 6
#Conf MQTT broker
broker_ip = "192.168.1.34"
broker_port = 1883
broker_timeout = 60
topic_sub = "/printer/#"
topic_out1 = "/printer/onoff"
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(out_1, GPIO.OUT)
GPIO.output(out_1, GPIO.HIGH)
def main():
# This is the issue part where I wanted to make looped check for actual value
def check_state(astate):
f= open("/sys/class/gpio/gpio6/value","r")
if f.mode == "r":
state = f.read(1)
if astate == state :
return
else:
print("CHANGE")
def on_connect(client, userdata, flags, rc):
client.subscribe(topic_sub)
def on_message(client, userdata, msg):
if msg.topic == topic_out1 :
if msg.payload == "1" :
GPIO.output(out_1, GPIO.LOW)
state = "1"
sleep(.1)
print("OUT 1 ON")
if msg.payload == "0" :
GPIO.output(out_1, GPIO.HIGH)
state = "0"
sleep(.1)
print("OUT 1 OFF")
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(broker_ip, broker_port, broker_timeout)
client.loop_forever()
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
GPIO.cleanup()
编辑: 这就是我在 @MilkyWay90 的多处理帮助下实现的。
#!/usr/bin/env python2
import urllib
from multiprocessing import Process
from time import sleep
import RPi.GPIO as GPIO
#Conf GPIO Number for relays
out_1 = 6
#Conf MQTT broker
broker_ip = "192.168.1.34"
broker_port = 1883
broker_timeout = 60
topic_sub = "/printer/#"
topic_out1 = "/printer/onoff"
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(out_1, GPIO.OUT)
GPIO.output(out_1, GPIO.HIGH)
def check_state():
import paho.mqtt.client as mqtt
clientSEND = mqtt.Client()
clientSEND.connect(broker_ip, broker_port, broker_timeout)
while True:
faf= open("/sys/class/gpio/gpio6/value","r")
qf= open("/home/pi/.state","r")
fastate = faf.read(1)
#reverse logic for gpio value
if fastate == "0" :
astate = "1"
elif fastate == "1" :
astate = "0"
qstate = qf.read(1)
#print("GPIO state: ",astate,"MQTT state: ",qstate)
if astate != qstate :
clientSEND.publish(topic_out1, astate)
#print("CHANGE")
sleep(3)
else:
sleep(3)
def mqtt():
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
client.subscribe(topic_sub)
def on_message(client, userdata, msg):
if msg.topic == topic_out1 :
if msg.payload == "1" :
GPIO.output(out_1, GPIO.LOW)
state_write("1")
sleep(.1)
#print("OUT 1 ON")
if msg.payload == "0" :
GPIO.output(out_1, GPIO.HIGH)
state_write("0")
sleep(.1)
#print("OUT 1 OFF")
def state_write(state):
f= open("/home/pi/.state","w")
f.write(state)
f.close
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(broker_ip, broker_port, broker_timeout)
client.loop_forever()
if __name__ == "__main__":
try:
bck_statuscheck = Process(target=check_state)
mqtt_process = Process(target=mqtt)
bck_statuscheck.start()
mqtt_process.start()
bck_statuscheck.join()
mqtt_process.join()
except KeyboardInterrupt:
GPIO.cleanup()
【问题讨论】:
-
你的问题是什么?
-
不确定这是否有帮助,但
while True是一个无限循环。 :P
标签: python raspberry-pi mqtt