TCPServerConnectionResource TCP服务器连接资源

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

通过添加TCP服务器连接资源,使用 RVS 中 TCPServerReceive 算子(TCP服务器接收) 和 TCPServerSend 算子(TCP服务器发送) 来获取TCP服务器收到的消息 或 通过TCP服务器给已连接的客户端发出消息

算子参数

  • 自动启动/auto_start:用于自动开启资源算子。

    • 是/True:打开 RVS 软件后第一次进入运行状态时自动开启资源线程。

    • 否/False:不自动开启资源线程。

  • 启动/start:用于开启资源算子。

    • 是/True:勾选为是,开启资源线程。

    • 否/False:不启动资源线程。

  • 停止/stop:用于停止资源算子。

    • 是/True:勾选为是,停止资源线程。

    • 否/False:不停止资源线程。

  • 重置/reset:重置该资源。在该资源算子已经运行后,如果重新更改属性参数,需要点击重置,然后重新勾选 启动 运行。

  • 端口/port:服务器监听的端口号。默认:7000

功能演示

下面有两个简单的样例演示,以帮助用户了解在 RVS 中如何通过 TCP 服务器连接资源进行收发信息:

  • 演示一 :接收字符串并回复(可学习通讯指令和自定义格式的用法)。

  • 演示二 :接收两组不同 Pose 并回复 PoseList(可学习其他数据类型和分隔符用法)。

演示一 接收字符串并回复

通过这个示例,学习如何接收具有特定开头的字符串信息,并将其中信息添加后缀内容自动回复给客户端。

步骤1:添加TCP通讯所需算子

添加 TCPServerConnectionResource 、TCPServerReceive 、TCPServerSend 算子至算子图。

TCPServerConnectionResource_demo1_01

步骤2:配置算子参数

  1. 设置 TCPServerConnectionResource 算子参数:

    • 自动启动 → 是

  2. 设置 TCPServerReceive 算子面板:

    TCPServerConnectionResource_demo1_02

    号添加一条接收触发指令:

    TCPServerConnectionResource_demo1_03

    • 启用 → 开启(默认)

    • 指令 → hello

    • 指令分隔符 → Space

    • 包含数据 → String

    • 数据分隔符→(在 string 类型下无用)

    • 后缀 → (不填写)

    • 备注 → 接收hello(可不填)

      TCPServerConnectionResource_demo1_04

      点击应用,算子端口同步变化。

      TCPServerConnectionResource_demo1_05

  3. 设置 TCPServeSend 算子面板:

    TCPServerConnectionResource_demo1_06

    号添加一条发送指令

    TCPServerConnectionResource_demo1_07

    • 启用 → 开启(默认)

    • 端口名 → reply

    • 数据类型 → String

    • 前缀 → (不填写)

    • 数据分隔符→(在string类型下无用)

    • 后缀 → Yes!(前面有个空格)

    • 是否列表 → 关闭(默认)

    • 列表分隔符→(在”是否列表”为”关闭”的情况下无用)

    • 备注 → 回复Yes!(可不填)

    TCPServerConnectionResource_demo1_08

    点击应用,算子端口同步变化

    TCPServerConnectionResource_demo1_09

步骤3:连接算子

TCPServerConnectionResource_demo1_10

