![](/img/trans.png)
[英]paho-MQTT python: How to let the loop_forever support subscribe message?
[英]Run paho mqtt client loop_forever
我试图在循环上连续运行以下代码。 但是以下代码仅运行一次,并且仅输入一条消息。
我试图在on_message函数中执行的操作是使用python apscheduler运行cron任务。
def on_message(mqttc, obj, msg):
global val
val = str(msg.payload)
print val
dow = val[0:3]
print dow
hr = val[4:6]
print hr
min = val[7:9]
print min
status = val[10:11]
print status
def plugON():
publish.single("plug/status","0", hostname="localhost")
def plugOFF():
publish.single("plug/status","1", hostname="localhost")
def cronon():
print "cron on"
def cronoff():
print "cron off"
if status == '0':
sched.add_job(plugON, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=min, id='plugon')
sched.add_job(cronon, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=min)
if status == '1':
sched.add_job(plugOFF, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=min, id='plugoff')
sched.add_job(cronoff, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=min)
sched.start()
mqtt连接脚本:
mqttc = mqtt.Client()
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subscribe
mqttc.connect("localhost", 1883, 60)
mqttc.subscribe("plug/#", 0)
#mqtt loop
mqttc.loop_forever()
在执行过程中,它连接到localhost,接受一个条目。 在发送类似thu:05:47:0的消息时 ,请等到5:47运行plugON / plugOFF。 在5:47,它运行函数并与localhost断开连接。
如何获取我的代码以再次输入并继续循环?
一些问题。
您尚未详细说明哪个版本的python,apscheduler,mqtt,并且省略了导入和一些有用的故障排除功能,例如on_connect
所以在python3和apscheduler3.2上测试这个我认为你;
如果您使用的是aps <3,那么查看此内容应该可以将standalone=false
设置standalone=false
“独立模式”的概念不复存在。 对于standalone = True,请改用BlockingScheduler;对于standalone = False,请使用BackgroundScheduler。 BackgroundScheduler匹配旧的默认语义。
#!/usr/bin/env python
import paho.mqtt.client as mqtt
#from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.background import BackgroundScheduler
# Start the scheduler
sched = BackgroundScheduler()
sched.start()
def on_message(mqttc, obj, msg):
global val
val = str(msg.payload.decode('utf-8'))
dow = val[0:3]
hr = val[4:6]
minu = val[7:9]
status = val[10:11]
print(str(val) +" "+ dow +" "+ hr +" "+ minu +" "+ status)
def plugON():
mqttc.publish("plug/status","0")
def plugOFF():
mqttc.publish("plug/status","1")
def cronon():
print("cron on")
def cronoff():
print("cron off")
try:
if status == '0':
sched.add_job(plugON, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=minu, id='plugon')
sched.add_job(cronon, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=minu)
if status == '1':
sched.add_job(plugOFF, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=minu, id='plugoff')
sched.add_job(cronoff, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=minu)
except:
print("whoops")
sched.print_jobs()
mqttc = mqtt.Client()
mqttc.on_message = on_message
#mqttc.on_connect = on_connect
#mqttc.on_publish = on_publish
#mqttc.on_subscribe = on_subscribe
mqttc.connect("local", 1883, 60)
mqttc.subscribe("plug/#")
#mqtt loop
mqttc.loop_forever()
测试为在python3.5.2和apschedulerv3.2和paho-mqttv1.2上工作的代码
TL:DR
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.