設備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控件完成對遠程設備的操控,下節我們繼續完善詳情面板。