SOME/IP プロトコルについて

# 本記事の背景
SOME/IPについて、インプットした内容をまとめる。
目的：SOME/IPについて、何も知らない人がこの記事を見た人が、なんとなくわかった気になること。

※出典にあることを自分なりに解釈してまとめただけです。
　正確な情報は、仕様書等を参照ください。

AUTOSAR Adaptive Platformの技術について勉強していかなければならないが、なかなかイメージがつきにくいため、Classic PlatformとAdaptive Platformのどちらでも対応できるプロトコルであるSOME/IPをきっかけに、理解を深めていきたいと考えた。

AUTOSARの仕様書は正直読みずらく、Vectorさんの[はじめてのSOME/IP](https://www.vector.com/jp/ja/know-how/vj-beginners/someip/)や、youtubeの動画解説[SOME/IPプロトコルとは - SOME/IPの概要と通信仕様](https://www.youtube.com/watch?v=BOyN66Xwoes)が分かりやすい。概要理解だけならこれを見れば良い。
僕なりの解釈や、もう少し詳細な仕様まで、この記事では記載できればより良いと考えている。時間があるときにちょこちょこ更新していきたい。

# 更新履歴
2023/06/04 初版(R22-11を反映)

# 出典
↓ここに参照する仕様のリンクがまとめられている。
[AUTOSAR仕様一覧](https://some-ip.com/standards.shtml)

[Specification on SOME/IP Transport Protocol R21-11](https://www.autosar.org/fileadmin/standards/R21-11/CP/AUTOSAR_SWS_SOMEIPTransportProtocol.pdf)

[Specification of SOME/IP Transformer R21-11](https://www.autosar.org/fileadmin/standards/R21-11/CP/AUTOSAR_SWS_SOMEIPTransformer.pdf)

[SOME/IP Protocol Specification R21-11](https://www.autosar.org/fileadmin/standards/R21-11/FO/AUTOSAR_PRS_SOMEIPProtocol.pdf)

[Example for a Serialization Protocol (SOME/IP)](https://some-ip.com/papers/cache/AUTOSAR_TR_SomeIpExample_4.2.1.pdf)

[Vector:はじめてのSOME/IP](https://www.vector.com/jp/ja/know-how/vj-beginners/someip/)

[Vector:SOME/IPプロトコルとは - SOME/IPの概要と通信仕様](https://www.youtube.com/watch?v=BOyN66Xwoes)

[Vector:サービス指向のソフトウェアアーキテクチャー:
AUTOSAR Classic/Adaptiveシステムのギャップを埋める](https://cdn.vector.com/cms/content/know-how/_technical-articles/PREEvision/PREEvision_AUTOSAR_Integration_SOA_ElektronikAutomotive_PressArticle_201911_JP.pdf)

[記事：自動車ハッキングのためのSOME/IPサービス列挙](https://www.secure-iv.co.jp/blog/11708)

[次世代車載システム向けサービス指向ミドルウェア SOME/IP-SDの性能評価](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwj5wfua06n_AhWS-2EKHXoCDQIQFnoECA8QAQ&url=https%3A%2F%2Fipsj.ixsq.nii.ac.jp%2Fej%2F%3Faction%3Drepository_uri%26item_id%3D178080%26file_id%3D1%26file_no%3D1&usg=AOvVaw2KNPcRWliQjc6qIltvh3ZS)


# 背景
Connected（コネクティッド）、Autonomous/Automated（自動化）、Shared（シェアリング）、Electric（電動化）といった、「CASE」と呼ばれる新しい領域で技術革新が進んでいる。（詳細省略）

今後は外部のネットワークと接続し、車両が出荷後も機能をアップデートできるような機能（OTA：Over The Air）が追加され、車がスマートフォン化していくと言われている。

そういう流れの中で、現状の資源や機能をうまく活用していくことが大事だが、ECUの各機能を外部から利用するのは容易ではない。

その課題を解決するため、車にも「SOA：Service oriented Architecture」という設計手法の導入が進んでいる。SOAとは、アプリケーションの処理や機能を「サービス」として切り出して部品化するようなアーキテクチャのことである。

SOAはアプリケーションの機能が「サービス」という形で独立しているため、機能を再利用しやすい点が利点である。
特にドメインコントローラECUなどに適用するAUTOSARのAdaptive Platformにも採用されている設計手法である。
車のスマートフォン化にも迅速に対応できることが狙い。

例えば、以下の図のように、ACC（Adaptive Cruise Control System）とLDW（Lane Departure Warning：車線逸脱警報）の機能を持つECU1があったとして、ACCとLDWは「サービス」という形で独立しているので、例えばリソースの制約で「LDW」をECU1からECU2に移したい場合でも、柔軟に対応できる。

![SOME_IP-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/b0180177-1d75-1ff7-fba5-f46b0921ef50.png)

# SOME/IP

SOME/IPとは、「Scalable service-Oriented MiddlewarE over IP」の略語で、
SOAに対応する車載通信プロトコルとして開発された。
※BMWが中心となって提案したらしい。AUTOSAR仕様の一部となっている。2011年なので結構前ですね。

TCP/UDPの上位プロトコルとなり、インフォテインメント、周辺カメラシステムなどに適用されている。
SOAのようにECUの機能を「サービス」という単位として定義。
サービスを使用する時は、ネットワーク上にあるサービスを検索し、検知したサービスを組み合わせてシステムを構築する。

SOME/IP通信仕様は主に2種類ある。

* SOME/IP-SD（Service Discovery）
ネットワーク上にあるサービスを検索して使用する処理。SOME/IP-SDを使用すると、必要な時に必要なサービスを検索して使用するため、ネットワーク上のサービスを動的に参照/使用できる。
クライアントは、サブスクライブしたいイベントグループをサーバーへリクエストする。サーバーはクライアントからのリクエストを受け取り、承認する。EventNotification / Field Notification の2種類の方法でサーバーからクライアントへ値を送信する。

* Remote Procedure Call
処理の実行を他のソフトウェアに依頼する処理。高負荷な処理を遠隔のバックエンドサーバーなどに依頼できるため、自分自身の処理負荷を軽減できる。

## SOME/IP-SD（Service Discovery）
ECU間でどのようなやり取りをするかの仕様は、バージョンは古いが以下を参照するのが分かりやすい。
[Example for a Serialization Protocol (SOME/IP)](https://some-ip.com/papers/cache/AUTOSAR_TR_SomeIpExample_4.2.1.pdf)

[はじめてのSOME/IP](https://www.vector.com/jp/ja/know-how/vj-beginners/someip/)の図9を抜粋：
![スクリーンショット 2023-06-04 22.43.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/4959ee2e-fcba-ebd5-6441-a7a5b9ab9071.png)


## Remote Procedure Call
Remote Procedure Callの処理はGetter / Setter、Method call、Fire & forgetの3つに分けられる。

[SOME/IPプロトコルとは - SOME/IPの概要と通信仕様](https://www.youtube.com/watch?v=BOyN66Xwoes)参照：
![スクリーンショット 2023-06-04 22.21.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/8580fde8-e681-1757-e8a7-2e1f422a4c8c.png)

使い所：
1. Getter / Setter：車載システム上のECUから何か情報を得たい時、設定したいとき（例：ADASカメラの転送レートの取得・変更処理など）
1. Method call：処理結果が得たいとき（例：ナビゲーションのルート演算処理を要求するとき）
1. Fire & forget：処理結果は不要なとき（例：カーエアコンのスタート・ストップ処理など）

# SOME/IP-SDのメッセージフォーマット
* E2Eなし
![スクリーンショット 2023-06-04 23.41.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/cb7bacfc-f954-ff11-b664-48eb6e37e511.png)
* E2Eあり
![スクリーンショット 2023-06-04 23.42.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/58650271-db1b-d670-bf66-ed56199c2004.png)

* SD(Service Discovery Format)
![スクリーンショット 2023-06-04 23.48.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/643ccedf-7b3e-af57-3135-6f7c8c2772c7.png)

* Entries Array type1
![スクリーンショット 2023-06-04 23.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/71656233-9a4f-e0ab-9969-54f587294d5a.png)

* Entries Array type2
![スクリーンショット 2023-06-04 23.50.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/25e9678c-3aa8-9380-7f07-3d8e4e920eda.png)

* Option Array
![スクリーンショット 2023-06-04 23.51.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/1ce4a6eb-def0-e82c-e16a-a3116c2ce8b4.png)


# 実装について
どう実装されるかというと、Adaptive PlatformはC++、Classic PlatformではCでプログラムされる。
[Vector:サービス指向のソフトウェアアーキテクチャー:
AUTOSAR Classic/Adaptiveシステムのギャップを埋める](https://cdn.vector.com/cms/content/know-how/_technical-articles/PREEvision/PREEvision_AUTOSAR_Integration_SOA_ElektronikAutomotive_PressArticle_201911_JP.pdf) 図4参照：
![スクリーンショット 2023-06-04 23.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/a7192ff1-3f2b-93fa-09e0-617317ffc3ec.png)

上記のようにAdaptive PlatformではService Interfaceとして用意されているが、
Classic Platformでは、SWC毎のRte Portとして定義されたIF(Client/Server、Sender/Receiverなど)で実装されることになる。

もともと、Classic Platformしかない時代に、AUTOSARのコンセプトとして仮想機能バス（VFB：Virtual Function Bus）を使って下位のECUのハードウェアやネットワーク・プロトコルを意識することなく設計できるというのがAUTOSARの利点の一つと言われていたが、
僕の経験上、Classic Platformの設計をしていくと、部品としてSWCを分解して設計していくことになる。
SWCの持つRte Ifが今回のService Interfaceと粒度が合うかというと、細かすぎるように感じた。
それは設計者があくまで開発対象のECUしか意識できていないからではないかと思う。

開発対象のECUラインナップのみを考慮すれば良いのであればそれで良いが、
今後は、「サービス」として他のECUにも適用できる粒度の設計ができているか、という観点で外部公開IFを検討していくスキルが必要なのかもしれない。
（そんなECU設計ができるような機会は滅多にないだろうけど。。）

# 気になる点
* セキュリティ的な問題（車載Ethernet通信において認証や暗号化の対策がされていない）はあるようで、
SDのFind Serviceのメッセージを送信しまくることで、ServiceIDを発見できるような攻撃もあるようだ。
参照：[記事：自動車ハッキングのためのSOME/IPサービス列挙](https://www.secure-iv.co.jp/blog/11708)

* 動的なネットワークの設計に伴う通信遅延
SOME/IP-SDの動作フェーズの一つである、Initial Wait Phaseでは、ネットワークの負荷軽減のため、「ランダム時間だけ待機する」処理が実装されている。
その設定によっては通信遅延が発生することの研究がなされている。
参照：[次世代車載システム向けサービス指向ミドルウェア SOME/IP-SDの性能評価](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwj5wfua06n_AhWS-2EKHXoCDQIQFnoECA8QAQ&url=https%3A%2F%2Fipsj.ixsq.nii.ac.jp%2Fej%2F%3Faction%3Drepository_uri%26item_id%3D178080%26file_id%3D1%26file_no%3D1&usg=AOvVaw2KNPcRWliQjc6qIltvh3ZS)

従って、パラメータ「SdServerTimerInitialOfferDelayMin」「SdServerTimerInitialOfferDelayMax」などを決める際には、ECUの個数やバス負荷設計、サービス開始遅延の閾値など様々な情報をインプットに決めていく必要がある。
![スクリーンショット 2023-06-05 0.15.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/bd082e77-899b-ff63-3da3-3c61259fc9ae.png)