SomeIP 协议格式解析

一、SomeIP 协议格式

// SomeIP 协议格式
SomeIP {
    ushort svcID; //Service ID; 标识出一个服务
    ushort mthdID;//Method ID; 标识出一个方法
    uint   length;//Length (此字节之后的长度)
    ushort cliID; //Client ID; 客户端ID,区分不同客户端
    ushort ssID;  //Session ID; 区分统一客户端的多次调用
    uchar  ver{0x01}; //SOME/IP Version; 协议版本号;固定为0x01
    uchar ifcVer; //interfaceVer; 服务接口版本
    uchar  type;  // | Message Type [.... xxxx]  报文类型,目前共5种
    bool   isAck; // | Message Type [.x.. ....]  Message Type Ack Flag
    bool   isTP;  // | Message Type [..x. ....]  Message Type TP Flag
    uchar  retCode;//返回码Return Code (0x00 Ok) ;
    char[] payload;//数据段
}

其中 Message Type 取值及含义如下表:
————————————— ————————————————— ————————————————
Message Type  报文类型           说明
0x00          REQUEST           请求,需要回复
0x01          REQUEST_NO_RETURN 请求,不需要回复
0x02          NOTIFICATION      Notifier/Event,不需要回复
0x80          RESPONSE          回复
0x81          ERROR             错误
————————————— ————————————————— ————————————————

 Return Code:

 

 

二、SomeIP-SD 协议格式

SOME/IP SD 用于提供服务、发现服务、订阅事件组。

SOME/IP SD 只用 UDP 协议的 30490 端口通信。

SOME/IP SD 提供了两种动态发现服务的机制。
  一种是 Offer Service(Type = 0x01),由服务端广播其提供的服务;
  另一种是 Find Service(Type = 0x00),由客户端请求可用的服务。

 

 1 // Entry 有服务和 EventGroup 两种:
 2 // 有的类型具有相同的值,这时需要通过 Entry 中的 TTL 字段来区分到底是 Start 还是 Stop,是ACK 还是 NACK。
 3 enum EntryType : uchar {
 4     FindService = 0x00,
 5     OfferService = 0x01,
 6     StopOfferService = 0x01,
 7     SubscribeEventgroup = 0x06,
 8     StopSubscribeEventgroup = 0x06,
 9     SubscribeEventgroupAck = 0x07,
10     SubscribeEventgroupNAck = 0x07
11 }
12 Entry {
13     EntryType type; // enum EntryType
14     uchar     opt1stInd; //Option1排在Array里第几个
15     uchar     opt2stInd; //Option2排在Array里第几个
16     uchar     opt1st; //Option1的数目
17     uchar     opt2st; //Option2的数目
18     ushort    svcID;  // service ID
19     ushort    instID; // instance ID ; 0xFFFF表示全部实例
20     uchar     majorVer;
21     uchar[3]  ttl; // time to live; “Entry”的生命周期,单位为秒
22     union {
23       uint    minorVer;
24       struct  group{
25         uchar reserved{0x00};
26         bool  idrf;      // | [x... ....] Inital Data Requested Flag; 如初始值由服务发送,须置为1
27         uchar reserved_; // | [.xxx ....]
28         uchar counter;   // | [.... xxxx] 区分相同订阅者的订阅请求
29         ushort groupID;  //Event Group ID; 事件组ID,也就是说SOME/IP事件订阅和取消订阅的颗粒度到一个事件组,而不是一个事件
30       };
31     };
32 }
33 //Option 字段用来传输 Entry 的附加信息,包括对于服务实例的 IP 地址、传输协议、端口号等信息。
34 enum OptionType :uchar {
35     Configuration = 0x01, //用于传输Entry的附加信息,比如服务名等等
36     IPv4_Endpoint = 0x04, //用于传输IPv4相关的参数,比如服务的IP地址、TCP还是UDP、端口号
37     IPv6_Endpoint = 0x06,
38     IPv4_Multcast = 0x14,
39     IPv6_Multcast = 0x16
40 }
41 Option {
42     ushort   length; //
43     OptionType  type; // enum OptionType
44     uchar    reserved;
45     uchar[]  data; //包括服务实例的 IP 地址、传输协议、端口号等信息。
46 }
47 // SomeIPSD 协议格式
48 SomeIPSD {
49     ushort svcID{0xFFFF}; //Service ID; 固定值 0xFFFF
50     ushort mthdID{0x8100};//Method ID;  固定值 0x8100
51     uint   length;//Length (此字节之后的长度)
52     ushort cliID; //Client ID; 客户端ID,区分不同客户端
53     ushort ssID;  //Session ID; 区分统一客户端的多次调用
54     uchar  ver{0x01}; //SOME/IP Version; 协议版本号;固定为0x01
55     uchar  ifcVer{0x01}; //interfaceVer; 服务接口版本;固定为0x01
56     uchar  type{0x02}; // | Message Type [.... xxxx]  报文类型;固定为0x02
57     bool   isAck;      // | Message Type [.x.. ....]  Message Type Ack Flag
58     bool   isTP;       // | Message Type [..x. ....]  Message Type TP Flag
59     uchar  retCode{0x00};//返回码Return Code;固定为0x00
60     //uchar  flags; //重新启动标志+单播标志+显示初始数据控制标志
61     bool   flagReboot;  // | [x... ....] Reboot Flag ; 服务重新启动后,所有消息的Reboot Flag须置为1,直到Session ID重新从1开始计数,之后的Reboot Flag须置为0。
62     bool   flagUnicat;  // | [.x.. ....] Unicast Flag
63     bool   flagExplicit;// | [..x. ....] Explicit Inital Data Requested Flag
64     uchar  reserved[3]{0x00};//保留
65     uint   entrySize;//Length of Entries Array
66     Entry[entrySize]  entris;// entrySize 个 Entry
67     uint   optionSize;//Length of Options Array
68     Option[optionSize] options;// optionSize 个 Option
69 }

 

 

 

参考1: https://www.cnblogs.com/tengzijian/p/15360205.html
参考2: https://blog.csdn.net/xllhd100s/article/details/112309194

posted @ 2024-05-11 14:07  _Ong  阅读(224)  评论(0编辑  收藏  举报