RPC反写
WEBAPI
概述
WEBAPI 是 ThingsGateway 提供的 HTTP 接口,用于通过网络远程写入设备变量值。该接口支持标准的 RESTful 风格,可被各种编程语言和工具调用。
接口地址
-
http://localhost:5000/api/index.html (查看Swagger 文档)
请求参数
基本格式
请求参数为 Dictionary<string, Dictionary<string, object>> 格式,其中:
- 外层键:设备名称(必须与网关中配置的设备名称完全一致)
- 内层键:变量名称(必须与设备中配置的变量名称完全一致)
- 内层值:要写入的变量值(支持字符串、数字、布尔值等类型)
请求示例
{
"modbusDevice1": {
"temperature": 25.5,
"humidity": 60,
"status": true
},
"opcuaDevice1": {
"pressure": 1013.25,
"flow": 10.5
}
}
HTTP 请求示例
使用 curl 命令
curl -X POST "http://localhost:5000/openApi/control/writeVariables" \
-H "Content-Type: application/json" \
-d '{
"modbusDevice1": {
"temperature": 25.5,
"humidity": 60
}
}'
使用 Python 请求
import requests
import json
url = "http://localhost:5000/openApi/control/writeVariables"
headers = {"Content-Type": "application/json"}
data = {
"modbusDevice1": {
"temperature": 25.5,
"humidity": 60
}
}
response = requests.post(url, headers=headers, json=data)
print(response.status_code)
print(response.json())
使用 C# 请求
using System; using System.Net.Http; using System.Text; using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
using var client = new HttpClient();
var url = "http://localhost:5000/openApi/control/writeVariables";
var data = @"{
""modbusDevice1"": {
""temperature"": 25.5,
""humidity"": 60
}
}";
var content = new StringContent(data, Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
Console.WriteLine($"Status Code: {response.StatusCode}");
Console.WriteLine($"Response: {await response.Content.ReadAsStringAsync()}");
}
}
响应格式
成功响应
{
{
"code": 0,
"data": {
"additionalProp1": {
"additionalProp1": {
"operCode": 0,
"isSuccess": true,
"errorMessage": "string"
},
"additionalProp2": {
"operCode": 0,
"isSuccess": true,
"errorMessage": "string"
},
"additionalProp3": {
"operCode": 0,
"isSuccess": true,
"errorMessage": "string"
}
},
"additionalProp2": {
"additionalProp1": {
"operCode": 0,
"isSuccess": true,
"errorMessage": "string"
},
"additionalProp2": {
"operCode": 0,
"isSuccess": true,
"errorMessage": "string"
},
"additionalProp3": {
"operCode": 0,
"isSuccess": true,
"errorMessage": "string"
}
},
"additionalProp3": {
"additionalProp1": {
"operCode": 0,
"isSuccess": true,
"errorMessage": "string"
},
"additionalProp2": {
"operCode": 0,
"isSuccess": true,
"errorMessage": "string"
},
"additionalProp3": {
"operCode": 0,
"isSuccess": true,
"errorMessage": "string"
}
}
},
"msg": "string",
"time": "2026-02-03T13:21:39.602Z"
}
}
失败响应
{
"code": 0,
"data": null,
"msg": "设备不存在"
"time": "2026-02-03T13:21:39.602Z"
}
MQTT RPC
概述
MQTT RPC 是通过 MQTT 协议实现的远程过程调用功能,允许客户端设备通过 MQTT 消息发送控制命令来写入变量值。该功能为物联网设备提供了远程控制能力,适用于需要低带宽、可靠通信的场景。
工作原理
- 客户端发送:MQTT 客户端向指定主题发送包含控制命令的消息
- 网关接收:ThingsGateway 接收消息并解析控制命令
- 执行写入:网关根据命令执行变量写入操作
- 响应反馈:网关将执行结果通过 MQTT 消息返回给客户端
主题配置
请求主题
默认的 MQTT RPC 请求主题格式为:
{RpcWriteTopic}/{requestId}
其中:
RpcWriteTopic:在 MqttClient 插件配置中设置的 RPC 写入主题前缀requestId:请求的唯一标识,通常为 GUID
响应主题
响应主题自动生成,格式为:
{RpcWriteTopic}/{requestId}/Response
消息格式
请求消息
请求消息使用 JSON 格式,结构如下:
{
"device1": {
"variable1": "value1",
"variable2": "value2"
},
"device2": {
"variable3": "value3"
}
}
- 外层键:设备名称
- 内层键:变量名称
- 内层值:要写入的变量值
响应消息
响应消息包含操作结果:
{
"device1": {
"variable1": {
"OperCode": 0,
"IsSuccess": true,
"ErrorMessage": null,
"ErrorType": null
},
"variable2": {
"OperCode": 0,
"IsSuccess": true,
"ErrorMessage": null,
"ErrorType": null
}
},
"device2": {
"variable3": {
"OperCode": 0,
"IsSuccess": true,
"ErrorMessage": null,
"ErrorType": null
}
}
}
客户端实现示例
使用 Python paho-mqtt 库
import paho.mqtt.client as mqtt
import json
import uuid
# 配置
broker_address = "localhost"
broker_port = 1883
rpc_topic = "RpcWrite"
client_id = "rpc_client_" + str(uuid.uuid4())
# 生成请求ID
request_id = str(uuid.uuid4())
request_topic = f"{rpc_topic}/{request_id}"
response_topic = f"{rpc_topic}/{request_id}/Response"
# 回调函数
def on_connect(client, userdata, flags, rc):
print(f"Connected with result code {rc}")
client.subscribe(response_topic)
# 发送RPC请求
rpc_request = {
"device1": {
"temperature": 25.5,
"humidity": 60
}
}
client.publish(request_topic, json.dumps(rpc_request))
print(f"Sent RPC request to {request_topic}")
def on_message(client, userdata, msg):
print(f"Received response on {msg.topic}: {msg.payload.decode()}")
client.disconnect()
# 创建客户端
client = mqtt.Client(client_id)
client.on_connect = on_connect
client.on_message = on_message
# 连接到 broker
client.connect(broker_address, broker_port, 60)
# 开始循环
client.loop_forever()
配置指南
MqttClient 插件配置
| 配置项 | 说明 | 默认值 | 建议值 |
|---|---|---|---|
| 允许 Rpc 写入 | 全局启用/禁用 RPC 写入 | False | 生产环境根据安全需求设置 |
| Rpc 写入主题 | RPC 请求主题前缀 | RpcWrite | 使用有意义的主题名称 |
| QoS 级别 | MQTT 消息的服务质量级别 | AtLeastOnce | 关键控制命令使用 ExactlyOnce |
详细配置参考
更多详细配置和使用说明,请参考 MqttClient 插件文档
Modbus Slave RPC
概述
Modbus Slave RPC 是通过 Modbus 协议实现的远程过程调用功能,允许客户端设备作为 Modbus 主站向 ThingsGateway 发送写入命令来修改变量值。