2016-09-22 244 views
0

我试图在循环中不断运行以下代码。但是下面的代码只运行一次,并且只有一条消息条目。运行paho mqtt客户端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() 

,它连接到本地主机,需要一个单一的入口。在发送诸如星期四:05:47:0之后,等待5:47运行plugON/plugOFF。在5:47它运行该功能并与本地主机断开连接。

如何让我的代码接受另一个条目并继续循环?

+0

请详细说明你的问题没有正确回答 – 2114L3

回答

-1

有几个问题。

你有没有详细的Python,apscheduler,MQTT的版本,并且省略了您的进口和一些有用的功能进行故障排除像on_connect

等python3和apscheduler3.2测试这一点,我认为你;

  1. 您使用BlockingScheduler代替BackgroundScheduler(为什么看到它的第一味精全部停止,这是有可能的)。 bgscheduler不会停下来等待事件。
  2. 你在你的函数中启动调度器,当你声明调度时做一次。你以后可以add_job不用担心。
  3. 你还没有声明调度(或者你削减了我们的粘贴)
  4. 你没有调用正确的发布你的声明的mqtt实例。或者你在做别的东西,我不能看到你的粘贴代码。
  5. paho发布没有方法称为'单'?
  6. 您在add_job上的静态ID会导致您调度第二份工作时出现问题。你将抛出一个来自被重用的id的异常。但我不知道你使用的细节。

如果您正在使用APS < 3然后看着this你应该能够设置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和泛美卫生组织-mqttv1工作。2

TL:DR您使用apsheduler阻塞模式

  • 你开始调度上的每个ON_MESSAGE呼叫

  • 相关问题