TestTCPCommand 测试TCP命令服务器

TestTCPCommand 算子介绍视频教程

TestTCPCommand 算子属于线程类算子,用于在 RVS 的分线程中启动一个 TCP server 服务器。

该服务器仅能接收固定的 3 类字符串信息并对应的回复固定字符串。

3 类字符串分别以 3 个命令作为起始值,分别是 test1 、test2 、test3 。

  1. 客户端发送以命令字符 test1 开始的消息,要求在该 test1 命令字符后紧跟 command_delimiter +  其他内容 +delimiter 。接收到该信息后,该算子会自动触发右下侧的 test1 端口,进而触发其他后续算子进行运算。

    对于命令字符 test1 开始的消息访问,服务端对命令字符后续的其他字符内容不做任何处理,并最终统一回复 OK 字符串消息。

    实际使用时,需要将该算子右下侧 test1 端口后续的触发结束信号返还连接到该算子的左侧 test1 端口,因为只有成功触发该端口才会执行 TCP 服务端的消息回复。

    客户端发送:

    test1  command_delimiter   其他内容  delimiter
    

    服务端回复:

    ok
    
  2. 客户端发送以命令字符 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
    
  3. 客户端发送以命令字符 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
    
  4. 任意其他消息,不会作任何响应。

算子参数

  • 端口/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 可视化属性。

    • icon_visOn 打开 pose 可视化。

    • icon_visOff 关闭 pose 可视化。

    • icon_size 设置坐标的尺寸大小 。取值范围:[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:设置算子参数

  1. 设置 Trigger 算子参数:

    • 算子名称 → InitTrigger

    • 类型 → InitTrigger

  2. 设置 TestTCPCommand 算子参数:

    • 分隔符 → ;

    • 其余参数保持默认值。

步骤3:连接算子

TestTCPCommand算子选用了 “echo + nc” 的指令方式,所以这里每发送-接收一次消息后都要断开连接,所以选择了Once模式。

Communication_TestTCPCommand_nodes

步骤4:运行

点击配置日志通道显示按钮设置对于所有通道安全级别为 debug 级别。点击 RVS 软件的运行按钮。

运行结果

  1. TestTCPCommand 算子会被 Trigger 算子自动触发,并变为蓝色。

    Communication_TestTCPCommand_result1

    • 日志栏同时打印算子运行说明如下图所示,表示TCP的服务端已经建立完毕。

      Communication_TestTCPCommand_result2

  2. 重新打开一个终端,输入命令 echo “test1 ;” | nc localhost 2013 并单击回车键。

    echo "test1 ;" | nc localhost 2013 
    

    Communication_TestTCPCommand_result3

    • 运行结束后,我们会在这个终端窗口看到回复字符串 ”OK“ 如下图所示,同时RVS的运行日志如下。

      Communication_TestTCPCommand_result4

  3. 在终端中,继续输入命令 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
    

    Communication_TestTCPCommand_result5

    • RVS的运行日志如下。

      Communication_TestTCPCommand_result6

  4. 在终端中,继续输入命令 echo “test3 ;” | nc localhost 2013 并单击回车键,运行结束后,我们会在这个终端窗口看到回复字符串 ”0.1 0.2 0.1 3.14159 1.5709 1“ 如下图所示。

    echo "test3 ;" | nc localhost 2013
    

    Communication_TestTCPCommand_result7

    • 同时RVS的运行日志如下

      Communication_TestTCPCommand_result8