ThingsBoard入門實戰(四):設備RPC命令下發


設備RPC命令下發

路燈遙測狀態我們可以獲取了,怎么控制路燈呢?

一、分析

對於出現的遙測數據進行一個分析:

  • 電量 不可控制
  • 開關 可開關
  • 亮度 可調

電量的顯示比較簡單,沒什么花俏。
開關和亮度,我們很想操作一下,怎么進行交互呢?

ThingsBoard提供了RPC部件來幫助我們實現。

二、RPC部件

2.1 開關

選擇一個可以用來開關的RPC控件
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

控件是有了,但是Request Timeout.是什么鬼?
別着急,我們需要設備響應剛才的RPC請求
編寫響應程序:


import time,random,sys
from tb_device_mqtt import TBDeviceMqttClient

telemetry = {}

def on_server_side_rpc_request(client, request_id, request_body):
    print(request_id, request_body,telemetry)
    elif request_body["method"] == "getTurn":
        turn = 0 if "turn" not in telemetry else telemetry['turn'] 
        client.send_rpc_reply(request_id, turn)
        telemetry.update({"turn": turn})
    elif request_body["method"] == "setTurn":
        turn = request_body["params"]
        client.send_rpc_reply(request_id, turn)
        telemetry.update({"turn": 1 if turn else 0})
    client.send花錢的_telemetry(telemetry) 

def mock_telemetry():
    t = {
        "battery":random.choice(range(10,50)),
    return t

def run(token):
    client = TBDeviceMqttClient("103.44.238.67", token)
    client.set_server_side_rpc_request_handler(on_server_side_rpc_request)
    client.connect()
    while True:
        time.sleep(3)
        tc = mock_telemetry()
        client.send_telemetry(tc)

if __name__ == '__main__':
    idx = sys.argv[1]
    token = "token_lamp_1"
    run(token)

這個程序的作用就是模擬設備響應RPC請求,我們先把它跑起來~
刷新頁面:
在這里插入圖片描述

警告神奇的消失了!
還可以點擊開關,完成設備開關燈操作。完美!

2.2 亮度

用同樣的方法,選擇亮度控件:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在程序里加入RPC方法的實現:


import time,random,sys
from tb_device_mqtt import TBDeviceMqttClient

telemetry = {}

def on_server_side_rpc_request(client, request_id, request_body):
    print(request_id, request_body,telemetry)
    if request_body["method"] == "getLight":
        light = random.choice(range(20,60)) if "light" not in telemetry else telemetry['light'] 
        client.send_rpc_reply(request_id, light)
        telemetry.update({"light": light})
    elif request_body["method"] == "setLight":
        light = request_body["params"]
        client.send_rpc_reply(request_id, light)
        telemetry.update({"light": light})
    elif request_body["method"] == "getTurn":
        turn = 0 if "turn" not in telemetry else telemetry['turn'] 
        client.send_rpc_reply(request_id, turn)
        telemetry.update({"turn": turn})
    elif request_body["method"] == "setTurn":
        turn = request_body["params"]
        client.send_rpc_reply(request_id, turn)
        telemetry.update({"turn": 1 if turn else 0})
    client.send_telemetry(telemetry) 

def mock_telemetry():
    t = {
        "battery":random.choice(range(10,50)),
    }
    return t

def run(token):
    client = TBDeviceMqttClient("103.44.238.67", token)
    client.set_server_side_rpc_request_handler(on_server_side_rpc_request)
    client.connect()
    while True:
        time.sleep(3)
        tc = mock_telemetry()
        client.send_telemetry(tc)

if __name__ == '__main__':
    idx = sys.argv[1]
    token = "token_lamp_1"
    run(token)

成功對接,點擊亮度條可調亮度,完美*2!
在這里插入圖片描述

三、下一步

本節在詳情面板中使用RPC控件完成對遠程設備的操控,下節我們繼續完善詳情面板。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM