写在开篇·蓉儿继续挖坑
上回说到,郭靖搞清楚了SD报文长啥样------固定的FF FF 81 00身份证,里面包着SD头部、Entry和Option。
郭靖合上笔记本,信心满满:"蓉儿,SD报文我懂了!一个ECU有多个服务,可以塞多个Entry,一条报文全广播出去。"
黄蓉咬了口糖葫芦:"那好,我问你------服务端具体怎么广播?它什么时候开始喊?"
郭靖一愣:"上电就喊?"
黄蓉点头:"对!上电主动会喊话,Offer告知我会啥。 今天就把Offer Service讲透。"
一、Offer Service是什么
黄蓉在白板上写下定义:
Offer Service = 服务端主动广播"我提供什么服务,我在这里"
| 角色 | 动作 | 说明 |
|---|---|---|
| 服务端(如车窗ECU) | 广播Offer | "我会0x0300(车窗控制)、0x0301(位置Field),我在192.168.1.100" |
| 客户端(如座舱) | 接收Offer | "哦,车窗服务在那,记下来" |
"Offer是服务端的'自我介绍'。 上电后主动说,不用等客户端来问。"
二、一个完整的Offer报文示例
黄蓉调出一个左前车窗ECU广播Offer的完整报文(按字段分组):
FF FF | 81 00 | 00 00 00 30 | 12 34 | 00 01 | 01 | 01 | 02 | 00 | 01 | 02 | 00 00 | 00 14 | 03 00 | 00 01 | 00 00 00 03 | 00 14 | 03 01 | 00 01 | 00 00 00 03 | 01 | 00 06 | 11 | C0 A8 01 64 | 77 1E
黄蓉把它拆成三部分讲。
第一步:SOME/IP头部(12字节)
| 分组 | 值 | 说明 |
|---|---|---|
| Service ID | FF FF |
SD专用固定ID |
| Method ID | 81 00 |
SD专用固定Method ID |
| Length | 00 00 00 30 |
48字节 |
| Client ID | 12 34 |
0x1234 |
| Session ID | 00 01 |
0x0001 |
| Message Type | 02 |
NOTIFICATION |
"看到FF FF 81 00,就知道这是SD消息。"
第二步:SD头部(4字节)
| 分组 | 值 | 说明 |
|---|---|---|
| Version | 01 |
SD版本1 |
| Message Type | 02 |
Offer Service |
| Reserved | 00 00 |
保留 |
| Entry Count | 00 00 00 02 |
有2个Entry(这个ECU广播了2个服务) |
"Entry Count告诉客户端:后面有2个Entry,一个一个解析。"
第三步:Entry 1(第一个服务)
| 分组 | 值 | 说明 |
|---|---|---|
| Entry Type | 00 01 |
Offer Service |
| Length | 00 14 |
20字节 |
| Service ID | 03 00 |
车窗控制服务 |
| Instance ID | 00 01 |
左前窗 |
| TTL | 00 00 00 03 |
3秒 |
| Option | (见下面) | 告诉客户端IP和端口 |
TTL(Time To Live):这个广播的有效期是3秒。客户端收到后,在3秒内认为这个服务存在。3秒后没收到续约,就认为服务下线了。
第四步:Entry 2(第二个服务)
| 分组 | 值 | 说明 |
|---|---|---|
| Entry Type | 00 01 |
Offer Service |
| Length | 00 14 |
20字节 |
| Service ID | 03 01 |
车窗位置Field服务 |
| Instance ID | 00 01 |
左前窗 |
| TTL | 00 00 00 03 |
3秒 |
第五步:Option(IP地址和端口)
| 分组 | 值 | 说明 |
|---|---|---|
| Option Type | 01 |
IPv4 Endpoint |
| Option Length | 00 06 |
6字节 |
| Protocol | 11 |
UDP(0x11) |
| IP地址 | C0 A8 01 64 |
192.168.1.100 |
| 端口号 | 77 1E |
30490 |
三、TTL是干啥用的?
郭靖盯着TTL字段:"TTL=3秒,意思是3秒后这个服务就没了?那车窗服务岂不是3秒就要下线?"
黄蓉摇头:"不是。TTL是告诉客户端:如果3秒内没收到新的Offer,就把这个服务从缓存里删掉。"
| TTL值 | 含义 |
|---|---|
3秒 |
服务端会每隔1.5秒(TTL/2)重新广播一次 |
0秒 |
特殊值,表示"服务下线了,客户端请立即删除" |
"TTL是给客户端用的'有效期',不是服务端自己的倒计时。"
四、多Entry的好处
黄蓉指着报文里的Entry Count=2:
"这个ECU提供了两个服务,一条SD报文全广播出去。如果每个服务单独发一次Offer,要发两条。现在一条搞定。"
| 场景 | 没有多Entry | 有多Entry |
|---|---|---|
| 一个ECU有10个服务 | 发10次广播 | 发1次广播 |
| 网络负载 | 高 | 低 |
五、客户端收到Offer后做什么
黄蓉画了座舱收到Offer后的处理流程:
座舱收到SD报文(Offer):
│
├── 解析SOME/IP头部 → 识别出是SD消息(FF FF 81 00)
│
├── 解析SD头部 → Entry Count=2,准备解析2个Entry
│
├── 解析Entry 1 → Service ID=0x0300,Instance ID=0x0001,TTL=3
│
├── 解析Entry 2 → Service ID=0x0301,Instance ID=0x0001,TTL=3
│
├── 解析Option → IP=192.168.1.100,Port=30490,Protocol=UDP
│
└── 存入服务缓存:
“车窗控制服务(0x0300, 0x0001) 在 192.168.1.100:30490,有效期3秒”
“车窗位置Field服务(0x0301, 0x0001) 在 192.168.1.100:30490,有效期3秒”
"以后座舱要调车窗服务,直接从缓存里查,不用每次都问。"
六、黄蓉的小本本
郭靖翻开她的笔记本,上面写着:
Offer Service核心要点:
1. 服务端主动广播:上电后主动说"我会啥,我在这"
2. TTL机制:告诉客户端有效期。服务端要定时续约,否则客户端TTL超时后删除
3. 多Entry:一个ECU有多个服务,一条SD报文全广播出去
4. Option:IP地址、端口、传输协议藏在Option里
5. 客户端行为:收到Offer后存入缓存,TTL超时未续约则删除
一句口诀:上电主动会喊话,Offer告知我会啥
写在最后
郭靖合上笔记本:"Offer是服务端上电后主动广播'我会啥'。TTL告诉客户端有效期,服务端要定时续约。多个Entry可以一次广播多个服务,不用一个个发。"
黄蓉咬了口糖葫芦:"知道了服务端怎么喊。那如果客户端启动晚了,没听到Offer怎么办?"
郭靖摇头。
"下篇预告:客户端主动问Find,谁会啥快出现------Find Service详解。"
打完收工,886。