![](/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.