步骤4:运行

  1. 启动RVS,TCP服务器连接资源算子变蓝色,如果未变色,勾选该资源算子的启动,或查看日志启动失败的原因。

    TCPServerConnectionResource_demo1_11

  2. 此处使用网络调试助手充当客户端演示通讯过程,远程地址填写本机IP,端口与资源算子端口号相同。

    TCPServerConnectionResource_demo1_12

  3. 调试助手连接到服务器资源,RVS日志显示连接信息。

    TCPServerConnectionResource_demo1_13

  4. 调试助手发送hello(空格)+[消息内容]的字符串,触发 TCPServerReceive 算子的 hello 命令,RVS 收到内容后传递给 TCPServerSend 算子,回复给调试助手。

    TCPServerConnectionResource_demo1_14

  5. 查看 TCP 服务器接收面板,更新面板后,可看到这个算子的活动信息,TCP服务器发送面板同理。

    TCPServerConnectionResource_demo1_16

    TCPServerConnectionResource_demo1_17

  6. 查看数据线,内容为 TCP 通讯接收到的消息,日志栏显示收发记录。

    TCPServerConnectionResource_demo1_18

    TCPServerConnectionResource_demo1_15

  7. 重复第4步,但发送不同的消息,再次查看。

    TCPServerConnectionResource_demo1_19

    TCPServerConnectionResource_demo1_20

    TCPServerConnectionResource_demo1_21

  8. 断开TCP连接,日志栏显示客户端断开。

    TCPServerConnectionResource_demo1_22

说明

在这个演示demo中,用 TCPServerConnectionResource 算子创建了一个监听 7000 端口的 TCP 服务器,用TCPServerReceive算子接收所有用 “hello(空格)” 为开头指令的 TCP 消息,并把消息通过 TCPServerSend 算子发出,发送格式为消息内容加后缀 “(空格)Yes!”,发出的消息通过 TCPServerConnectionResource 给到已连接到的客户端。

演示二 接收两组不同Pose并回复PoseList

通过这个演示,学习如何通过 TCP 通讯把收到的字符串处理为其他的数据类型,以及分隔符的用法。

步骤1:添加TCP通讯所需算子

添加 TCPServerConnectionResource、TCPServerReceive、waitAllTriggers、Join、TCPServerSend 算子至算子图。

TCPServerConnectionResource_demo2_01

步骤2:配置算子参数

  1. 设置 TCPServerConnectionResource 算子参数:

    • 自动启动 → 是

  2. 设置 Join 算子参数

    • 类型 → 坐标

    • 输入数量 → 2

  3. 设置 TCPServerReceive 算子面板:

    号添加一条接收触发指令

    • 启用 → 开启(默认)

    • 指令 → setPose1

    • 指令分隔符 → NONE(默认)

    • 包含数据 → Pose

    • 数据分隔符 → ,(逗号)

    • 后缀 → (什么都不填)

    • 备注 → 接收pose(可不填)

    号添加一条接收触发指令

    • 启用 → 开启(默认)

    • 指令 → setPose2

    • 指令分隔符 → !

    • 包含数据 → Pose

    • 数据分隔符 → $

    • 后缀 → #

    • 备注 → 接收另一个pose(可不填)

    TCPServerConnectionResource_demo2_02 点击应用

  4. 设置 TCPServeSend 算子面板:

    按➕号添加一条发送指令

    • 启用 → 开启(默认)

    • 端口名 → poseLIst

    • 数据类型 → Pose

    • 前缀 → list:

    • 数据分隔符 → -(减号)

    • 后缀 → over

    • 是否列表 → 开启

    • 列表分隔符 → ;(分号)

    • 备注 → 发送PoseList(可不填)

    TCPServerConnectionResource_demo2_03

    点击应用

    TCPServerConnectionResource_demo2_04

步骤3:连接算子

TCPServerConnectionResource_demo2_05

步骤4:运行

  1. 启动RVS,TCP 服务器连接资源算子变蓝色,如果未变色,勾选该资源算子的启动,或查看日志启动失败的原因。

  2. 调试助手连接到服务器资源,发送第一个Pose信息,命令关键字为 setPose1,区分大小写,命令分隔符为NONE,即命令后直接跟随Pose数据,数据之间的分隔符为,,没有后缀

    setPose111,22,33,0.1,0.2,0.3

    TCPServerConnectionResource_demo2_06

  3. 发送第二个Pose信息,命令关键字为setPose2,区分大小写,命令分隔符为!,即命令后添加!再跟入 Pose 数据,数据之间的分隔符为$,最后添加后缀#

    setPose2!44.4$55.5$66.6$0.4$0.5$0.6#

    TCPServerConnectionResource_demo2_07

  4. 此时两个 pose 数据均已发出,WaitAllTriggers 算子执行后将两个 pose 合并成 poseList ,通过 TCPServerSend 算子发出,客户端收到合并的数据,数据使用”list:”开头,跟随一串Pose值,数据间使用”-”分割,Pose和Pose之间使用”;”分割,最后用预设的后缀”over”结尾

    list:11.0000-22.0000-33.0000-0.1000-0.2000-0.3000;44.4000-55.5000-66.6000-0.4000-0.5000-0.6000over

5.查看接收和发送面板,以及RVS日志信息,了解此次收发运行细节。

TCPServerConnectionResource_demo2_08

TCPServerConnectionResource_demo2_09

TCPServerConnectionResource_demo2_10

TCPServerConnectionResource_demo2_11

其他设定/技巧

  1. 不包含数据的外部触发

    接收算子的包含数据设为 NONE,将不在有输出的数据端口,当 TCP 服务器收到的消息与设定的命令一致时,即可触发该信号端口。利用这个特点可以实现通过 TCP 客户端远程触发 RVS 的业务流程。

    TCPServerConnectionResource_08

  2. 指令字符串/端口名

    接收算子的端口名和设定的指令字符串始终一致,因此不能使用会被 RVS 中英翻译的字符串为指令名(例如trigger、TyCameraAccess等),发送算子的端口名同理

    TCPServerConnectionResource_03

    当指令使用字符或数字开头时,端口名会生效,但属性面板将不显示该输出端口属性,日志会报错”……这个名称包含了无效的XML元素名称……”,这个情况下并不影响 RVS 的通讯运行,可以正常使用

    TCPServerConnectionResource_02

  3. 发送算子string端口悬空

    对于TCPServerSend算子,当数据类型为String,且未勾选是否列表时,它的数据端口可以不接入任何数据线,默认输入的数据未空字符串,当被触发时,将会按设定的发送格式发出前缀+后缀的内容。利用这个特性,可以发送固定内容的字符串信息,而不用额外的 EmitString 算子去生成所需信息并发送

    TCPServerConnectionResource_04

    TCPServerConnectionResource_05

  4. 收发独立

    TCPServerReceiveTCPServerSend两个算子拆分的设计,RVS 的 TCP 服务器将不再局限于收发回复的工作模式,在运行期间始终可以接收符合指令设定的字符串信息,同时也可在任意时刻触发发送指令给客户端发送消息。可以只收不发,也能只发不收。

    TCPServerConnectionResource_06

  5. 多客户端广播

    TCPServerConnectionResource不限定接入客户端的数量,开放端口但不定IP的设计允许不同网段的设备同时连接到 RVS 的 TCP 服务器,所有已连接的客户端都可以用正确的通讯指令触发对应的接收算子。

    TCPServerConnectionResource_07

    发送算子也采用像”广播”一样的发送模式,对于所有连接到的客户端,都会收到该 TCP 服务器发出的消息。 如果期望单个发送算子仅对单个特定客户端通讯,请考虑使用多个TCPServerConnectionResource资源算子,通过不同的端口号进行服务区分,发送算子和单独的客户端只使用对应的资源算子即可。

  6. 多收发算子公用资源

    TCPServerReceiveTCPServerSend 算子在算子图中并不限制使用数量,对于较多的通讯指令(一般由业务复杂导致),可以拆分给多个收发算子分别处理,增加算子减少连线,让业务逻辑更清晰。 多个接收算子可以使用相同的指令,客户端一次发送,所有接收算子的对应指令都会被触发。(单个接收算子的多个相同指令只会触发一个)。

    TCPServerConnectionResource_01

  7. 不支持转义字符

    该通讯方式不支持使用转义字符 (如\r\t) 或具有特定含义的字符(如EOF),这类字符会被当作常规字符处理。如有转义字符需求,请考虑二次开发算子自行实现。