несколько событий в paho mqtt с python

#!/usr/bin/env python

import sys
from arduino.Arduino import Arduino
import paho.mqtt.client as mqtt
import serial
import time
pin = 13
broker_adress = "10.0.2.190"
sys.path.append("/home/hu/Schreibtisch/Arduino_BA_2.0/Probe_Programmierung/Python-Arduino-Proto-API-v2/arduino")
ser = serial.Serial('/dev/ttyACM0', 9600)
b = Arduino('/dev/ttyACM0')
b.output([pin])
b.setLow(pin)
gassensor_value = "no default_value"
sensor_value = [['/Deutschland/Osnabrueck/Coffee-bike-1/Sensor_1',gassensor_value]]
#########################################################################
# Callback_1 for relay
#on_connect1,on_disconnect1,on_subscribe1on_message_1
#########################################################################
def on_connect(mqttrelay, obj, flags, rc):
    if rc != 0:
        exit(rc)
    else:
        mqttrelay.subscribe("qos0/test", 0)

def on_disconnect(mqttrelay, obj, rc):
    obj = rc

def on_subscribe(mqttrelay, obj, mid, granted_qos):
    print(mqttrelay.subscribe("qos0/test", 0))
    print("Waiting for the subscribed messages")


def on_message(mqttrelay,userdata, message):
    a = str(message.payload.decode("utf-8"))
    print(a)
    if (a == "1" or a == "0"):
        if (a == "1"):
           b.setHigh(13)
           time.sleep(10)
        else:
            b.setLow(13)
            time.sleep(10)
    else:
        print("please publish the message 1 or 0")
#########################################################################
# Callback_2 for gassensor
# on_connect2,on_publish2
#########################################################################

def on_publish(mqttgassensor, obj, mid):
    print("mid: " + str(mid))

def on_connect(mqttgassensor, userdata, flags, rc):
    print("Connected with result code " + str(rc))

#create new instance to subscribe the sitution of relay
mqttrelay = mqtt.Client("relay_K_12", 1)

#create new instance to publish the situation of gassensor
mqttgassensor = mqtt.Cleint("gassensor",1)

#the events and callbacks of instance mqttrelais associate with each other:
mqttrelay.on_message = on_message
mqttrelay.on_connect = on_connect
mqttrelay.on_subscribe = on_subscribe
mqttrelay.on_disconnect = on_disconnect
mqttrelay.connect(broker_adress)

#the events and callbacks of instance gassensor associate with each other:
mqttgassensor.on_connect = on_connect
mqttgassensor.on_publish = on_publish
mqttgassensor.connect(broker_adress)

while True:
    mqttrelay.loop_start()
    time.sleeps(2)
    mqttrelay.loop_stop()
    print("relay 開始循環")
    mqttgassensor.loop_start()
    mqttgassensor.loop()
    time.sleep(1)
    sensor_value[0][1] = ser.readline()
    if (sensor_value[0][1] != "no default_value" or sensor_value[0][1] != b''):
        print(sensor_value[0])
        mqttgassensor.publish("/Deutschland/Osnabrueck/Coffee-bike-1/Sensor_1", sensor_value[0][1])
    mqttgassensor.loop_stop()

Всем привет. Я хочу выполнить два экземпляра в этом сценарии.

  1. Через публикацию мы можем получить данные от газового датчика. Потому что в верхней части этого скрипта я импортировал последовательный модуль, с помощью которого мы можем установить связь между arduino и raspberry pi.

  2. Я хочу использовать подписку, чтобы получить команду (1 или 0) с сервера. цифра 1 может активировать реле, а цифра 0 может деактивировать реле.

Я в одиночестве и успешно пытался осуществить эти две мысли. Но Комбинация мне не отвечает.


person Fengxiang Hu    schedule 12.04.2018    source источник


Ответы (1)


Вам нужен только 1 экземпляр клиента MQTT, так как есть только 1 брокер. Вы можете подписаться на несколько тем и публиковать их из одного клиента.

Вы должны подключить этот 1 экземпляр, а затем запустить сетевой цикл в фоновом режиме с помощью client.start_loop()

Затем вы можете запустить свой собственный цикл для чтения из последовательного порта.

person hardillb    schedule 12.04.2018