写在开篇·蓉儿接着挖坑上回说到郭靖搞清楚了Service ID是服务的“门派番号”车窗服务是0x0300。郭靖合上笔记本信心满满“蓉儿Service ID我搞明白了车窗服务就是0x0300。”黄蓉咬了口糖葫芦“那好我问你——车上四个车窗都用同一个Service ID0x0300那你想控制左前车窗升窗报文发出去怎么让左前车窗知道是找它而不是右前、左后、右后”郭靖一愣“这……报文头里也没位置字段啊”“今天就用四个车窗当例子把Instance ID这一个知识点讲透。读完这篇你就知道同一服务如何区分不同‘分身’。”附SOME/IP报文结构速查表小贴士别忘了报文头结构Instance ID不在报文头里藏在Payload中。字节偏移字段长度说明0-1Service ID16位服务的唯一标识车窗0x03002-3Method ID / Event ID16位具体的方法或事件ID升窗0x00014-7Length32位从Request ID开始到报文结束的总长度8-9Client ID16位客户端标识10-11Session ID16位会话标识用于匹配请求和响应12Protocol Version8位协议版本号当前固定为0x0113Interface Version8位服务接口的版本号14Message Type8位消息类型0x00REQUEST15Return Code8位返回码0x00E_OK16...Payload可变Instance ID就藏在这里的头几个字节一、Instance ID是什么Instance ID 16位数字是同一服务下不同“分身”的标识。车窗服务的例子车窗位置Service ID相同Instance ID不同左前车窗0x03000x0001右前车窗0x03000x0002左后车窗0x03000x0003右后车窗0x03000x0004“Service ID都一样Instance ID不一样。就像丐帮只有一个番号但洛阳分舵和襄阳分舵编号不同。”二、Instance ID藏在哪儿郭靖追问“那Instance ID到底放在报文的哪个位置报文头里可没有这个字段。”黄蓉画了一个完整的车窗升窗报文结构报文部分内容说明报文头12字节03 00 00 01 00 00 00 08 12 34 00 01 01 01 00 00Service ID0x0300Method ID0x0001Payload载荷00 0101 00前2字节00 01就是Instance ID0x0001左前“看清楚了吗Instance ID不在报文头里藏在载荷的头两个字节。接收方先看Service ID找到车窗服务再看载荷里的Instance ID知道是哪个窗。”三、一个真实的服务定义表带Instance ID黄蓉从电脑里调出完整的车窗服务定义表Service IDInstance IDMethod/Event ID类型名称说明0x03000x00010x0001MethodWindow.LF.Raise左前车窗升窗0x03000x00010x8001EventWindow.LF.PositionEvent左前车窗位置变化事件0x03000x00020x0001MethodWindow.RF.Raise右前车窗升窗0x03000x00020x8001EventWindow.RF.PositionEvent右前车窗位置变化事件0x03000x00030x0001MethodWindow.LR.Raise左后车窗升窗0x03000x00040x0001MethodWindow.RR.Raise右后车窗升窗郭靖盯着表格问“左前和右前Service ID都是0x0300Method ID都是0x0001全靠Instance ID区分。那这个Instance ID是谁定的能不能随便写”黄蓉“跟Service ID一样由整车架构师统一分配。Instance ID在同一个Service ID下必须唯一不能重复。”四、Instance ID的其他“藏身”方式郭靖又问“我一直以为Instance ID只能放在载荷里有没有其他方式”黄蓉列举了三种常见方式方式说明车窗例子优缺点载荷中携带报文头只有Service ID载荷第一个字段是Instance ID左前升窗载荷头00 01简单直接不占额外资源SD阶段区分每个Instance单独提供服务用不同IP/端口左前在192.168.1.101右前在192.168.1.102报文头干净但需要更多IPTCP连接区分每个Instance单独建立一个TCP连接左前用一个TCP连接右前用另一个连接管理复杂五、总结Service ID Instance ID Method ID 三件套黄蓉画了一张完整的关系图层级车窗例子作用Service ID0x0300找到车窗服务找到门派Instance ID0x0001左前找到具体哪个车窗找到分舵Method ID0x0001升窗执行什么操作找到招式“三件套凑齐才能精准调用Service ID找大门Instance ID找房间Method ID找具体操作。”六、黄蓉的小本本郭靖翻开她的笔记本上面写着Instance ID 同一服务下不同“分身”的标识由整车架构师统一分配四个车窗Service ID相同0x0300Instance ID不同0x0001-0x0004Instance ID不在报文头里藏在载荷的头两个字节或从SD阶段/连接区分三件套Service ID什么服务 Instance ID第几个 Method ID什么操作写在最后郭靖合上笔记本“Service ID找到车窗服务Instance ID找到左前窗Method ID执行升窗。三件套凑齐调用才不会乱。”黄蓉咬了口糖葫芦“那你知道了Service ID和Instance ID知道Method和Event有什么区别吗为什么有的操作是你问他答有的是他自己说”郭靖摇头。“靖哥哥升窗一问一答Event自己说话——Method vs Event。” 下次培训啦。打完收工886。