TestTCPCommand 测试TCP命令服务器
TestTCPCommand 算子属于线程类算子,用于在 RVS 的分线程中启动一个 TCP server 服务器。
该服务器仅能接收固定的 3 类字符串信息并对应的回复固定字符串。
3 类字符串分别以 3 个命令作为起始值,分别是 test1 、test2 、test3 。
-
客户端发送以命令字符
test1
开始的消息,要求在该test1
命令字符后紧跟command_delimiter + 其他内容 +delimiter
。接收到该信息后,该算子会自动触发右下侧的 test1 端口,进而触发其他后续算子进行运算。对于命令字符
test1
开始的消息访问,服务端对命令字符后续的其他字符内容不做任何处理,并最终统一回复OK
字符串消息。实际使用时,需要将该算子右下侧 test1 端口后续的触发结束信号返还连接到该算子的左侧 test1 端口,因为只有成功触发该端口才会执行 TCP 服务端的消息回复。
客户端发送:
test1 command_delimiter 其他内容 delimiter
服务端回复:
ok
-
客户端发送以命令字符
test2
开始的消息,要求在该test2
命令字符后紧跟command_delimiter+'x y z rx ry rz'+delimiter
。接收到该信息后,服务端会将命令字符后续的 ‘x y z rotated_x rotated_y rotated_z’ 字符内容转换为 6个 float 数值,进而赋值给一个 pose。如果上述字符串消息可以合法转换为 6个 float 则会触发执行该算子右下侧的 test2 端口,并通过算子右下侧的 test2_pose 端口输出所得的 pose ,如果字符串消息不合法,则不进行任何后续响应。
实际使用时,需要将该算子右下侧 test2 端口后续的触发结束信号返还连接到该算子的左侧 test2 端口,因为只有成功触发该端口才会执行 TCP 服务端的消息回复。对于命令字符
test2
开始的消息访问,最终统一回复test2
。客户端发送:
test2 command_delimiter x y z rx ry rz delimiter
算子右侧 test2_pose 端口输出:
x y z rx ry rz
服务端回复:
test2
-
客户端发送以命令字符
test3
开始的消息,要求在该test3
命令字符后紧跟command_delimiter+ 其他内容 +delimiter
。接收到该信息后,该算子会自动触发右下侧的 test3 端口,进而触发其他后续算子进行运算。
实际使用时,需要将该算子右下侧 test3 端口后续的触发结束信号返还连接到该算子的左侧 test3 端口,因为只有成功触发该端口才会执行 TCP 服务端的消息回复。
对于命令字符
test3
开始的消息访问,服务端对命令字符后续的其他字符内容不做任何处理,执行消息回复时,服务端会检查算子左侧的 test3_pose 端口是否被连接。如果该 pose 端口有连接并且数值有效,则会回复该 Pose 数值给客户端,但是如果该 pose 端口没有连接,则会回复空字符串。客户端发送:
test3 command_delimiter 其他内容 delimiter
算子左侧 test3_pose 有连接并且数值有效则端口则服务端回复该 Pose 数值:
x y z rx ry rz
-
任意其他消息,不会作任何响应。
算子参数
-
端口/port
:创建 TCP server 服务器所使用的本机服务端口。说明:实际运行时,如果提示 TCP 服务端创建失败,往往是所选取的端口已经被其他服务所占用,更换端口即可。如果在同一个RVS软件中,创建多个TCP服务端算子,彼此的port也要互斥。
-
连接数量/connections
:可同时支持的最大客户端连接数量。 -
服务器模式/server_mode
:运行模式。-
Once:表示完成一次 TCP 对话以后自动断开同客户端的链接。比如客户端首先同该算子建立了TCP连接,然后第一次发送了 A 字符串消息请求并获得回复之后,继续发送 B 字符串的消息请求,此时就会报错。
-
Continous: 表示客户端建立链接后可以无限次数的对话。
-
-
分隔符/delimiter
:消息结束符,包含RT 换行符、“;”、“#”、“$”。当选择了其中某一种时,另外三种就会被视作普通字符随意使用 。服务端在接收客户端发送的消息时,会捕获第一个消息结束符之前的所有消息。说明:由于不同的通信软件、电脑系统软件、机器人操作系统软件对回车换行的定义不一致,容易导致信息发送或者接收失败,所以一般不建议选择RT作为消息结束符。
-
命令分隔符/command_delimiter
:命令结束符。当选择了其中某一种时,另外一种就会被视作普通字符随意使用。服务端在接收客户端发送的消息时,会将第一个命令结束符之前的所有消息视为命令字符,之后的消息视为内容信息。如果命令字符不是上 test1 、test2 、test3 中的任意一个,则是无效命令,不做任何后续处理与响应。-
Space:空格。
-
, :逗号。
-
-
回复结束符/arc_eof
:回传值结束符。当输入该值时,在回传值结尾添加结束符。默认为空。 -
test2_pose
:设置通过 test2 命令消息接收到的 pose 可视化属性。-
打开 pose 可视化。
-
关闭 pose 可视化。
-
设置坐标的尺寸大小 。取值范围:[0.001,10] 。默认值:0.1 。
注意:在算子运行后,重新更改了 port 、connections 、server_mode 、delimiter 、command_delimiter 5个属性中的任意一个之后,如果需要生效,都必须重启 RVS 。
-
控制信号输入输出
输入:
-
start
:-
触发start信号端口运行算子,开始创建 TCP 服务端,创建成功后监听服务端口并等待客户端访问。
说明:本算子仅需要初始化运行一次即可。
-
-
stop
:-
触发 stop 信号端口后,开始停止 TCP 服务端的监听。
-
-
reset
:-
该功能保留。
-
-
finished
:-
该功能保留。
-
-
failed
:-
算子运行失败后触发该端口。
-
-
started
:-
算子成功建立 TCP 服务端后触发该端口。
-
-
processing
:-
该功能保留。
-
-
stopped
:-
算子成功停止 TCP 服务端的监听后触发该端口。
-
-
reset
:-
该功能保留。
-
功能演示
下面分别针对test1 、test2 、test3 三类命令,进行通讯演示。
在选用演示所用的 TCP 客户端时,由于 RVS 自带的 CommonTCPClient 算子在使用时要求服务端返回的信息必须以四类固定字符结尾,而 TestTCPCommand 算子在作为 TCP 的服务端时,返回给 TCP Client 的信息是固定的并且没有额外添加上述四类固定结尾字符,所以这里不再选用 CommonTCPClient 算子作为客户端。
说明:这里的演示案例是基于 ubuntu系统给出的,使用了"echo + nc "的指令方式实现TCP客户端的功能;如果是在 Windows 版本,建议使用通讯助手等工具。
步骤1:算子准备
右击创建新 Group ,添加 Trigger 、TestTCPCommand 算子至 Group 算子图。
步骤2:设置算子参数
-
设置 Trigger 算子参数:
-
算子名称 → InitTrigger
-
类型 → InitTrigger
-
-
设置 TestTCPCommand 算子参数:
-
分隔符 → ;
-
其余参数保持默认值。
-
步骤3:连接算子
TestTCPCommand算子选用了 “echo + nc” 的指令方式,所以这里每发送-接收一次消息后都要断开连接,所以选择了Once模式。
步骤4:运行
点击配置日志通道显示按钮设置对于所有通道安全级别为 debug 级别。点击 RVS 软件的运行按钮。
运行结果
-
TestTCPCommand 算子会被 Trigger 算子自动触发,并变为蓝色。
-
日志栏同时打印算子运行说明如下图所示,表示TCP的服务端已经建立完毕。
-
-
重新打开一个终端,输入命令 echo “test1 ;” | nc localhost 2013 并单击回车键。
echo "test1 ;" | nc localhost 2013
-
运行结束后,我们会在这个终端窗口看到回复字符串 ”OK“ 如下图所示,同时RVS的运行日志如下。
-
-
在终端中,继续输入命令 echo “test2 0.1 0.2 0.1 3.14159 1.5709 1;” | nc localhost 2013并单击回车键。运行结束后,我们会在这个终端窗口看到回复字符串”test2“如下图所示。
echo "test2 0.1 0.2 0.1 3.14159 1.5709 1;" | nc localhost 2013
-
RVS的运行日志如下。
-
-
在终端中,继续输入命令 echo “test3 ;” | nc localhost 2013 并单击回车键,运行结束后,我们会在这个终端窗口看到回复字符串 ”0.1 0.2 0.1 3.14159 1.5709 1“ 如下图所示。
echo "test3 ;" | nc localhost 2013
-
同时RVS的运行日志如下
-