基本知识

为了向服务器发送 RPC 命令,要将 PUBLISH 消息发送到以下主题:

  1. v1/devices/me/rpc/request/$request_id

其中$request_id是整数请求标识符。来自服务器的响应将发布到以下主题:

  1. v1/devices/me/rpc/response/$request_id

用例

下面以一个例子说明 如何使用客户端RPC。用例说明:
设备端发送rpc请求到服务端,服务端返回共享属性wang的值和服务器端数量vincent值的和。
流程说明:

  • 创建设备(略)
  • 手动创建一个共享属性键为wang,手动创建一个服务器端属性键为vincent
  • 创建规则链
  • 设备端链接到tb,请求(rpc/reqeust)并获取响应(rpc/response)

创建共享属性wang=666和创建服务器属性vincent=888
image.png
image.png
创建规则链;新增一条规则链(客户端rpc响应)
image.png
最终结果如下:我们标识4个节点。
image.png
引入到根节点
image.png
节点1,用来检查rpc请求带过来的请求方式是否正确。如下这里叫 getServerValue,所以客户端请求的参数method也必须叫这个名字。
image.png
节点2,使用富节点中的发起人属性节点获取我们刚才创建的贡献属性值wang和服务器属性值vincent。
image.png
节点3,编写rpc响应结果。这里需要解释的是为什么开头是ss ,shared ? 以下是官方网站的解释
image.png
image.png
节点4,增加rpc call reply。
image.png

测试,设备连接

我使用python脚本建立了一个连接到这个设备,可以看到运行结果,设备端获取到一个服务端返回的结果。
image.png
这里有个小问题:888+666等于888666,说明我们上边规则链的函数需要类型转换,如下。
image.png
image.png

  1. import json
  2. import paho.mqtt.client as mqtt
  3. borker = 'www.vincentisme.com'
  4. port = 1883
  5. access = "TRU09Sr72OWYQv0DMmZN"
  6. request = {"method": "getServerValue", "params": ""} #请求参数
  7. def on_connect(client, userdata, flags, rc):
  8. print("rc code:", rc)
  9. client.subscribe('v1/devices/me/rpc/response/+') # 订阅响应
  10. client.publish('v1/devices/me/rpc/request/1', json.dumps(request), 1) #发送请求
  11. def on_message(client, userdata, msg):
  12. print('Topic: ' + msg.topic + '\nMessage: ' + str(msg.payload)) # 响应内容
  13. client = mqtt.Client()
  14. client.on_connect = on_connect
  15. client.on_message = on_message
  16. client.username_pw_set(access)
  17. client.connect(borker, port, keepalive=60)
  18. try:
  19. client.loop_forever()
  20. except KeyboardInterrupt:
  21. client.disconnect()