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
--- auth:lzpong