基本知识
为了向服务器发送 RPC 命令,要将 PUBLISH 消息发送到以下主题:
v1/devices/me/rpc/request/$request_id
其中$request_id是整数请求标识符。来自服务器的响应将发布到以下主题:
v1/devices/me/rpc/response/$request_id
用例
下面以一个例子说明 如何使用客户端RPC。用例说明:
设备端发送rpc请求到服务端,服务端返回共享属性wang的值和服务器端数量vincent值的和。
流程说明:
- 创建设备(略)
- 手动创建一个共享属性键为wang,手动创建一个服务器端属性键为vincent
- 创建规则链
- 设备端链接到tb,请求(rpc/reqeust)并获取响应(rpc/response)
创建共享属性wang=666和创建服务器属性vincent=888
创建规则链;新增一条规则链(客户端rpc响应)
最终结果如下:我们标识4个节点。
引入到根节点
节点1,用来检查rpc请求带过来的请求方式是否正确。如下这里叫 getServerValue,所以客户端请求的参数method也必须叫这个名字。
节点2,使用富节点中的发起人属性节点获取我们刚才创建的贡献属性值wang和服务器属性值vincent。
节点3,编写rpc响应结果。这里需要解释的是为什么开头是ss ,shared ? 以下是官方网站的解释
节点4,增加rpc call reply。
测试,设备连接
我使用python脚本建立了一个连接到这个设备,可以看到运行结果,设备端获取到一个服务端返回的结果。
这里有个小问题:888+666等于888666,说明我们上边规则链的函数需要类型转换,如下。
import json
import paho.mqtt.client as mqtt
borker = 'www.vincentisme.com'
port = 1883
access = "TRU09Sr72OWYQv0DMmZN"
request = {"method": "getServerValue", "params": ""} #请求参数
def on_connect(client, userdata, flags, rc):
print("rc code:", rc)
client.subscribe('v1/devices/me/rpc/response/+') # 订阅响应
client.publish('v1/devices/me/rpc/request/1', json.dumps(request), 1) #发送请求
def on_message(client, userdata, msg):
print('Topic: ' + msg.topic + '\nMessage: ' + str(msg.payload)) # 响应内容
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.username_pw_set(access)
client.connect(borker, port, keepalive=60)
try:
client.loop_forever()
except KeyboardInterrupt:
client.disconnect()