我在Raspberry Pi 3B上运行了一个python程序,在Thingsboard上发送数据。Thingsboard中的设备作为单个实体连接到仪表板。在运行该程序时,可以在仪表板的图表和卡片上显示数据,并且可以通过规则链发送服务器端RPC命令。但是控件窗口小部件声称“设备已离线”。
下面是Raspberry的代码:
import paho.mqtt.client as mqtt
import time
import json
import random
def on_message(client, data, message):
print json.loads(message.payload)
def main():
client = mqtt.Client("python1")
client.connected_flag=False
client.suppress_puback_flag=False
client.on_message = on_message
token=[DEVICE ID]
if token !="":
pass
client.username_pw_set(token, "")
client.connect([MY THINGSBOARD HOST'S IP], 1883)
client.subscribe("v1/devices/me/attributes", 1)
client.subscribe("v1/devices/me/rpc/request/+", 1)
time.sleep(2)
while not client.connected_flag:
client.loop()
while True:
message = {"number": random.randint(0, 100)};
message_json = json.parse(message)
client.publish("v1/devices/me/telemetry", message_json, 1)
client.loop_start()
time.sleep(3)
client.loop_stop()
if __name__== '__main__':
main()
如何让控件小部件意识到设备处于在线状态?
发布于 2019-12-11 07:44:38
当您打开仪表板控件小工具发送给您的请求时:
{"method":"getValue","params":{}}
您需要在超时前对此消息进行响应。否则设备就会离线,我不知道有没有办法让设备在线。
编辑
J-Dobu,是的,你需要使用双向RPC。
请逐步查找路径:
要解决您的问题(假设您的应用程序接口是HTML API):1)当您打开仪表板RPC小部件生成RPC命令2)使用消息订阅此命令: curl -v -X GET http://localhost:8080/api/v1/$ACCESS_TOKEN/rpc 3) Thingsboard响应应类似于:{" ID ": 956,"method":"getValue","params":null} 4)使用此命令进行回复(在本例中将956替换为您的ID):curl -v -X POST -d '20‘https://cloud.thingsboard.io/api/v1/$ACCESS_TOKEN/rpc/956 --header "Content-Type:application/json“
Control RPC Widget有一些超时(它在编辑模式和高级选项卡上)。请确保您在此超时时间段内回复。否则,设备将使用另一个ID再次生成RPC命令,并且不会侦听上次回复。
在根规则链中,我将Message Type Switch直接连接到RPC Call request。确保你有最短的路径。在我的例子中,这就是问题所在。当我尝试添加一些逻辑时,它不能正常工作。
关于你的Raspberry,如果你没有看到正确的答案,你可能会错误地使用你的API。你能看到id和method的正确响应吗?
https://stackoverflow.com/questions/59195537
复制相似问题