车联网SOMEIP应用总结

1 汽车中的SOMEIP
1.1 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.2 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

1.3 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,2016年1月发布v1.0规范
TC9:Automotive Ethernet Channel & Components
TC10:Wake-up and Sleep, BMW MGU21
TC11:Ethernet switch, switch boot time < 100ms
TC12:1000BASE-T1 PHY
TC14:10BASE-T1S PHY

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

2 SOMEIP协议
2.1 SOMEIP数据包格式
2.1.1 SOMEIP报文头及Payload
车联网SOMEIP应用总结_第1张图片
SOME/IP over UDP: payload up to 1400 bytes or larger with SOME/IP (support in AUTOSAR 4.3 and newer).
SOME/IP over TCP: payload up to 4095-8bytes (AUTOSAR 4.1). Starting with AUTOSAR 4.2 ~4GB.

I. Payload is Big-Endian byte ordering, refer to functions int serialize() and int deserialize()
II. array: 4-byte length + array
III. structure: 4-byte length + structure, refer to deserialize_EMMCInfoQuery_OutParams() and DVRSensorStatusReport_deserialize()
IV. string: 4-byte length (including BOM) + 3-byte BOM (EF BB BF) + string
V. Pay attention to the nested array, structure and string
for example:
struct A {
    int i;
    int j;
};
struct B {
    int k;
    struct A a;
};
struct B array[2];
4-byte length (sizeof(array)) +
4-byte length (sizeof(struct B)) + k + 4-byte length (sizeof(struct A)) + i + j +
4-byte length (sizeof(struct B)) + k + 4-byte length (sizeof(struct A)) + i + j +

2.1.2 SOMEIP报文头细节
车联网SOMEIP应用总结_第2张图片
1)Message ID(包括16bit Service ID和16bit Method ID)
0xffff8100表示SD消息,其它表示gateway消息。
2)Session ID
初始值为1,每次传packet,都需要自动加1,一直到0xffff后,再回到1继续累加计数。如果Session ID的值为0,表示本机或者Service正在重启,对端会关闭连接并重新Offer Service和Find Service。
3)Offer Service作用
- 上电启动时,车内各ECU的启动时间各不相同,ECU通过SD可以对外宣布其Service处于可用状态,否则客户端需要不停的尝试socket连接
- 错误处理,当提供的Service出现问题时,可以通过SD即刻了解Service的不可用状态,接收方就可以做出相应的处理了
4)Find Service作用
由Client发起的多播报文,去对端查找对方是否支持特定的Service ID,如果对端支持,会用单播Offer Service回应该请求。

2.2 SOMEIP Startup Phase
2.2.1 Data Flow
1)Services are advertized by broadcast Offer msgs
2)Clients looks for services via broadcast Find msgs
3)Once a service is located: Subscribe - Ack
4)2 modes for a client : Request and Listen
5)2 modes for a service: Offer and Silent(静默模式)

这个Startup Phase存在的意义就是评估2台ECU初始化时不同步而导致的SOMEIP协议握手可能的延时。

2.2.2 Client Startup Phase
Initial Wait Phase(IWP):
Repetition Phase:不断地发送Find messages直到超过最大发送次数,如果收到unicast Offer就停止发送Find messages
Main Phase:periodically Sub - Ack on Offer messages,Request - Response

2.2.3 Service Startup Phase
Initial Wait Phase(IWP):Find messages received in IWP are ignored
Repetition Phase:周期性发送Offer messsages,Find received后,发送unicast Offer包给Client
Main Phase:周期性发送Offer messages和其它正常操作

2.3 订阅SUBSCRIBE
2.3.1 订阅细节
- 基于Publish/Subscribe模式
- SUBSCRIBE简写为Sub
- Offer和Sub都是周期性的,并且是同步的,也就是说service每发送一次Offer,client都要Sub一次;一般收到Offer消息后,使用Linux timerfd创建定时器,延时10毫秒左右向Server发送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.
- 客户端订阅后,服务端需要立刻发送一条订阅的初始notification给客户端

SOMEIP Subscribe Ack/Nack的Type都是7,俩者通过TTL来区分,如果TTL的值为0,报文就是Nack。Refer to handleSubscribeEventGroupRequest().

2.3.2 showcase
tcp/udp socket创建完成 -> serverConnected() -> 客户端订阅
tcp/udp socket通信异常或者超过3s没有收到offer报文 -> serverDisconnected() -> SOMEIP客户端与服务端断开连接
订阅回调如果使用TCP协议,server端由于TCP粘包效应(nagle算法),可能会把几个notification的payload合成一个,然后发送到client端;如果client没有很好地解析该报文,可能导致丢失notification,参考《Linux网络TCP sticky分析工具》。

