一 服务发现作用
• Locate service instances.确定服务的位置
• Detect if service instances are running.检测服务实例是否在运行
• Implement the Publish/Subscribe handling.实现发布和订阅的处理
服务发现的主要作用,是确认服务的可用性且控制发送event消息的行为。大白话就是:
1.对客户端来说,发现所需要的服务是否有效。
2.对服务端来说,只给对event感兴趣的(即订阅了eventgroup的)客户端发送someip event。
二、服务发现报文格式
2.1 SOME/IP-SD服务发现通信位于应用层
SOME/IP-SD服务发现与SOME/IP通信一样是位于计算机网络的五层协议模型应用层的。实际上SOME/IP-SD是基于someip协议的。可以理解为SOME/IP-SD报文是特殊的SOME/IP报文,特殊在SOME/IP 的报文头某些字段是固定值,payload是固定格式来存放服务发现的内容。SOME/IP 是支持tcp或者udp通信的,但SOME/IP-SD仅使用udp通信。
2.2 some/ip-sd 报文格式

SOME/IP-SD 报文的格式如上图所示,分为4部分SOME/IP header,SOME/IP-SD header和SOME/IP-SD entry array、SOME/IP-SD option array。
2.2.1服务发现中的SOME/IP header
- Message ID (Service ID/Method ID) [32 bit]: 0xFFFF 8100
如2.1部分提到的,SOME/IP-SD报文的格式是和SOME/IP报文是一样的,是特殊的SOME/IP报文。比如some/ip通信阶段。message id存储的是实际通信的service id和method id,而在some/ip sd中是固定的0xFFFF 8100
- Length [32 bit]
报文长度。单位是字节。计算的是从length后的第一个元素开始,到SOME/IP-SD报文结束。即上图中的Request ID到Options Array。其中Entries Array和Options Array是可变的,和该条服务发现包含几个entry(服务发现应该支持多个entry 组合在一个服务发现消息中 )以及实际服务发现的内容有关,其余的部分是固定长度的共28bytes(SOME/IP head 16 +SOME/IP-SDheader 4 + Length of Entries Array 4+Length of Options Array4)
- Request ID (Client ID/Session ID) [32 bit]
Client ID 0.或者设置中其他已经配置的前缀值
这里我本人也有一些疑惑,someip协议规范上如下图
应该有一个0x0000的client id??也可以是配置的的前缀的client id??意思是说可以设置为0也可以自己配成固定前缀的值吗,比如0x10000001,0x10000002,0x10000003这也吗?
Session-ID,对每一个服务的someip sd报文,该值从1递增到65535,再回归1重新递增。
“每一个服务someip sd报文”的意思是:可能ecu提供两个个someip服务A和B,其中A的sd报文sesion-id和B的sd报文的session-id是单独计数的。
- Protocol Version [8 bit]: 0x01<