Я новичок в 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. Я могу правильно подключиться к платформе.Я не уверен, что у меня сейчас все ясно, но я могу предоставить вам дополнительную информацию, если это необходимо.Большое спасибо за вашу помощь.