Как я могу установить несколько обратных вызовов MQTT и подписаться на несколько тем в одном куске кода? - PullRequest
0 голосов
/ 29 января 2019

Я новичок в MQTT.Я работаю над проектом с участием платы Pycom (Sipy).На макете у меня есть датчики температуры и веса, которые я читаю значения.Они сравниваются со значениями, которые пользователь может выбрать, используя два виджета-слайдера на платформе IOT (Adafruit IO).Например, если выбранное пользователем значение температуры выше измеренного датчиком, сообщение «Значение выше» будет напечатано на моей консоли REPL, и то же самое для веса.Для этого я написал две функции обратного вызова (названные sub_weight и sub_temp).Затем я использую client.set_callback (sub_cb_weight) и client.set_callback (sub_cb_temp).Однако мне кажется, что учитывается только второй записанный обратный вызов, как если бы был нажат первый.У меня та же проблема, когда я пытаюсь подписаться на обе темы.Тогда у меня возник вопрос: можно ли подписаться более чем на одну тему, а также установить два обратных вызова, чтобы у меня было два ответа?

from umqtt import MQTTClient 
import ubinascii 
import micropython 
from machine import Pin,ADC,I2C
import network
from network import WLAN
import onewire
from onewire import OneWire,Ds
AIO_SERVER = "io.adafruit.com"
AIO_PORT = 1883
AIO_USER = "username"
AIO_KEY = "key"
AIO_CLIENT_ID = ubinascii.hexlify(machine.unique_id())
client = MQTTClient(AIO_CLIENT_ID, AIO_SERVER, AIO_PORT, AIO_USER, AIO_KEY)

wlan=WLAN(mode=WLAN.STA)
pw='mypw'
nets=wlan.scan()
for net in nets:
    if net.ssid == 'myssid':
        wlan.connect(net.ssid,auth=(None,pw),timeout=5000)
        if wlan.isconnected() == True:
            print('Connected')
        else:
            print('Not connected')
client.connect()

AIO_WEIGHT_FEED = "username/feeds/weight"


def press_sensor():
    adc=machine.ADC()
    apin=adc.channel(pin='G5')
    p=(apin()*700/4095)
    return p

def sub_cb_weight(topic_full, pressed_full):
    print((topic_full, pressed_full))
    p=press_sensor()
    while True:
      if msg <= str(p).encode('ascii'):
          print('You chose a lower weight')
      else:
          print('You chose a higher one')
          time.sleep(3)

client.set_callback(sub_cb_weight)
client.subscribe(AIO_WEIGHT_FEED)
print("Connected to %s, subscribed to %s topic" % (AIO_SERVER, AIO_CONTROL_FEED_CALIB_FULL))

AIO_CONTROL_TEMP = "username/feeds/Temperature control"

def temp_sensor():
    ow = OneWire(Pin('P22',mode=Pin.IN,pull=Pin.PULL_UP))
    temp = Ds(ow)
    t=temp.read_temp()
    t=t/100
    t=int(t)
    return t

def sub_cb_temp(topic, msg): 
    print((topic, msg)) 
    v=temp_sensor()
    while True:
      if msg <= str(v).encode('ascii'):
          print('You chose a lower temperature')
      else:
          print('You chose a higher one')
          time.sleep(3)


client.set_callback(sub_cb_temp)
client.subscribe(AIO_CONTROL_TEMP)
print("Connected to %s, subscribed to %s topic" % (AIO_SERVER, AIO_CONTROL_TEMP))
while 1: 
     client.check_msg()

Например, в приведенном ниже фрагменте кода мое устройство будет подписываться только на подачу температуры и печатать сообщения, связанные с этим значением.Значения датчика хорошо читаются и сравниваются.Вот ссылка на модуль MQTT, который я использую: https://github.com/micropython/micropython-lib/blob/master/umqtt.simple/umqtt/simple.py. Я могу правильно подключиться к платформе.Я не уверен, что у меня сейчас все ясно, но я могу предоставить вам дополнительную информацию, если это необходимо.Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 29 января 2019

Эта библиотека позволяет вам настроить один обратный вызов для обработки всех подписанных сообщений.Вы можете использовать параметр topic в обратном вызове, чтобы определить, как обрабатывать сообщение.

например, зарегистрировать один обратный вызов, такой как

def callback(topic, msg): 
    print((topic, msg))
    if topic == b"username/feeds/Temperature control":
        sub_cb_temp(topic, msg)
    else
        sub_cb_weight(topic, msg)

Ваши текущие обратные вызовы также не являются многопоточнымии введите занятый цикл.Они будут обрабатывать только первое сообщение (по одной из этих тем), которое оно получает, и они также не позволяют отправлять подтверждение публикации библиотекой.Вам нужно будет использовать темы, чтобы обрабатывать обе темы одновременно.

...