跳到主要内容

RPC反写

WEBAPI

概述

WEBAPI 是 ThingsGateway 提供的 HTTP 接口,用于通过网络远程写入设备变量值。该接口支持标准的 RESTful 风格,可被各种编程语言和工具调用。

接口地址

请求参数

基本格式

请求参数为 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 消息发送控制命令来写入变量值。该功能为物联网设备提供了远程控制能力,适用于需要低带宽、可靠通信的场景。

工作原理

  1. 客户端发送:MQTT 客户端向指定主题发送包含控制命令的消息
  2. 网关接收:ThingsGateway 接收消息并解析控制命令
  3. 执行写入:网关根据命令执行变量写入操作
  4. 响应反馈:网关将执行结果通过 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 发送写入命令来修改变量值。

工作原理

  1. 客户端连接:Modbus 主站客户端连接到 ThingsGateway 的 Modbus Slave 服务
  2. 发送写入命令:客户端发送 Modbus 写入命令(如 0x06 写入单个寄存器、0x10 写入多个寄存器)
  3. 执行写入:ThingsGateway 接收并解析写入命令,执行变量值修改
  4. 返回响应:ThingsGateway 返回写入操作的执行结果

配置指南

Modbus Slave 插件配置

配置项说明默认值建议值
端口Modbus Slave 服务监听端口502标准 Modbus 端口
地址范围变量地址范围配置-根据实际变量数量设置
允许写入是否允许客户端写入操作True生产环境根据安全需求设置
站号Modbus 站号1与客户端配置一致

变量配置

配置项说明默认值建议值
寄存器地址Modbus 寄存器地址-唯一标识变量的地址
数据类型变量数据类型Int16根据变量实际类型选择
访问类型变量访问权限ReadWrite只读变量设置为 ReadOnly

客户端示例

使用 Python pymodbus 库

from pymodbus.client import ModbusTcpClient

# 配置
client = ModbusTcpClient('localhost', port=502)

# 连接
client.connect()

# 写入单个寄存器(功能码 0x06)
result = client.write_register(0, 100, slave=1)
print(f"Write result: {result}")

# 写入多个寄存器(功能码 0x10)
values = [200, 300, 400]
result = client.write_registers(1, values, slave=1)
print(f"Write multiple result: {result}")

# 断开连接
client.close()

详细配置参考

更多详细配置和使用说明,请参考 Modbus 插件文档

OPC UA Server RPC

概述

OPC UA Server RPC 是通过 OPC UA 协议实现的远程过程调用功能,允许 OPC UA 客户端向 ThingsGateway 发送写入命令来修改变量值。OPC UA 是工业自动化领域的标准协议,提供了安全、可靠的通信机制。

工作原理

  1. 客户端连接:OPC UA 客户端连接到 ThingsGateway 的 OPC UA Server 服务
  2. 浏览节点:客户端浏览 OPC UA 地址空间,找到目标变量节点
  3. 发送写入命令:客户端向目标变量节点发送写入请求
  4. 执行写入:ThingsGateway 接收并处理写入请求,执行变量值修改
  5. 返回响应:ThingsGateway 返回写入操作的执行结果

配置指南

OPC UA Server 插件配置

配置项说明默认值建议值
端口OPC UA Server 服务监听端口4840标准 OPC UA 端口
应用名称OPC UA 应用名称ThingsGateway唯一标识应用
安全策略安全策略配置None生产环境建议使用 Basic256Sha256
允许匿名访问是否允许匿名连接True生产环境建议禁用

客户端示例

使用 Python opcua 库

from opcua import Client

# 连接到 OPC UA Server
client = Client("opc.tcp://localhost:4840")
client.connect()

# 获取根节点
root = client.get_root_node()

# 浏览对象节点
objects = root.get_child(["0:Objects"])

# 查找设备节点
device_node = objects.get_child(["2:Devices", "2:Device1"])

# 查找变量节点
temperature_node = device_node.get_child(["2:temperature"])

# 写入变量值
temperature_node.set_value(25.5)
print(f"Write value: 25.5")

# 断开连接
client.disconnect()

详细配置参考

更多详细配置和使用说明,请参考 OPC UA 插件文档

规则引擎 RPC

概述

规则引擎 RPC 是通过 ThingsGateway 的规则引擎实现的远程过程调用功能,允许用户通过自定义脚本实现复杂的业务逻辑,并在满足特定条件时执行变量写入操作。

工作原理

  1. 规则配置:在规则引擎中配置触发条件和执行动作
  2. 条件触发:当满足触发条件时,规则引擎执行对应的动作
  3. 脚本执行:执行用户自定义的脚本,实现数据处理和业务逻辑
  4. 变量写入:脚本中调用写入函数,修改目标变量的值

配置指南

规则引擎配置

  1. 创建规则:在规则引擎中创建新规则
  2. 配置触发条件:设置规则的触发条件(如时间触发、数据变化触发)
  3. 配置执行动作:选择 "执行RPC" 动作