JSON-RPC远程控制

发布于:2025-04-21 ⋅ 阅读:(23) ⋅ 点赞:(0)


我们来系统讲解一下 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 字段)
  • 加入 方法权限控制(如认证)
  • 支持异步调用或多线程并发


网站公告

今日签到

点亮在社区的每一天
去签到