我目前正在使用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)