基本知识
为了向服务器发送 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 jsonimport paho.mqtt.client as mqttborker = 'www.vincentisme.com'port = 1883access = "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_connectclient.on_message = on_messageclient.username_pw_set(access)client.connect(borker, port, keepalive=60)try:client.loop_forever()except KeyboardInterrupt:client.disconnect()
