车联网SOMEIP应用总结

1 汽车中的SOMEIP
1.1 SOMEIP架构
Figure 1-1 SOMEIP架构

车联网SOMEIP应用总结_第1张图片

1.2 IEEE规范
IEEE 802.3bw:100BASE-T1
IEEE 802.3bp:1000BASE-T1
IEEE 802.1Q:VLAN
IEEE 802.1Qav:FQTSS
IEEE 802.1Qat:SRP
IEEE 802.1AS:gPTP

1.3 AUTOSAR规范
SOMEIP:                     AUTOSAR_PRS_SOMEIPProtocol
SOMEIP/SD:               AUTOSAR_PRS_SOMEIPServiceDiscoveryProtocol
SOMEIP/SD:               AUTOSAR_SWS_ServiceDiscovery
SOMEIP数据序列化:   AUTOSAR_SWS_SOMEIPTransformer
SOMEIP:                     AUTOSAR_TR_SomeIpExample
TCP测试标准:             Acceptance Test Specification of TCP communication
UDP测试标准:             Acceptance Test Specification of UDP communication
IPv4测试标准:             Acceptance Test Specification of IPv4 communication
TCP/IP软件接口描述: Specification of TCP/IP Stack

ATS:Acceptance Test Specification
PRS:Protocol Specification
SRS:Software Requirement Specification
SWS:Software Specification 
TR:Technical Report

https://www.autosar.org/fileadmin/user_upload/standards/classic/4-3/AUTOSAR_TR_PredefinedNames.pdf

1.4 Open Alliance规范
TC1:Interoperability & Compliance Tests for 100BASE-T1 PHYs
TC2:100BASE-T1 Ethernet Channel & Components
TC3:1000BASE-T1 CMC Requirements
TC4:Tools
TC6:MII
TC7:1000BASE-RH Gigabit Ethernet over Plastic-Optical-Fiber
TC8:Automotive Ethernet ECU Test Specification
TC9:Automotive Ethernet Channel & Components
TC10:Wake-up and Sleep
TC11:Ethernet switch requirements and qualification
TC12:1000BASE-T1 PHY
TC14:10BASE-T1S PHY

https://www.opensig.org/tech-committees/

1.5 DoIP规范
13400-1:DoIP协议基础
13400-2:DoIP 3/4层
13400-3:DoIP 1/2层
13400-4:DoIP引脚定义
14229-2:UDS5层
14229-5:UDS7层

https://www.iso.org/standards.html

2 GENIVI vsomeip
2.1 Android boost的编译
https://www.boost.org/users/download/

下载2017版本1.66.0,编写Android.bp文件。
cc_library_static {
    name: "libboost",
    vendor_available: true,

    rtti: true,
    cppflags: [
        "-fexceptions",
        //"-mavx2",
    ],

    local_include_dirs: [
        "./",
        "./libs/log/src/",
    ],
    export_include_dirs: ["./"],
    srcs: [
        "libs/chrono/src/*.cpp",
        "libs/date_time/src/gregorian/*.cpp",
        "libs/log/src/setup/*.cpp",
        "libs/log/src/*.cpp",
        "libs/log/src/posix/*.cpp",
        "libs/filesystem/src/*.cpp",
        "libs/system/src/error_code.cpp",
        "libs/thread/src/future.cpp",
        "libs/thread/src/pthread/thread.cpp",
        "libs/thread/src/pthread/once.cpp",
    ],
}
boost.log库在ATOM x86平台上需要-mavx2,加上该标志后,编译可以通过,但是在Android上运行时会出现“Illegal instruction”的错误。可以通过cat /proc/cpuinfo查看CPU支持的特殊指令集。

