Channel Access Protocal——EPICS Base-3.16版CA协议 - 消息Message

参考文献:

官方CA协议说明 https://epics.anl.gov/base/R3-16/1-docs/CAproto/index.html#_messages(本翻译的原文)

 

消息结构

所有通道访问消息都由头部和其后跟着的有效负载组成。

标题始终存在。命令ID和有效负载大小字段具有固定含义。其他头字段带有特定某个命令的含义。如果某个消息中未使用某个字段,则其值必须为零。

单个消息的总大小是有限的。对于4.9版本以前的CA协议,最大消息大小限制为16384(0x4000)字节。其中,头部的固定大小为16(0x10)字节,有效负载的最大大小为16368(0x3ff0)字节。

CA_V49及更高版本可以使用扩展消息形式,这允许消息具有更大的有效负载。扩展消息表单由头部字段Payload Size和Data Count分别设置为0xffff和0来指示。然后,实际有效负载大小和数据计数将作为紧随头部之后的UINT32类型值给出。最大消息大小受32位无符号整数表示限制,4294967295(0xffffffff)。最大有效负载大小限制为4294967255(0xffffffe7)。

为了兼容性,仅当有效负载大小超过4.9以前版本的CA协议限制的16368字节消息大小时,才应使用扩展消息表单。

头部Header

标准消息的头部和扩展消息的头部
(表1和表2)图1. 标准消息的头部和扩展消息的头部

头部字段的名称基于它们最常见的用途。 出于消息自己特定目的,某些消息将使用图1两个表中描述以外的字段。 每个消息单独记录这些变化。 头部所有的值都是无符号整数。

通用的头部字段如下表3:

通用头部字段
表3. 通用头部字段

有效负载

有效负载的结构取决于消息的类型。 有效负载的大小与头部字段Payload Size的值匹配。

消息的有效负载必须填充到8字节倍数的长度。 推荐使用零填充。

 

消息标识符

消息中的某些字段用作标识符。 这些字段在电路(TCP连接)的上下文中用作标识令牌。 用于分配这些值的推荐方案是从0开始按顺序创建它们。所有ID都用UINT32表示。

必须处理所有标识符的溢出! 长时间运行的应用程序可能使用某种 用超过2位的UINT32数据表示的 标识符类型(通常为IOID)。【原文为A long running applications might use more than 2**32 of some identifier type type (typically IOID). 我认为此处的2**32可能是打错了,应该是2 UINT32如果是我理解错误,欢迎指正!

CID - Client ID

CID是一个通道的客户端标识。一个CID必须唯一对应单个电路。

客户端绝不可以发送请求给一个没有与打开的通道(active Channel)关联的CID。

服务器必须忽略任何一个不含有  未关闭电路的打开通道(active Channel)的CID 的请求。也就是说,如果某个请求的CID关联的通道不是active状态,或者这个CID关联的通道所在的电路是关闭的,那么服务器就必须忽略这个请求。

CID存在于CA_PROTO_ERRORCA_PROTO_CREATE_CHANCA_PROTO_ACCESS_RIGHTSCA_PROTO_CREATE_CH_FAILCA_PROTO_SERVER_DISCONN消息的参数1字段中。也存在于CA_PROTO_CLEAR_CHANNEL消息的参数2字段中。

【自己的理解:客户端发送的请求带有CID标识,这个标识是给服务器看的,这个请求是由服务器接收的。】

SID - Server ID

SID是一个通道的服务器标识。一个SID必须唯一对应单个电路。

服务器绝不可以向一个 没有与打开通道(active Channel)关联的SID 发送请求。

客户端必须忽略任何一个不含有 未关闭电路的打开通道(active Channel)的SID 的请求。也就是说,如果某个请求的SID关联的通道不是active状态,或者这个SID关联的通道所在的电路是关闭的,那么客户的就必须忽略这个请求。

SID存在于CA_PROTO_EVENT_ADD, CA_PROTO_EVENT_CANCEL, CA_PROTO_READ_NOTIFY, CA_PROTO_WRITE_NOTIFY, CA_PROTO_WRITE, CA_PROTO_CLEAR_CHANNELCA_PROTO_CREATE_CHAN (仅针对于回复消息)消息的参数1字段。

【自己的理解:服务器发送的请求带有SID标识,这个标识是给客户端看的,这个请求是由服务器接收的。】

订阅ID - Subscription ID

订阅ID是用于订阅的客户端标识。一个CID标识必须唯一对应单个电路。

订阅ID存在于CA_PROTO_EVENT_ADDCA_PROTO_EVENT_CANCEL消息的参数2。

IOID

IOID是Get或Put操作的客户端标识符。一个IOID必须唯一对应一个电路上的一个消息类型。

虽然不推荐,但是在CA_PROTO_WRITE, CA_PROTO_READ_NOTIFY 和 CA_PROTO_WRITE_NOTIFY请求中同时使用相同的IOID是允许的。

IOID存在于CA_PROTO_READ_NOTIFY, CA_PROTO_WRITE_NOTIFYCA_PROTO_WRITE消息的参数2字段中。

搜索ID

搜索ID是用于PV名称搜索的客户端标识。一个搜索ID必须唯一对应一个发送请求的客户端终端。

由UDP的特性决定,复制数据包是可能的。具有相同SearchID的多个CA_PROTO_SEARCH消息可以被认为是重复的,并且只使用了一个。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值