2017-09-12 1 views
-2

에 여러 개의 개별 스레드를 추가하고 내가 추가 할 필요가이 내 코드입니다 MQTT 파이썬 코드

(1) 루프 UART하여 특정 데이터를받을 때 데이터를 게시 할 수 있습니다 (thread1) (ser.read())

(2) timed delay를 사용하여 report_temp_humidity()를 실행할 수있는 루프 (thread2)

그래서 테스트 용 스레드를 넣었으나 루프는 한 번만 실행됩니다.

"mqttclient.loop_forever()"가 줄 끝에 오는 이유는 무엇입니까?

이에 대한 도움이 필요합니다.

import paho.mqtt.client as mqtt 
import Adafruit_DHT 
import Adafruit_BBIO.UART as UART 
import serial 
import threading 
import time 

# DHT-11 Temperature & Humidity 
sensor = Adafruit_DHT.DHT11 
sensor_pin = 'P8_11' 

# UART 
UART.setup("UART1") 
ser = serial.Serial(port = "/dev/ttyO1", baudrate=9600) 
ser.close() 
ser.open() 

# Define event callbacks 
def on_connect(self, client, userdata, rc): 
     if rc == 0: 
       print("Connected successfully.") 
     else: 
       print("Connection failed. rc= "+str(rc)) 

def on_publish(client, userdata, mid): 
     print("Message "+str(mid)+" published.") 

def on_subscribe(client, userdata, mid, granted_qos): 
     print("Subscribe with mid "+str(mid)+" received.") 

def on_message(client, userdata, msg): 
     print("Message received on topic "+msg.topic+" with QoS "+str(msg.qos)+"and payload "+msg.payload) 
     if msg.payload == "check_status": 
      report_temp_humidity() 
     if msg.payload == "motor_run!": 
      print "Send command to RF" 
      ser.write("11.1111[S]") 

# Define my function prototypes 
def report_temp_humidity(): 
     hum, temp = Adafruit_DHT.read_retry(sensor, sensor_pin) 
     mqttclient.publish("/my_topic1/", "Temperature "+ str(temp) + "`C", qos=0) 
     mqttclient.publish("/my_topic1/", "Humidity " + str(hum) + "%", qos=0) 

# Define thread(loop) test 
def loop_test(delay): 
     print(loop!) 
     time.sleep(1)   

t1 = threading.Thread(target=loop_test, args=('1,',)) 
t1.start() 


mqttclient = mqtt.Client() 

# Assign event callbacks 
mqttclient.on_connect = on_connect 
mqttclient.on_publish = on_publish 
mqttclient.on_subscribe = on_subscribe 
mqttclient.on_message = on_message 

# Connect 
mqttclient.username_pw_set("dioty_user", "1234567") 
mqttclient.connect("mqtt.dioty.co", 1883) 

# Start subscription 
mqttclient.subscribe("/my_topic1/") 

# Publish a message 
mqttclient.publish("/my_topic1/", "Hello World Message!") 

# Loop 
mqttclient.loop_forever() 

답변

0

이는 MQTT 라이브러리와 관련이 없습니다.

스레드 t1loop_test 함수를 실행하며이 함수에는 2 개의 명령문 만 있습니다. 이것들을 (한 번) 실행하고 나갈 것이고, 다른 것을 계속하기 위해 아무 것도 말할 것도 없습니다.

그 스레드를 계속 실행하려면 일종의 루프 문 (예 : while True)을 포함시켜야합니다.