JSON-RPC协议说明

简介

JSON-RPC(JavaScript Object Notation Remote Procedure Call)是一种远程过程调用协议。它使用 JSON 作为数据格式,可以通过 TCP Socket、HTTP、WebSocket 等传输协议来进行客户端和服务器之间的通信。

JSON-RPC 具有以下特性:

  • 简易性:以 JSON 作为数据交换格式,简洁、易理解和易解析。
  • 轻量级:使用基于文本的 JSON 格式进行数据交换,数据和协议结构简单,网络传输数据量小、速度快、性能高。
  • 跨语言和跨平台:JSON-RPC 支持多种编程语言(如 C++、Python 等)和不同平台之间的通信。
  • 支持多种传输协议:JSON-RPC 可以使用多种传输协议进行数据传输,如 HTTP、TCP Socket、WebSocket等,适用于多种网络环境。
  • 错误处理:JSON-RPC 定义了错误对象和错误码的规范,客户端可以根据服务器返回的错误信息来调试和处理问题。

JSON-RPC 采用请求-响应的方式来实现客户端和服务器之间的远程过程调用。客户端发送 JSON 格式请求给服务器,例如 {”jsonrpc“:"2.0","method":"getRobotNames","params":[],"id":1}。服务器接收到请求后,解析 JSON 对象,提取 “method” 、“params" 和 ”id“ 等字段的值。服务器执行与 "method" 对应的方法,并使用提供的参数。根据执行结果,服务器会生成一个响应对象并将响应对象序列化成 JSON 格式,例如 {"id":1,"jsonrpc":"2.0","result":["rob1"]},然后将 JSON 格式的响应发送给客户端。最后,客户端接收到服务器发送的响应。

支持的传输协议与端口号

AUBO SDK 中的 RPC 功能模块支持 TCP Socket、HTTP 和 WebSocket 传输协议,其对应的端口号如下:

协议 端口号
TCP Socket 30004
HTTP 9012
WebSocket 9012

JSON-RPC 2.0 规范

请求对象

RPC 请求对象包含以下成员:

  • jsonrpc:表示JSON-RPC协议的版本号,必须是2.0
  • method:表示被调用的方法名称,是一个字符串
  • params:表示参数值,是一个结构化的值
  • id:标识符

响应对象

这里有 RPC 调用成功和 RPC 调用失败两种情况:

  1. 当 RPC 调用成功时,RPC 响应对象包含以下成员:

    • jsonrpc:表示JSON-RPC协议的版本号,必须是2.0
    • result:表示函数被执行的返回值
    • id:表示标识符,与请求对象的标识符一定相同
  2. 当 RPC 调用出现错误时,RPC 响应对象包含以下成员:

    • jsonrpc:表示JSON-RPC协议的版本号,必须是2.0
    • error:表示错误对象,错误对象包含以下成员
      • code 表示错误码
      • message 表示简短的错误描述
      • data表示错误的附加信息,可能被忽略。
    • id:表示标识符,与请求对象的标识符一定相同

    错误对象的错误码如下表所示:

错误码 消息 说明
-32700 Parse error. 服务器接收到无效的JSON。在服务器解析时JSON文本时发生错误。
-32600 Invalid Request. 发送的JSON不是有效的请求对象
-32601 Method not found. 该方法不存在/不可用。
32602 Invalid params. 无效的方法参数。
-32603 Internal error. JSON-RPC 内部错误。
-32099..-32000 Server error. 保留用于实现定义的服务器错误。

示例

用python编写的websocket协议传输示例如下:

localhost 是 机器人IP地址

import json
import websocket

# WebSocket 服务器的地址
server_address = "ws://localhost:9012"

# 创建 WebSocket 连接
ws = websocket.create_connection(server_address)

# 构造 JSON-RPC 请求
request = {
    "jsonrpc": "2.0",
    "method": "getRobotNames",
    "params": [],
    "id": 1
}

# 将请求转换为 JSON 字符串
request_json = json.dumps(request)

# 发送请求
ws.send(request_json)

# 接收响应
response_json = ws.recv()

# 解析响应
response = json.loads(response_json)

print("Received Response:", response)

# 关闭 WebSocket 连接
ws.close()

程序运行结果:

Received Response: {'id': 1, 'jsonrpc': '2.0', 'result': ['rob1']}

results matching ""

    No results matching ""