someip是現代車輛通信的主流通信協議知一;
someip的主要涉及模型以及協議結構,我就不做多的做介紹了,如有需要請讀者自行進行百度學些;
雖然someip協議已經基本成熟,但有多個實現版本,現在使用較多的主要有,vector autosar配置的someip版本,以及網絡開源的vsomeip版本;
這兩個版本在理論上是可以相互兼容正常通信的,但在實際使用過程中,仍然發現了一些問題;
我將自己實際遇到的問題以及解決方案記錄到這里希望可以幫助有需要的人;
1、在同一個局域網內,兩方無法相互發現;
原理:運行的someip應用需要借助於各自的someipd服務來彼此發現對方;
而someipd實現的someip sd協議是借助於udp的廣播來發布或收集網絡中的其他someip應用的相關信息的;
所以要想兩方能夠彼此發現,首先要將someip sd的服務設置為同一廣播地址以及服務端口號;
這個信息可以在vsomeip程序加載的vsomeip-tcp-server.jason等配置文件中進行修改;
理想情況下,將兩方的配置修改成一樣就可以正常發現彼此;
2、將someip sd的廣播地址以及服務端口號配置成一樣,雙方仍然是無法發現彼此;
這個首先要借助網絡工具來抓包進行確認,是否可以在網絡上抓取到相應的udp數據包,來檢查是不是由於網絡設置的原因造成的;
如果抓包工具可以確認在網絡上有影響的udp廣播包;
那么就要對someip的版本號配置進行確認;
在我使用vsomeip 2.10版本時發現,vsomeip 代碼中的默認主版本號信息為0x00;而vector autasar的someip版本號信息不特意更改的話是0x01;
由於雙方版本號不一致,雖然彼此可以收到對方發出的sd udp廣播包,但在軟件中彼此仍然無法相互識別。並且在vsomeip中會頻繁輸出warning信息;
將雙方的版本號信息設置為一致時,就相互就可以識別了;
3、sd 廣播地址服務端口號以及版本號都配置成一致;但彼此仍然無法發現;
這個就需要排查網絡設置問題;
(1)雙方是否可以彼此ping通;
(2)路由表以及gateway是否配置正確;
我就遇到雙方可以ping通,但由於路由表以及gateway信息缺失使得雙方無法彼此發現的問題;
4、雙方可以彼此發現,但客戶端一訂閱或者發送request底層tcp鏈接就斷開的情況;
這個問題,也是由於服務版本號的問題(interface version);
由於某些特殊的原因,將autosar someip的主版本號設置為255可以與vsomeip 的0版本號相互發現;
但是當進行交互時,在代碼中會對interface version配置進行驗證。如果雙方的interface version不一致,那么就會出現一通信底層tcp的鏈接就會斷開情況;
這個需要注意檢查;
5、當vsomeip作為服務器,autosar someip作為客戶端。vsomeip發送的event,autosar someip的客戶端無法接收到的情況;
首先要對someip傳輸類型進行確認(使用的是tcp或者udp);
假如使用tcp進行傳輸;則需要將vsomeip 配置文件中event配置添加is_reliable為true的字段;
否則autasar someip tcp的客戶端無法正常接收;