文章
· 十二月 7, 2023 阅读大约需 5 分钟

通用TCP业务服务和业务操作

TCP作为OSI 7层的传输层的通信协议,其使用上不像更上层的通信协议那么方便,因为TCP操作的不是数据包,它操作的是数据流。因此有多种将TCP数据流“解释”为数据包(消息)的方法。

InterSystems IRIS提供了多种TCP适配器,用于不同的“解释”,例如EnsLib.TCP.FramedInboundAdapter使用特定的首尾字符做为分隔、EnsLib.TCP.CountedInboundAdapter使用固定的长度进行分隔...

同时,InterSystems IRIS提供了多种开箱即用的TCP业务服务和业务操作,方便接入和发送TCP数据。这里我们介绍常见的使用特定的首尾字符做为分隔的TCP业务服务和业务操作。

 

1. 通用TCP业务服务和业务操作

EnsLib.TCP.Framed.PassthroughService和EnsLib.TCP.Framed.PassthroughOperation是一组使用特定的首尾字符做为分隔TCP数据流的通用业务服务和业务操作。EnsLib.TCP.Framed.PassthroughService业务服务会将TCP数据封装在Ens.StreamContainer发送给业务流程或业务操作;而EnsLib.TCP.Framed.PassthroughOperation业务操作发送并接收Ens.StreamContainer类型的数据。

 

2. 使用EnsLib.TCP.Framed.PassthroughService业务服务

2.1 向production中加入通用TCP业务服务

增加通用TCP业务服务,只需要在Production配置页面的服务中添加EnsLib.TCP.Framed.PassthroughService。

建议加入Production时,给业务服务起一个名字,用于代表具体的业务,例如是连接到设备的TCP服务,可以命名为TCPforDevice(可以考虑的命名规则 - 接口方式+业务系统)。如果未命名,默认会使用类名作为业务服务名。

2.2 配置通用TCP业务服务

主要的设置项是以下几个:

1. Port:接收TCP数据的端口,例如图中的65530端口

2. Target Config Names:TCP服务发送消息的目标,可以是业务流程或业务操作

3. Message Frame Start:标记TCP开始的字符或字符串,用10进制ASCII码表示。如果有多个字符,字符ASCII间用逗号分隔。图例中为ASCII 10,也就是“退格符”。

4. Message Frame End:标记TCP结束的字符或字符串,用10进制ASCII码表示。如果有多个字符,字符ASCII间用逗号分隔。图例中为ASCII 28和13,也就是“文件分隔符”和“回车符”。

5. Remove Framing: 是否把标记TCP起止的字符删除后再发送到后续业务组件。建议选中

6. Discard Incorrect Framing:丢弃使用不正确起始字符的TCP数据。建议在调试阶段取消选中,测试完成后再选中

7. Frame Acknowledgement:是否要发送Frame 通知,可以取消选中

启用该业务服务后,既可以接收了TCP请求了。

 

2.3 测试通用TCP业务服务

可以使用TCP客户端进行发送数据的测试。这里使用Packet Sender向IRIS发布的65530端口,发送以下的数据,注意前后的TCP分段起止字符:

 

然后就可以到消息可视化追踪的页面查看接收的消息。可以看到它是Ens.StreamContainer类型的消息,而且已经把起止字符去掉了:

 

3. 使用EnsLib.TCP.Framed.PassthroughOperation业务操作

3.1 向production中加入通用TCP业务操作

同样,可以直接将EnsLib.TCP.Framed.PassthroughOperation加入production。

3.2 配置通用TCP业务操作

主要的设置项是以下几个:

1. IP Address:TCP服务器的IP地址

2. Port:TCP服务器的TCP端口,例如图中的65530端口。这里用65530端口,就是发送到上面我们建立的通用TCP业务服务。

3. Message Frame Start:标记TCP开始的字符或字符串,用10进制ASCII码表示。如果有多个字符,字符ASCII间用逗号分隔。图例中为ASCII 10,也就是“退格符”。业务操作会自动在发送的TCP数据头部加入这些开始字符。

4. Message Frame End:标记TCP结束的字符或字符串,用10进制ASCII码表示。如果有多个字符,字符ASCII间用逗号分隔。图例中为ASCII 28和13,也就是“文件分隔符”和“回车符”。业务操作会自动在发送的TCP数据尾部加入这些开始字符。

5. Remove Framing: 是否把收到的TCP响应数据中标记TCP起止的字符删除。建议选中

6. Discard Incorrect Framing:丢弃使用不正确起始字符的TCP响应数据。建议在调试阶段取消选中,测试完成后再选中

 

启用该业务操作后,既可以发送TCP请求了。

3.3 测试通用TCP业务操作

因为TCP业务操作的请求消息是Ens.StreamContainer,里面是流数据,为了方便测试,我们建立一个测试用的业务流程,里面组织好数据并调用通用TCP业务操作。

3.3.1 创建一个新的业务流程,设置其请求消息为Ens.StringRequest,用于测试时传入TCP数据。并为其上下文增加一个名为DataBody、类型为%Stream.GlobalCharacter(可持久化的字符流类型)的属性:

3.3.2 在业务流程中增加一个代码流程(<code>),将请求消息的字符串数据写入上下文的DataBody字符流:

Do context.DataBody.Write(request.StringValue)

 注意行首加空格。

 

 

3.3.3 然后在业务流程中再加入一个调用流程(<call>),调用上面已经加入production的业务操作,例如TCPtoWMS,并设置请求和响应消息为Ens.StreamContainer或Ens.StreamContainer。

3.3.4 配置RESTtoLIS业务操作的请求消息(Request)

可以直接点击构建请求消息(Request Builder)按钮,使用图形化拖拽建立请求消息:

将左边上下文context里的DataBody拖拽到callrequest的Stream属性上。

3.3.5 将业务流程编译后加入到Production。

3.3.6 测试这个业务流程,输入测试字符串。然后查看消息追踪,可以看到类似这样的:

这是测试业务流程/业务操作的消息追踪:

因为TCP数据发给了同一个production下的通用业务服务,因此还会看到这样的一笔业务服务的消息追踪:

讨论 (0)1
登录或注册以继续