簡體   English   中英

運行paho mqtt客戶端loop_forever

[英]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上測試這個我認為你;

  1. 您使用的是BlockingScheduler而不是BackgroundScheduler(這可能是為什么在第一個msg上一切都停止的原因)。 bgscheduler不會停止並等待事件。
  2. 您正在啟動函數中的調度程序,請在聲明sched時執行一次。 您可以稍后再添加工作。
  3. 您尚未聲明sched(或將其剪切為我們的粘貼)
  4. 您無法使用已聲明的mqtt實例正確調用發布。 或您所做的其他事情,我在您粘貼的代碼中看不到。
  5. paho publish有沒有稱為“單一”的方法?
  6. 您在add_job上的靜態ID會導致您在安排第二份作業時遇到問題。 您將因重復使用ID引發異常。 但我不知道您使用的細節。

如果您使用的是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

  • 您正在以阻止模式使用apsheduler
  • 您正在每個on_message調用中啟動調度程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM