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(可习得其他数据类型和分隔符用法)

演示一 接收字符串并回复

通过这个演示,可以习得TCP通讯基础使用,我们将接收具有特定开头的字符串信息,并将其中信息添加后缀内容自动回复给客户端。

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

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

TCPServerConnectionResource_demo1_01

步骤2:配置算子参数

1.设置 TCPServerConnectionResource 算子参数:

  • 自动启动 → 是

  1. 设置 TCPServerReceive 算子面板:

    TCPServerConnectionResource_demo1_02

    按➕号添加一条接收触发指令

    TCPServerConnectionResource_demo1_03

    • 启用 -> 开启(默认)

    • 指令 -> hello

    • 指令分隔符 -> Space

    • 包含数据 -> String

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

    • 后缀 -> (什么都不填)

    • 备注 -> 接收hello(可不填)

    TCPServerConnectionResource_demo1_04

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

    TCPServerConnectionResource_demo1_05

  2. 设置 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 算子参数:

  • 自动启动 → 是

  1. 设置 Join 算子参数

  • 类型 → 坐标

  • 输入数量 → 2

  1. 设置 TCPServerReceive 算子面板:

    按➕号添加一条接收触发指令

    • 启用 -> 开启(默认)

    • 指令 -> setPose1

    • 指令分隔符 -> NONE(默认)

    • 包含数据 -> Pose

    • 数据分隔符 -> ,(逗号)

    • 后缀 -> (什么都不填)

    • 备注 -> 接收pose(可不填)

    按➕号添加一条接收触发指令

    • 启用 -> 开启(默认)

    • 指令 -> setPose2

    • 指令分隔符 -> !

    • 包含数据 -> Pose

    • 数据分隔符 -> $

    • 后缀 -> #

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

    TCPServerConnectionResource_demo2_02 点击应用

  2. 设置 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. 收发独立

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

    TCPServerConnectionResource_06

  5. 多客户端广播

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

    TCPServerConnectionResource_07

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

  6. 多收发算子公用资源

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

    TCPServerConnectionResource_01

  7. 不支持转义字符

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