SOME/IP协议

一、概述

1、简述
  1. SOME/IP是汽车中间件解决方案,用于控制消息;支持车机功能,用于MOST场景,CAN场景。
  2. 不同操作系统,设备皆可使用;
  3. 客户端与服务器交换数据,不浪费带宽;
  4. 操作系统与应用之间的服务程序;
  5. 基于TCP/UDP通信;
2、someIP作用
  1. 序列化:数据转二进制串
  2. 远程过程调用;
  3. 服务发现(SD);
  4. 订阅/发布;
3、服务接口
方法-method:
  • RR服务端请求+客户端响应;
  • FF:只用服务端请求;
属性、字段-property/Field:
  • Setter/Getter:服务端给客户端;
  • Notifier
事件-EVENT:订阅

二、SOME/IP

1、someip 报文格式

  • Message ID:报文的唯一标识符;

        Service ID[16 bit] + 0+Method ID [15 bit]

        Service ID[16 bit] + 1+Event [15 bit]

  • Request ID

        Client ID :16bit

        Session ID :16bit

        0x0001~0xFFFF;

  • Protocol Version : 8 bit, SOME/IP协议版本,通常是0x01;
  • Interface Version : 8 bit, Service Interface的主版本,常用作检测服务的一致性;
  • Message Type:8 bit,报文类型;
  • Return Code:占8bits,表示请求是否被成功处理;

2、序列化

序列化:将对象的状态信息转换为可以存储或以二进制的形式在网络中传输;
反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程;
 

序列化规则
  • 基本数据类型的序列化

        大端或者小端序列化;

  • 结构体的序列化

        将结构体的数据元素顺序排列,然后将各个元素依次序列化;

  • 字符串String的序列化(定长、变长)
  • 数组Array的序列化(定长、变长)

3、报文发送和解析示例

1)ANDI软件介绍

        ANDi(Automotive Network Diagnoser)是一个开发、测试和分析工具,支持各种总线系统,如CAN、 LIN、 FlexRay和以太网 。

a.使用Traffic Generator 发送SOME/IP报文;

b.使用Python脚本发送SOME/IP报文

c.使用Traffic Viewer抓包和解析SOME/IP报文

2)MediaGateway介绍

媒体网关(Media Gateway, MGW)是一个连接不同类型网络的单元,执行不同网络之间的媒体流转换。它可以连接的传统网络包括:

  • PSTN(公共交换电话网络)
  • ISDN(综合业务数字网)
  • 2.5G和3G无线电接入网络
  • PBX(专用分支交换机)
  • 基于IP或ATM的数据网络

媒体网关的主要功能包括:

  • 不同传输格式之间的转换和编解码。
  • 多媒体通信的传递,如语音、视频等。
  • 回声消除、DTMF(双音多频)信号处理、语音压缩等功能。

媒体网关由一个媒体网关控制器(Media Gateway Controller, MGC)控制,该控制器提供呼叫控制和信令功能。媒体网关和媒体网关控制器之间的通信依赖于特定的协议,如MGCP(Media Gateway Control Protocol)、H.248/Megaco等。

三、SOME/IP-SD

1、什么是SOME/IP SD(Serive Discovery)
(1)、一种特殊的服务,实现服务寻址及事件订阅功能;

服务寻址:

  • 发现服务
  • 提供服务
  • 结束提供服务

事件订阅

  • 订阅
  • 结束订阅
  • 订阅ACK
  • 订阅NACK
  • 报文格式
(2)、SD报文格式

由SOME/IP与SOME/IP SD构成;

Flags: Reboot Flag[1 bit] + Unicast Flag[1 bit] + Reserved[6 bit]

  • Reboot Flag:重启/上电时置1,Session ID完成1——0xFFFF循环后置0;
  • Unicast Flag:置1时表示支持单播;
     

Entries

  1. Service Entry

  • Tyep:8bit;
  • TTL:24bit,entry的生 存时间,单位秒;
  • Index 1st / 2nd options:表示Option的起始位置,Index 1st指多个Entry共有的option ;
  • # ofopt 1/ # of opt 2:指相应的Index 1st/2nd携带option的数量;
  • Major Version:8bit, 主版本;
  • Minor Version:次要版本;

        2.Eventgroup Entry

        Counter:占4bit,对不同客户端订阅同一事件组的计数;
        EventGroup ID:占16bit,需要订阅的事件组标识符;

Option

  • Configuration Option

可以传输任意字符串,如服务名称或配置;

配置实例:

  • Load Balancing Option :确定不同服务实例的优先级,以便客服端选择

  • Endpoint Option

        IPV4

        IPV6

  • Multicast Option

        IPV4

        IPV5

2、SOME/IP SD示例

Message ID ,Service ID ,Entries{Type+TTL}......

Traffic generator 发送SOME/IP—SD报文;

Python脚本配置Entry
msg_someip_sd = message_builder.create_someip_sd_message("channel_01","channel_01")
msg_someip_sd.add_ find_service_entry( 0x1111,0x01,0x01,0x01,0x01)
msg_someip_sd.add_offer_service_entry (0x2222,0x01,0x01,0x01,0x01)
msg_someip_sd.add_subscribe_event_group_entry(0x3333,0x01,0x01,0x01,0x01)
msg_someip_sd.add_subscribe_event_group_ack_entry( 0x4444,0x01,0x01,0x01,0x01)
msg_someip_sd.add_stop_offer_service_entry (0x5555,0x01,0x01,0x01,0x01)
msg_someip_sd.add_subscribe_event_group_ack_entry(0x6666,0x01,0x01,0x01,0x01)
msg_someip_sd.send()
Python脚本提取Entry
msg_someip_sd.get_find_service_entries()
msg_someip_sd.get_offer_service_entries()
msg_someip_sd.get_stop_offer_service_entries()
msg_someip_sd.get_subscribe_event_group_entries()
msg_someip_sd.get_subscribe_event_group_ack_entries()
msg_someip_sd.get_subscribe_event_group_nack_entries()
msg_someip_sd.get_stop_subscribe_event_group_entries()
Python脚本配置option
msg_someip_sd.add_ipv4_option(" address",port, isUDP,isMulticast)
msg_someip_sd.add_ipv4_option(e, port,"address", isUDP,isMulticast)
msg_someip_sd.add_ipv4_option(e, port, "address",isUDP, isMulticast,index)
Python脚本提取option
# callback function, invoked on each incoming SOME/IP- SD packet
        def on_msg_received(msg):
                for 0 in msg.get_offer_service_entries():
                        print("offer service-id: {0}".format(hex(o.service_id)))
                        # iterate over all referenced options
                        for op in 0.options:
                                print("option: {0} - port: {1}".format(op.ip_address, op.option_port))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值