下面这幅图来之于page 43 of AUTOSAR_PRS_SOMEIPServiceDiscoveryProtocol。
Figure 2-1 Publish/Subscribe Example
车联网SOMEIP应用总结_第3张图片
上图中的订阅描述有点问题,实际上订阅的事件需要传给SOME/IP,SOME/IP处理后,再传ACK或者NAK给SOME/IP-SD发送。
handleSubscriptionAckWait() for UDP or TCP initial subscription events.

3 COVESA vSomeIP
GENIVI Alliance was rebranded as the Connected Vehicle Systems Alliance (COVESA) in October 2021 and now operates under that name.

3.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库在APL A39X0 Gen9平台加上-mavx2后,编译可以通过,但是在Android上运行时会出现“Illegal instruction”的错误。可以通过cat /proc/cpuinfo查看CPU支持的特殊指令集。

为了简化Android.bp的编写,libs/log/src/*.cpp会包含所有的cpp文件,要解决在APL A39X0 Gen9平台上的运行错误,按照如下步骤修改即可。
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即可

3.2 Android vSomeIP的编译
AUTOSAR系统架构中,软件组件的交互是基于虚拟功能总线(Virtual Function Bus,VFB)进行的,使用VFB的模块名字前面都有个v,表示基于VFB通信的意思,譬如AUTOSAR中属于AVB的vAVTP和vSRP等,这里vSomeIP也继承了这一用法,加个前缀v。

github COVESA/vsomeip
COVESA 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

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

3.3 Android vSomeIP hello_world的编译
加上如下的vSomeIP库依赖。
shared_libs: [
    "libvsomeip",
    "libvsomeip_cfg",
    "libvsomeip_e2e",
    "libvsomeip_sd",
],
/tmp/vsomeip-$CLIENTID: CLIENTID comes from json applications[n].id.
There are three endpoints in hello_world demo, routing manager is /tmp/vsomeip-0, service sends data to client via /tmp/vsomeip-5555 (SOME/IP header low 16bit Client ID), client sends data to service via /tmp/vsomeip-4444 (SOME/IP header low 16bit Client ID).

3.4 Java HIDL
[28th-Mar-2022]
Meld for source code compare in Windows.
G is for getter method, S is for setter method and N is for notification.
./hardware/interfaces/update-makefiles.sh
Android.mk
LOCAL_STATIC_JAVA_LIBRARIES += \
android.hardware.foo-V1.0-java
Android.bp
static_libs: [
"android.hardware.foo-V1.0-java",
],

// out/target/common/gen/JAVA_LIBRARIES
import android.hardware.foo.V1_0.IFoo;
IFoo server = IFoo.getService();

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

4.2 抓包工具CANoe.Ethernet
VN56x0
CANoe文件格式后缀名.blf,即是Binary Logging Format。

4.3 TC8测试项目
1)http://www.opensig.org/tech-committees/tc8/
2)物理层PMA测试
3)TCP/IP一致性测试 - 测试TCP/IP网络层和传输层是否符合规范,Linux上TCP/IP协议栈是开源的,所以一般的失败就是改改网络的配置参数,不会为了过一个测试去修改Linux内核,所以这个测试意义不大,HU上运行一个二进制uppertester,同时使用Spirent的C50 Appliance及其PC软件TTworkbench;SOMEIP SD报文需要使用参数IP_MULTICAST_TTL和IP_TTL调用setsockopt()将IP报文头中的TTL字段的值设置为1

譬如:
ARP老化时间:/proc/sys/net/ipv4/neigh/ethN/gc_stale_time
IP报头TTL配置:/proc/sys/net/ipv4/ip_default_ttl
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_accept

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

5 Wireshark SOMEIP plugin
5.1 插件安装
https://github.com/jamores/eth-ws-someip
Wireshark插件目录:Help -> About Wireshark -> Folders/Plugins
解压后,将所有后缀是lua的文件拷贝到Wireshark安装目录plugins/2.4.10/下。

Wireshark 3.2 has builtin SOME/IP feature.
Analyze - Enabled Protocols... - Search some - Enable SOME/IP and SOME/IP-SD.

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

5.3 常用过滤关键字
Wireshark解析MAC地址时会把前三个字节解析为一个公司的名字。
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
11)OFFER_SERVICE
12)FIND_SERVICE
13)SUBSCRIBE

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

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

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

5.6 Wireshark安装目录下的2个工具
1) editcap
2) mergecap

6 debug
6.1 SOMEIP ETS网络调试助手
NetAssist.exe

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

6.2 multicast
1) 基本概念
- Linux组播client需要使用setsockopt()设置IP_ADD_MEMBERSHIP(加入指定的组播组)才能接收组播server发送的数据。
- 组播MAC地址是指第一个字节的最低位是1的MAC地址。
- 组播MAC地址的前3个字节固定为01:00:5e,后3个字节使用组播IP的后23位。例如239.192.255.251的MAC地址为01:00:5e:40:ff:fb。
- Windows 10 Wireshark要抓取SOME/IP组播报文,需要使用SocketTool工具监听239.192.255.251:30490,然后Wireshark才会显示组播报文,否则不显示(Windows netmon不需要任何设置,就可以抓到全部报文)。

2) Linux
Map IP addr to multicast MAC is function ip_eth_mc_map(), kernel eventually calls driver ndo_set_rx_mode() to set multicast MAC to NIC RX MAC filter table.

6.3 switch port mirror
Read my blog “以太网交换机EtherSwitch”。

6.4 iptables port mirror
1) Android iptables TEE
CONFIG_NF_DUP_IPV4=m
CONFIG_NF_DUP_IPV6=m
CONFIG_NETFILTER_XT_TARGET_TEE=m

# eth0 -> USB eth1 (192.168.2.5) -> Windows NIC (192.168.2.100)
iptables -A PREROUTING -t mangle -i eth0 -j TEE --gateway 192.168.2.100
iptables -A POSTROUTING -t mangle -o eth0 -j TEE --gateway 192.168.2.100

TEE复制报文时,同时替换复制报文的源和目的MAC地址分别到USB eth1和Windows NIC的MAC地址(组播MAC地址也被替换成了Windows NIC的MAC),IP地址不做替换,所以没有路由功能,报文止步于Windows NIC。其缺点是阻碍了原始数据包的快速通过。

2) Windows Tools
Netmon: uses LWF (Light-Weight Filter) NDIS driver
Wireshark: uses NPcap

Windows 10上,Netmon可以抓取所有TEE后的报文,而Wireshark不可以,必须要用SocketTool或者其它工具监听对应的IP和port,才能够抓到相应的报文。

6.5 覆盖Android源代码中的cpp或者Java文件
1) device////vendorsetup.sh
#!/bin/sh

MY_PATH=${PWD}
PROJ_PATH="device///"

if [ -f ${MY_PATH}/${PROJ_PATH}/overlay_setup.sh ]; then
    chmod a+x ${MY_PATH}/${PROJ_PATH}/overlay_setup.sh
fi

2) device////overlay_setup.sh
#!/bin/sh

MY_PATH=${PWD}
OVL_PATH="device////path/to/overlay"

# add shell commands here

3) device////device.mk
$(shell $(LOCAL_PATH)/overlay_setup.sh)

6.6 Android binder death调试
echo 0x18 > /sys/module/binder/parameters/debug_mask
dmesg -C
dmesg -w | grep binder &
kill -9 $PID

6.7 Android debuggered
Android和传统的Linux下基于glibc的不同,glibc的interpreter是/lib/ld-linux-xx.so.2,Android的interpreter是/system/bin/linker。
system/core/debuggerd/debuggerd.c

am broadcast -a
可以做个启动服务,需要发送广播时就setprop sys.am.broadcast 1
接收者需要动态注册接收该广播,因为静态注册可能接收不到广播。

7 Abbreviations
Audi HCP3: High Compute Platform 3
Audi NTG: Next Telematic Generation
BMW BDC_BCP: Body Domain Controller (Gen3)_Basis Central Platform
BMW IDC: BMW Infotainment Domain Controller
BMW MARS: Modular Audio Receiver System, previously called RAM
BMW MGU: Media Graphic Unit (processor for display, I drive interface)
BMW OAP: Online Application Platform
BMW RAM: Receiver Audio Module (tuner, diversity antenna, Amplifier)
BMW WAVE: Wireless Access in Vehicle Environment
Boost.Asio:Asynchronous network I/O
boost.msm:Boost.MetaStateMachine
BPF: Berkeley Packet Filter, tcpdump uses BPF to filter packets
Daimler MMA: Mercedes-Benz Modular Architecture
DDS:Data Distribution Service,已被纳入Adaptive AUTOSAR标准中
ETS:Enhanced Testability Service
H-MTD:High-Speed Modular Twisted-Pair Data
MDI:Medium Dependent Interface,媒介有关接口,通常是指将以太网主机或控制器连接至电缆的物理连接器,譬如FAKRA;需要使用矢量网络分析仪VNA测量MDI回波损耗,即100 Ω差分阻抗是否匹配
nmap:Network Mapper,Linux下的网络扫描和嗅探工具
OABR: OPEN Alliance BroadR-Reach,其中OPEN是One Pair Ethernet Network的缩写
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,车联网SOMEIP,Android,boost,ETS)