SOME/IP-SD消息格式
通用要求
服务发现消息应通过UDP进行支持。准备将服务发现消息传输到TCP中以供将来使用情况。服务发现消息应以SOME/IP头开始,如图1所示:
• 服务发现消息应使用0xFFFF的Service-ID(16位)。
• 服务发现消息应使用0x8100的Method-ID(16位)。
• 服务发现消息应使用SOME/IP指定的uint32长度字段。这意味着长度以字节为单位,并从长度字段后的第一个字节开始,直到SOME/IP-SD消息的最后一个字节结束。
• 服务发现消息应具有Client-ID(16位),并根据SOME/IP规则进行处理。
• 服务发现消息应具有Session-ID(16位),并根据SOME/IP要求进行处理。
-
每发送一条SOME/IP-SD消息,Session-ID(SOME/IP头部)应递增。
• 服务发现消息应具有0x01的Protocol-Version(8位)。
• 服务发现消息应具有0x01的Interface-Version(8位)。
• 服务发现消息应具有0x02(通知)的Message Type(8位)。
• 服务发现消息应具有0x00的Return Code(8位)。
SOME/IP-SD 头格式
在SOME/IP头部之后,应按照图1所示紧随其后的SOME/IP-SD头部。
SOME/IP-SD头部应以一个名为Flags的8位字段开始。
SOME/IP-SD Flags字段的第一个标志(最高位)应称为Reboot标志。
SOME/IP-SD头部的Reboot标志应在重新启动后的所有消息中设置为1,直到SOME/IP头部中的Session-ID环绕并重新从0开始。
SOME/IP-SD Flags字段的第二个标志(次高位)应称为Unicast标志,对于单播设置为1,对于多播设置为0。
SOME/IP-SD头部的Unicast标志应对于请求消息和订阅消息设置为单播(即1)。
在Flags之后,SOME/IP-SD头部应具有一个称为Reserved的24位字段,直到另行通知为止,该字段设置为0。
在SOME/IP-SD头部之后,应跟随Entries数组。
在SOME/IP-SD头部的Entries数组之后,应跟随Option数组。
SOME/IP-SD头部的Entries数组和Options数组应以一个uint32长度字段作为开始,该字段计算以下数据的字节数;即Entries或Options的字节数量。
条目格式
存在两种类型的条目:用于服务的类型1条目和用于事件组的类型2条目。
类型1条目应为16字节大小,并按照图2所示的顺序包含以下字段:
• Type字段 [uint8]:编码为FindService(0x00)、OfferService(0x01)和RequestService(0x02)。
• Index First Option Run字段 [uint8]:选项数组中选项的索引。
• Index Second Option Run字段 [uint8]:选项数组中选项的索引。
• Number of Options 1字段 [uint4]:描述第一个选项运行使用的选项数量。
• Number of Options 2字段 [uint4]:描述第二个选项运行使用的选项数量。
• Service-ID字段 [uint16]:描述受SD消息影响的服务或服务实例的Service-ID。
• Instance ID字段 [uint16]:描述受SD消息影响的服务实例的Service-Instance-ID,如果是针对一个服务的所有服务实例,则设置为0xFFFF。
• Major Version字段 [uint8]:编码为服务的主要版本。
• TTL字段 [uint24]:以秒为单位描述条目的生存期。
• Minor Version字段 [uint32]:编码为服务的次要版本。
类型2条目应为16字节大小,并按照图3所示的顺序包含以下字段:
• Type字段 [uint8]:编码为FindEventgroup(0x04)、Publish(0x05)和Subscribe(0x06)。
• Index First Option Run字段 [uint8]:选项数组中选项的索引。
• Index Second Option Run [uint8]:选项数组中选项的索引。
• Number of Options 1 [uint4]:描述第一个选项运行使用的选项数量。
• Number of Options 2 [uint4]:描述第二个选项运行使用的选项数量。
• Service-ID [uint16]:描述受SD消息影响的服务或服务实例的Service-ID。
• Instance ID [uint16]:描述受SD消息影响的服务实例的Service-Instance-ID,如果是针对一个服务的所有服务实例,则设置为0xFFFF。
• Reserved [uint8]:应设置为0x00。
• TTL [uint24]:以秒为单位描述条目的生存期。
• Reserved [uint16]:应设置为0x0000。
• Eventgroup ID [uint16]:传输一个事件组的ID。
选项格式
为了标识选项类型,每个选项都应以以下方式开始:
• Length字段 [uint16]:指定选项的字节长度。
• 类型[uint8]:指定选项的类型。
长度字段不应包括长度字段和类型字段的长度。
配置选项
配置选项的格式应如下:
• 长度 [uint16]:应设置为配置选项占用的总字节数,不包括16位长度字段和8位类型标志。
• 类型 [uint8]:应设置为0x01。
• 保留 [uint8]:应设置为0x00。
• 配置字符串 [动态长度]:应携带配置字符串。
配置选项应基于DNS TXT和DNS-SD格式指定一组键-值对。
配置字符串的格式应以一个单字节长度字段开头,该字段描述了在此长度字段后面的字节数。
在每个字符序列之后,期望另一个长度字段和一个随后的字符序列,直到长度字段设置为0x00为止。
在长度字段设置为0x00之后,不再跟随任何字符。
一个字符序列应编码一个键和可选的值。
字符序列应包含一个等号字符("=",0x03D)来分隔键和值。
键不应包含等号字符,并且至少应为一个非空白字符。键的字符应为可打印的US-ASCII值(0x20-0x7E),不包括'='(0x3D)。
"="不应该是序列的第一个字符。
对于一个没有"="的字符序列,该键应被解释为存在。
对于以"="结尾的字符序列,该键应被解释为存在,但值为空。
在单个配置选项中支持具有相同键的多个条目。
配置选项还应用于编码主机名、服务名和实例名(如果需要)。
图3显示了配置选项的格式,图4显示了配置选项的示例。
负载均衡选项
负载均衡选项应使用类型0x02。
负载均衡选项应携带类似DNS-SRV记录的优先级和权重,可用于负载均衡不同的服务实例。
IPv4端点选项的格式应如下所示:
-
长度 [uint16]:应设置为0x0005。
-
类型 [uint8]:应设置为0x02。
-
保留 [uint8]:应设置为0x00。
-
优先级 [uint16]:携带此实例的优先级。
-
权重 [uint16]:携带此实例的权重。
图5显示了负载均衡选项的格式。
保护选项
保护选项应使用类型0x03。
保护选项应携带Alive-Counter和CRC,可用于保护整个消息,包括SOME/IP头。
保护选项的格式应如下所示:
-
长度 [uint16]:应设置为0x0009。
-
类型 [uint8]:应设置为0x03。
-
保留 [uint8]:应设置为0x00。
-
Alive-Counter [uint32]:应设置为活动计数器的值。如果不存在活动计数器,则应在此字段中使用请求ID的值。
-
CRC [uint32]:应包含用于保护此消息的CRC多项式的值。CRC多项式应由系统部门指定。
如果SOME/IP消息中包含多个保护选项,则它们仅应覆盖它们前面的消息部分。此外,使用多个保护选项将触发可配置的开发错误。
IPv4端点选项
IPv4端点选项应使用类型0x04。
IPv4端点选项应指定使用的IPv4地址、第4层协议和第4层端口号。
IPv4端点选项的格式应如下:
• 长度[uint16]:应设置为0x0009。
• 类型[uint8]:应设置为0x04。
• 保留[uint8]:应设置为0x00。
• IPv4地址[uint32]:应将IP地址作为四个字节传输。
• 保留 [uint8]:应设置为0x00。
• L4-Proto [uint8]:应根据IANA/IETF类型设置为第4层协议(0x06:TCP,0x11:UDP)。
• L4-Port [uint16]:应设置为第4层协议的端口号。
图6显示了IPv4端点选项的格式。
IPv6端点选项
IPv6端点选项应使用类型0x06。
IPv6端点选项应指定使用的IPv6地址、第4层协议和第4层端口号。
IPv6端点选项的格式应如下:
• 长度[uint16]:应设置为0x0015。
• 类型[uint8]:应设置为0x06。
• 保留[uint8]:应设置为0x00。
• IPv6地址[uint128]:应将IP地址作为16个字节传输。
• 保留[uint8]:应设置为0x00。
• L4-Proto [uint8]:应根据IANA/IETF类型设置为第4层协议(0x06:TCP,0x11:UDP)。
• L4-Port [uint16]:应设置为第4层协议的端口号。
图 7 显示了IPv6端点选项的格式。
引用选项来自条目的以下字段:
使用条目的以下字段,选项被条目引用:
• Index First Option Run:对于第一个选项运行,索引到选项数组。索引0表示SOME/IP-SD数据包的第一个选项。
• Index Second Option Run:对于第二个选项运行,索引到选项数组。索引0表示SOME/IP-SD数据包的第一个选项。
• Number of Options 1:第一个选项运行的长度。长度为0表示选项运行中没有选项。
• Number of Options 2:第二个选项运行的长度。长度为0表示选项运行中没有选项。
存在两个不同的选项运行:第一个选项运行和第二个选项运行。
支持两个选项运行的原因:预期存在两种不同类型的选项:多个SOME/IP-SD条目之间共享的选项和每个SOME/IP-SD条目特有的选项。支持两个不同的选项运行是支持这两种选项的最有效方式,同时保持了数据传输格式的高效性。
每个选项运行都应引用第一个选项和该运行中的选项数量。
如果选项数量设置为零,则认为选项运行为空。
对于空的运行,索引(即Index First Option Run和/或Index Second Option Run)应设置为零。
实现应接受并处理接收到的选项运行长度设置为零且选项索引未设置为零的SD消息。
示例
图8显示了一个SOME/IP-SD PDU的示例。IP和UDP头部仅以简化形式显示。