为了简化Android.bp的编写,libs/log/src/*.cpp会包含所有的cpp文件,要解决在ATOM x86平台上的运行错误,按照如下步骤修改即可。
1)注释Android.bp中的-mavx2
2)将文件libs/log/src/dump_avx2.cpp重命名成libs/log/src/dump_avx2-cpp-
3)将文件libs/log/src/dump_ssse3.cpp重命名成libs/log/src/dump_ssse3-cpp-
4)再重新编译生成libboost.a即可

2.2 Android vsomeip的编译
https://github.com/GENIVI/vsomeip

GENIVI vsomeip基于CAPI(CommonAPI),修改vsomeip Android.bp,添加如下的boost库依赖。
rtti: true,
cppflags: [
    "-fexceptions",
],
static_libs: [
    "libboost",
],

文件implementation/helper/1.66/boost/asio/detail/reactor_op_ext_local.hpp,注释下面的一行头文件。
#include
vsomeip中使用的Boost.Asio库,这个库只有头文件。这个库需要链接libboost_system,如果要启动线程,还需要链接libboost_thread。

让系统编译OEM Android.bp,需要将Android.bp的路径添加到build/soong/root.bp

2.3 Android vsomeip hello_world的编译
加上如下的vsomeip库依赖。
shared_libs: [
    "libvsomeip",
    "libvsomeip_cfg",
    "libvsomeip_e2e",
    "libvsomeip_sd",
],

3 SOMEIP数据包格式
Figure 3-1 SOMEIP报文头及Payload

车联网SOMEIP应用总结_第2张图片

Figure 3-2 SOMEIP报文头细节

车联网SOMEIP应用总结_第3张图片

Figure 3-3 SOMEIP Service Discovery报文格式

车联网SOMEIP应用总结_第4张图片

1)MessageID(包括16bit ServiceID和16bit MethodID)
等于0xffff8100表示SD消息,其它表示gateway消息。
2)OFFER_SERVICE和FIND_SERVICE
FIND_SERVICE:由Client发起,去对端查找对方是否支持特定的ServiceID,如果对端支持,会用OFFER_SERVICE回应该请求。
OFFER_SERVICE:由本地主动周期性发送(类似于USB-PD中的广播Send_Capabilities包)。

OFFER_SERVICE或者FIND_SERVICE之后,只有event才会SUBSCRIBE,接着如果对端有事件,对端就会notify。
3)Session ID
初始值为1,每次传packet,都需要自动加1,一直到0xffff后,再回到1继续累加计数。如果Session ID的值为0,表示本机或者service正在重启,对端会关闭连接并重新OFFER_SERVICE或者FIND_SERVICE。

4 订阅SUBSCRIBE
- SUBSCRIBE简写为sub
- SUBSCRIBE on Offer Service
once ECU1 someipsdd receives OFFER_SERVICE from ECU2 someipsdd and FIND_SERVICE from local client, someipsdd matches the service id , instance id 's of both OFFER_SERVICE and FIND_SERVICE , if matches, FIND_SERVICE成功,然后local client去连接服务器的UDP和TCP sockets,当TCP和UDP sockets连接成功后,then serverConnected EVENT is sent to the local client, and local client sends SUBSCRIBE to ECU2.

tcp/udp socket创建完成 -> serverConnected() -> 订阅
订阅回调如果使用TCP协议,server端由于TCP粘包效应(nagle算法),可能会把几个notification的payload合成一个,然后发送到client端;如果client没有很好地解析该报文,可能导致丢失notification。

tcpdump -i lo port 56790 -w /sdcard/someip_snoop.pcap

Figure 4-1 Subscription

车联网SOMEIP应用总结_第5张图片

5 Wireshark SOMEIP plugin
5.1 插件安装
解压后,将所有后缀是lua的文件拷贝到Wireshark安装目录plugins/2.4.10/下。

5.2 时间戳调整为UTC显示格式
View -> Time Display Format -> Date and Time of Day

5.3 常用过滤关键字
1)someip
2)ip.src == 192.168.1.1 - 改到对应的ip地址
3)ip.src == 192.168.1.1 and ip.dst == 192.168.1.2 - 改到对应的ip地址
4)someip.messageid == 0xffff8100 and ip.src == 192.168.1.2 - 改到对应的ip地址
5)dns - 调试域名解析
6)tcp.port == 8000
7)!(tcp.analysis.retransmission)
8)tcp.flags.syn==1 or tcp.flags.ack==0
9)tcp.flags.fin == 1
10)usb.src == "1.6.1" and usb.dst == "host" - 改到对应的USB bus_no.addr.ep_no

5.4 常用搜索关键字
1)OFFER_SERVICE
2)FIND_SERVICE
3)SUBSCRIBE

5.5 SOMEIP TCP连接心跳包
SOMEIP TCP连接心跳包(4个字节):0x dead beef

5.6 tcpdump抓到的log循环写
tcpdump -X -i eth0 -s 0 -C 20 -W 3 -w /data/ipsnoop.pcap -Z root

-i:设备名
-s:过滤包大小限制
-C:定义生成文件大小,兆(Mega Bytes)为单位,取整数
-W:可生成多少个文件
-w:指定生成文件的路径
-Z:用户组,user或者root;Linux如果想循环写文件,此选项必须有,Android不需要

6 TC8测试项目
1)物理层PMA测试
2)TCP/IP一致性测试 - 测试TCP/IP网络层和传输层是否符合规范,Linux上TCP/IP协议栈是开源的,所以一般的失败就是改改网络的配置参数,不会为了过一个测试去修改Linux内核,所以这个测试意义不大,HU上运行一个二进制uppertester,同时使用Spirent的C50 Appliance及其PC软件TTworkbench

譬如:echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_accept

3)SOME/IP一致性测试 - 测试SOME/IP协议栈是否符合ETS规范,这个是测试重点
4)AVB/TSN一致性测试 - 测试AVB协议栈中的gPTP、FQTSS、AVTP等

7 车载以太网测试设备
7.1 测试设备
驱动开发调试设备:NI
SOME/IP测试设备:德国technica engineering车载以太网交换机
TC8 TCP/IP测试设备:英国Spirent的C50 Appliance及其PC软件TTworkbench

7.2 抓包工具CANoe.Ethernet
VN5610A / VN5640
CANoe文件格式后缀名.blf

Figure 7-1 VN5610A双通道port mirror抓包

车联网SOMEIP应用总结_第6张图片

8 网络调试助手
NetAssist.exe

使用说明:勾选“按十六进制发送”CheckBox,然后粘贴要发送的16进制数据到“发送窗口”,点击“发送”按钮。

9 网络线路规程qdisc
9.1 qdisc驱动队列
- num_tx_queues表示发送队列的个数,在创建网络设备时进行初始化
- tx_queue_len表示发送队列的最大长度,也即发送队列中正在排队的最大skb个数
-网络的驱动队列由qdisc管理
net/sched/sch_generic.c
pfifo_fast_enqueue()默认的排队函数

Figure 9-1 Driver Queue

车联网SOMEIP应用总结_第7张图片

9.2 socket读写错误返回值
socket读写错误返回值:errno

10 Abbreviations
Boost.Asio:Asynchronous network I/O
boost.msm:Boost.MetaStateMachine
ETS:Enhanced Testability Service
H-MTD:High-Speed Modular Twisted-Pair Data
libvsomeip_e2e:end to end
MDI:Medium Dependent Interface,媒介有关接口,通常是指将以太网主机或控制器连接至电缆的物理连接器,譬如FAKRA;需要使用矢量网络分析仪VNA测量MDI回波损耗,即100 Ω差分阻抗是否匹配
PVID:Port default VID,PVID属于IEEE 802.1Q,不属于Port-based VLAN
SOA:Service-Oriented Architecture,面向服务的架构
TC8:Technical Committees 8,车载以太网测试规范
VNA:Vector Network Analyzer,矢量网络分析仪
10Base-T1S:S表示Short Reach

你可能感兴趣的:(Network)