繁体   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