接口协议
说明
RobotStudio提供RPC接口的接口说明文件,使用者可利用说明文件自行生成对应的Client端代码并进行调用。接下来的文档中以Python语言为例进行代码说明,其它语言可自行实现
proto版本
使用proto3
请求
参数
所有接口的请求参数有且只有一个字符串
| message Request {
string message = 1;
}
|
在实际调用接口时,根据接口的不同构造不同的请求JSON,把JSON格式化成字符串进行请求。
例子
某个接口的请求参数有三个分别是字符串s,整数i,浮点数f和布尔型b,则构造请求JSON
| {
"s" : "i am a string",
"i": 666,
"f": 66.66,
"b": true
}
|
然后将该JSON转为字符串进行RPC调用
| import json
j = {
"s" : "i am a string",
"i": 666,
"f": 66.66,
"b": true
}
s = json.loads(j)
...
|
响应
参数
所有接口的响应参数有且只有一个字符串
| message Response {
string reply = 1;
}
|
协议
所有接口的响应参数字符串都是由一个格式固定的JSON对象转换
| {
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)
|
打印结果为
| {"code": 0, "msg": "", "data": "hello 666"}
{"code": 0, "msg": "", "data": "hello world"}
{"code": 0, "msg": "", "data": "hello {'name': 'world'}"}
|