在Thingsboard上进行MQTT发布-订阅操作

时间:2019-05-24 13:49:27

标签: mqtt connect publish-subscribe thingsboard

我目前正在使用Pycom设备进行一些IOT项目,该设备必须通过MQTT与平台-在我的情况下(Thingsboard)通信,对于那些知道这一点的人来说。由于我使用Python进行编码,因此我在这里使用以下Micropython库umqtt:https://github.com/micropython/micropython-lib/blob/master/umqtt.simple/umqtt/simple.py。当按下按钮时,我的Pycom设备必须开始发送重量值。然后,我将在此处执行这两项操作,发布值并订阅按钮,以便根据从按钮接收的内容(是/否),我必须开始发布。

但是,似乎没有得到此错误消息是不可能的:OSError:-1。确实,我觉得Thingsboard制作起来很必要,所以我必须连接到两个不同的MQTT客户端(一个客户端的访问令牌对应于负责显示值的小部件/图形,另一个客户端与开始按钮对应)。 ,然后我需要执行两个与订阅部分相关的操作(这些操作对应于下面的代码段中set_callback()之后的两行)。无论如何,我认为这可能是原因,该代码无法正常工作:仅因为定义了两个MQTT客户端,我才能将这两个操作链接到订购部分。例如,当我要发布时,我指定了客户端,即目标客户端。对于订阅部分,我连接到相应的客户端,但是无法将这两个操作与客户端中的任何一个相关联。另一方面,例如,由于我以前仅连接到一个客户端,因此只能按下按钮使LED闪烁。我不确定自己是否很清楚,这个问题可能更容易理解,并且可以回答以前已经在Thingsboard工作过的人进行过此类操作,但是仍然可以得到任何帮助,如有必要,我可以为您提供更多信息。 非常感谢您的帮助

import time
import umqtt
from umqtt import MQTTClient
from network import WLAN
import ujson
import machine
from machine import ADC,Pin

wlan=WLAN(mode=WLAN.STA)
wlan.connect(ssid,auth=(None,pw),timeout=5000)
while not wlan.isconnected():
    print('Not connected')
    time.sleep(1)
print('Connected')
dict1 = {}
server = 'demo.thingsboard.io'
port = 1883
pw=WEIGHT #access token graph weight
pw_button=BUTTON #access token button
id = '17b01144-2eaf-11e9-a5f3-6bb284b9c7ec'
topic='v1/devices/me/telemetry'
attributesRequestTopic='v1/devices/me/rpc/request/+' #subscribe calib
attributesResponseTopic='v1/devices/me/attributes/response/+'
fsr_user_full=2000
pressedf=False
client = MQTTClient(id, server, port,pw,pw)
client.connect()
print('Co weight')
client_button=MQTTClient(id, server, port,pw_button,pw_button)
client_button.connect()
print('Co calibfull')

def map(x,in_min,in_max,out_min,out_max):
    return ((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)

def press_sensor():
    adc=machine.ADC()
    fsrPin=adc.channel(pin='P13')
    fsrVoltage=map(fsrPin(),0,4095,1,2999)
    fsrResistance=3300-fsrVoltage
    fsrResistance=fsrResistance*10000
    fsrResistance=fsrResistance/fsrVoltage
    fsrConductance=100000
    fsrConductance=fsrConductance/fsrResistance
    fsrForce=fsrConductance/80
    weight=(fsrForce/9.8)*1000
    return(weight)

def sub_cb_button(topic_full, pressed_full):
    print((topic_full, pressed_full))
    global pressedf
    if pressed_full == b'{"method":"setValue","params":true}':
      pressedf=True
      fsr_user_full=press_sensor()
    elif pressed_full == b'{"method":"setValue","params":false}':
      pass

client.set_callback(sub_cb_button)
client.subscribe('v1/devices/me/rpc/request/+',0)
print('Subscribed')
client.publish('v1/devices/me/rpc/response/$request_id')
print('Response sent')
while True:
    client.check_msg()
    dict1["weight"] = press_sensor()
    encoded=ujson.dumps(dict1)
    if pressedf == True:
        client.publish(topic=topic,msg=encoded)
    time.sleep(1)

0 个答案:

没有答案