JSON-RPC远程控制
文章目录
- 🌐 一、什么是 JSON-RPC?
- 📬 二、通信过程
- 1️⃣ 客户端发起请求
- 2️⃣ 服务端处理请求,调用方法,返回结果
- 📑 三、重要字段说明
- 🛠️ 四、核心函数与概念(结合你的代码)
- 📤 客户端发送请求函数(如 `rpc_add`)
- 📥 服务端处理请求函数(如 `add()`)
- 🔁 五、通信流程详解
- 📚 六、常见 JSON-RPC 用法场景
- 🧱 七、常用 JSON-RPC C语言库
- 🧩 八、扩展建议
我们来系统讲解一下 JSON-RPC 协议,包括它的 核心概念、通信过程、重要字段、常用函数/库,并结合你给的示例代码来加深理解。
🌐 一、什么是 JSON-RPC?
JSON-RPC(JSON Remote Procedure Call) 是一种基于 JSON 的远程过程调用协议,它允许你通过网络调用远程系统中的函数/方法。
它具有以下特点:
- 轻量级:只使用 JSON,无需 XML 或复杂的结构。
- 与平台无关:任何支持 JSON 的语言都可实现。
- 双向通信:既可请求调用,也可异步响应。
📬 二、通信过程
JSON-RPC 基于客户端-服务器模式,主要包含以下步骤:
1️⃣ 客户端发起请求
{"jsonrpc": "2.0","method": "add","params": [1, 2],"id": 1
}
2️⃣ 服务端处理请求,调用方法,返回结果
{"jsonrpc": "2.0","result": 3,"id": 1
}
或者若出错,返回:
{"jsonrpc": "2.0","error": {"code": -32601,"message": "Method not found"},"id": 1
}
📑 三、重要字段说明
字段 | 类型 | 说明 |
---|---|---|
jsonrpc | string | 固定值 "2.0" |
method | string | 要调用的远程函数名称 |
params | array/object | 传入参数 |
id | string/int | 客户端提供的 ID,服务端用于关联响应 |
result | 任意类型 | 成功调用返回值(响应中) |
error | object | 调用失败时的错误信息(响应中) |
🛠️ 四、核心函数与概念(结合你的代码)
📤 客户端发送请求函数(如 rpc_add
)
- 构造 JSON 字符串:用
sprintf()
写入 JSON-RPC 格式 - 通过 TCP socket 发送数据
- 接收响应后,用
cJSON_Parse()
解析 JSON
sprintf(buf, "{\"method\": \"add\", \"params\": [%d,%d], \"id\": \"2\" }", a, b);
send(socket, buf, ...);
read(socket, buf, ...);
cJSON *root = cJSON_Parse(buf);
cJSON *result = cJSON_GetObjectItem(root, "result");
📥 服务端处理请求函数(如 add()
)
- 使用 JSON-RPC 库
jrpc_server_init()
初始化服务 - 使用
jrpc_register_procedure()
注册函数名和回调 - 回调函数内部通过
cJSON
提取参数,构造响应 JSON
cJSON *a = cJSON_GetArrayItem(params, 0);
cJSON *b = cJSON_GetArrayItem(params, 1);
return cJSON_CreateNumber(a->valueint + b->valueint);
🔁 五、通信流程详解
假设客户端要调用远程函数 add(2, 3)
:
Client Server│ ││--- JSON 请求(add) -------------->││ {"method": "add", ││ "params": [2,3], "id": 1} ││ ││ 查找方法 add│ 调用函数 add(2,3)│ 构造 JSON 返回值│<-- JSON 响应 --------------------││ {"result": 5, "id": 1} ││ ││ 解析 JSON → 输出结果 │
📚 六、常见 JSON-RPC 用法场景
场景 | 示例 |
---|---|
嵌入式设备远程控制 | 通过 RPC 控制 LED、读取传感器 |
前后端通信 | 浏览器与后端服务使用 JSON-RPC over WebSocket |
自动化测试平台 | 使用 JSON-RPC 调用接口模拟用户行为 |
区块链(如以太坊) | Ethereum 节点之间通信使用 JSON-RPC API |
🧱 七、常用 JSON-RPC C语言库
库名 | 说明 |
---|---|
jsonrpc-c | 你使用的轻量 JSON-RPC C 实现 |
cJSON | 轻量级 JSON 解析/生成库 |
jansson | 更完整的 JSON C 解析库 |
🧩 八、扩展建议
- 加入 JSON-RPC 的 通知模式(即没有
id
) - 增加 错误处理机制(返回 error 字段)
- 加入 方法权限控制(如认证)
- 支持异步调用或多线程并发