跳转至

接口协议

说明

RobotStudio提供RPC接口的接口说明文件,使用者可利用说明文件自行生成对应的Client端代码并进行调用。接下来的文档中以Python语言为例进行代码说明,其它语言可自行实现

proto版本

使用proto3

1
syntax = "proto3";

请求

参数

所有接口的请求参数有且只有一个字符串

1
2
3
message Request {
    string message = 1;
}

在实际调用接口时,根据接口的不同构造不同的请求JSON,把JSON格式化成字符串进行请求。

例子

某个接口的请求参数有三个分别是字符串s,整数i,浮点数f和布尔型b,则构造请求JSON

1
2
3
4
5
6
{
    "s" : "i am a string",
    "i": 666,
    "f": 66.66,
    "b": true
}

然后将该JSON转为字符串进行RPC调用

1
2
3
4
5
6
7
8
9
import json
j = {
    "s" : "i am a string",
    "i": 666,
    "f": 66.66,
    "b": true
}
s = json.loads(j)
...

响应

参数

所有接口的响应参数有且只有一个字符串

1
2
3
message Response {
    string reply = 1;
}

协议

所有接口的响应参数字符串都是由一个格式固定的JSON对象转换

1
2
3
4
5
{
    code: 0
    msg: "",
    data: ""
}

其中code是整数,0表示接口调用成功;非0时表示调用异常,code表示具体的错误码,由RPC Server端定义

msg是错误信息,当code等于0时msg应该为空,当code不等于0时msg返回人类可读的错误说明

data是数据,当code不等于0时data应该为空,当code等于0时data返回具体的数据,data类型由RPC Server端根据需要决定

code msg data
0 null data
其它 msg null

Attention

下表中的返回值是转换为字符串之前的JSON,返回时需转为字符串返回

接口 返回值 返回值说明
调用接口获取当前机器人索引 {code: 0, msg: "", data: 1} 调用成功,当前机器人的索引是1
调用接口获取当前机器人索引 {code: -1, msg: "读取配置文件失败", data: ""} 调用失败,失败原因是读取配置文件失败
调用接口获取所有工件名称 {code: 0, msg: "", data: ["wobj1","wobj2"]} 调用成功,所有工件名称见data
调用接口获取当前配置信息 {code: 0, msg: "", data: {"busconfig": "/root/busConfig.ini", "projectName": "testProject", "projectCount": 8}} 调用成功

Server例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import json
from concurrent import futures
import grpc
import robot_pb2
import robot_pb2_grpc


class RobotService(robot_pb2_grpc.RobotServiceServicer):
    def HelloWorld(self, request, context):
        data = json.loads(request.data or "{}")
        resp_str = json.dumps({
            "code": 0,
            "msg": "",
            "data": f"hello {data}"
        })
        return robot_pb2.Response(data=resp_str)


def run_rpc_server():
    """
    启动RPC Server
    :return:
    """
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    robot_pb2_grpc.add_RobotServiceServicer_to_server(RobotService(), server)
    server.add_insecure_port("0.0.0.0:50051")
    server.start()
    server.wait_for_termination()


if __name__ == '__main__':
    run_rpc_server()

Client例子

以下代码分别演示了请求参数为整数6,字符串world和对象{"name": "world"}的请求

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import json
import grpc

from robot_python.grpc import robot_pb2
from robot_python.grpc import robot_pb2_grpc

if __name__ == '__main__':
    channel = grpc.insecure_channel("localhost:50051")
    stub = robot_pb2_grpc.RobotServiceStub(channel)
    print(stub.HelloWorld(robot_pb2.Request(data=json.dumps(666))).data)
    print(stub.HelloWorld(robot_pb2.Request(data=json.dumps("world"))).data)
    print(stub.HelloWorld(robot_pb2.Request(data=json.dumps({"name": "world"}))).data)

打印结果为

1
2
3
{"code": 0, "msg": "", "data": "hello 666"}
{"code": 0, "msg": "", "data": "hello world"}
{"code": 0, "msg": "", "data": "hello {'name': 'world'}"}