S‑CORE 采用双进程网关架构:gatewayd 安全侧通用路由逻辑 + someipd 非安全侧 SOME‑IP 协议适配层,依靠 IPC 实现安全分区隔离与通信协议栈插件化。
SOME/IP 网关拆分为两个守护进程:
- 网关守护进程 gatewayd:承载和底层网络无关的业务逻辑,例如载荷序列化处理;
- SOME/IP 守护进程 someipd:对接、绑定实际的 SOME/IP 协议栈。
gatewayd 和 someipd 之间依靠 IPC 接口充当 ASIL 功能安全域 与 QM 非安全域 的隔离边界;
该分层设计还支持直接更换底层网络协议栈,不需要改动网关主体业务逻辑。

架构深度解析
-
进程职责拆分
-
gatewayd(上层通用网关)
- 和具体车载通信协议(SOME‑IP、SOME/IP‑SD、LOLA‑共享内存 IPC)解耦
- 负责服务代理‑骨架调度、报文负载序列化、事件分发、服务发现管理、应用层消息路由
- 属于ASIL‑B 功能安全上下文,承担安全相关逻辑
- someipd(底层协议适配守护进程)
- 是 SOME‑IP 协议栈的适配器、网络套接层代理
- 处理以太网 Socket 收发、SOME/IP‑SD 服务组播发现、报文组包拆包、TCP/UDP 传输
- 运行在 QM(质量管理、非安全)上下文
-
IPC 隔离接口的两大核心设计目的
-
功能安全隔离(ASIL‑QM 分区)
安全域 gatewayd 和非安全网络协议栈 someipd 通过进程间通信隔离;
非安全侧以太网驱动、协议栈出现异常、网络扰动不会直接污染 ASIL 安全进程,满足车载 ISO‑26262 隔离需求。
- 协议栈可插拔解耦
网关上层路由、序列化逻辑全部放在 gatewayd;
后续如果需要更换第三方 SOME‑IP 栈、切换成 DDS、Ethernet‑RPC,只需要替换 someipd 适配进程,gatewayd 源码无需改动。
Eclipse‑S‑CORE someip‑gateway 上手文档
一、快速入门 Getting Started
1. 拉取代码仓库
```bash
git clone https://github.com/eclipse-score/inc_someip_gateway.git
cd inc_someip_gateway
```
2. 启动双守护进程(必须遵守启动顺序)
- 终端一:启动上层网关进程 gatewayd
```bash
bazel run //score/gatewayd:gatewayd_example
```
- 新开终端二:启动底层SOME‑IP协议适配进程 someipd
```bash
bazel run //score/someipd:someipd_example
```
二、基于Docker集成测试POC验证方案
项目集成测试采用容器化方案;现阶段只是概念验证使用 `docker‑compose` 完成容器编译、环境部署与运行;后续计划接入pytest框架调度管控容器。
- 构建Docker容器镜像
```bash
docker compose --project-directory tests/integration/docker_setup/ build
```
- 启动整套容器环境
```bash
docker compose --project-directory tests/integration/docker_setup/ up
```
容器已经预先配置好IP地址、组播路由等网络参数;
`someipd‑1` 容器内部已经自动拉起 gatewayd + someipd 两个守护程序。
- Wireshark抓包过滤规则,观测容器之间SOME/IP报文
```
ip.addr== 192.168.87.2 || ip.addr ==192.168.87.3
```
- 新建终端,在客户端容器启动示例客户端程序
```bash
docker exec -it --env VSOMEIP_CONFIGURATION=/home/source/tests/integration/sample_client/vsomeip.json docker_setup-client-1 /home/source/bazel-bin/tests/integration/sample_client/sample_client
```
- 第三个终端,进入someipd‑1容器运行IPC性能基准测试
```bash
docker exec -it docker_setup-someipd-1 /home/source/bazel-bin/tests/benchmarks/ipc_benchmarks
```
> 针对Bazel支持的全部测试后端(Docker、Linux‑QEMU、QNX‑QEMU)以及默认配置,请查阅 `quality/README.md`。
三、配置文件相关说明 📝
1. 守护进程配置校验机制
gatewayd、someipd **并不直接读取JSON**;
配置源文件为JSON,编译之后生成 FlatBuffer 二进制文件给守护进程加载。
项目提供JSON‑Schema,用于编辑提示 + 配置合法性校验。
2. 配置文件Schema路径
```
score/config/mw_someip_config.schema.json
```
该规约定义合法配置字段、数据类型、参数约束,用于后续FlatBuffer二进制文件生成。
3. Bazel宏命令生成二进制配置文件
在你的 `BUILD.bazel` 引入工具宏:
```bazel
load("@score_someip_gateway//bazel/tools:someip_config.bzl", "generate_someip_config_bin")
generate_someip_config_bin(
name = "<generation_rule_name>",
json = "//<package>:<path_to_config_json>",
output = "<path_to_config>/<name_of_config>.bin",
)
```
方式一:作为可执行目标的运行时依赖
```bazel
generate_someip_config_bin(
name = "someipd_config",
...
)
native_binary(
name = "gatewayd",
src = "@score_someip_gateway//score/gatewayd",
args = [
"--configuration",
"$(rootpath :someipd_config)",
"--service_instance_manifest",
"$(rootpath etc/mw_com_config.json)",
],
data = [
"etc/mw_com_config.json",
":someipd_config",
],
)
```
方式二:手动编译生成FlatBuffer二进制配置
```bash
bazel build //:someipd_config
```
编译产物存放于 `bazel‑bin/`,查看控制台输出获取完整路径。
4. 配置自动校验测试
`generate_someip_config_bin` 宏会自动生成schema校验单元测试;执行命令:
```bash
bazel test //:<generation_rule_name>_test
```
四、QNX平台编译指南
- QNX账号认证方式
-
方式1:编写 `.netrc` 文件存放myQNX登录凭证
-
方式2:环境变量注入账号密码
```bash
export SCORE_QNX_USER=你的账号
export SCORE_QNX_PASSWORD=你的密码
```
也可以借助pomdtr.secrets这类密钥管理工具管理凭证。
- QNX工具链下载
Bazel编译QNX目标时会自动下载工具链;
自动下载失败时,可以手动下载工具包,通过 `--distdir` 参数指定本地资源目录。
- QNX许可证书部署
保证许可文件路径:
```
/opt/score_qnx/license/licenses
```
可以从本机 `~/.qnx/license/licenses` 拷贝过去。
- 许可服务器模式
编辑 `~/.bazelrc` 添加环境变量,指定证书服务器地址:
```
common --action_env=QNXLM_LICENSE_FILE=<port>@<license_server_host>
```
> ⚠️ 重要限制:当前Dev‑Container容器环境暂时无法对接证书服务器;后续需要调试用户账号、主机名配置才能解决该问题。
核心架构&关键知识点总结
- **双进程分离**
gatewayd:网络无关上层路由、序列化;someipd:SOME‑IP协议栈、以太网收发;二者IPC隔离ASIL安全域/QM非安全域。
- **配置流水线**
JSON → Schema校验 → FlatBuffer二进制 → gatewayd/someipd加载运行。
-
测试三层环境:本地Bazel运行、Docker容器集成测试、QEMU虚拟机(QNX/Linux)
-
QNX编译重点处理工具链下载、软件许可证配置,容器环境存在许可证服务器兼容短板。
如果你需要,我可以整理一份 gatewayd + someipd 启动、调试、配置文件排错的操作清单。