网络仿真 - 通信接口文档
1. 文档变更列表
| 日期 | 版本号 | 作者 | 描述 |
|---|---|---|---|
| 2025-11-25 | v1.0 | gu | init |
| 2025-12-11 | v1.1 | gu | 1. 消息发送:支持回复方法请求; 2. 消息接收:支持接收方法请求、方法回复,CAN消息、事件消息(均为序列化后结果,CAN消息额外包含序列化之前的结果); 3. 调整文档路径,参数类型等 |
| 2025-12-23 | v1.2 | gu | 1. 增加时间戳 |
| 2025-12-31 | v1.3 | gu | 1. 去除接收CAN消息、事件消息,节约性能 2. 去除必须打开仿真空间的限制,修改了连接参数 |
2. 接口说明
本接口对外提供网络仿真能力,可用于发送及接收任意 以太网 / CAN 消息。
注:
- 必须提前打开仿真空间并初始化实例。
- 接口启用期间,测试用例与数据监控功能请勿使用,以避免冲突。
2.1 请求地址
请求地址格式:
ws://<host>:<port>/netsim?workspaceId=<id>&ts=<timestamp>&tz=<timezone>&eToken=<token>
示例:
ws://192.168.127.128:9528/netsim?workspaceId=53&ts=1767150909&tz=0&eToken=123cedf426644690ba1bf39031da139a
| 字段名 | 类型 | 说明 |
|---|---|---|
| workspaceId | long | 工作空间 ID(网络仿真空间) |
| ts | long | 客户端时间戳(毫秒),用于时间同步 |
| tz | int | 客户端时区偏移(分钟),例如:UTC=0,北京=480 |
| eToken | string | 登录鉴权 Token(与 HTTP 接口一致) |
注:无需打开仿真空间即可模拟发送信号(需要周期发送心跳维护连接,15s自动断开)
2.2 接收消息类型
| 类型 | msgType |
|---|---|
| 心跳回复 | S_HEARTBEAT |
| 方法请求 | S_SIM_SERVER_METHOD_REQ |
| 方法回复 | S_SIM_CLIENT_METHOD_RES |
特别的:发送【方法请求】【方法回复】【事件发布】【事件组订阅】【事件组取消订阅】错误时,将收到S_SEND_ETH_RES 发送【CAN消息】错误时,将收到S_SEND_CAN_RES
2.3 发送消息类型
| 类型 | msgType |
|---|---|
| 心跳消息 | B_HEARTBEAT |
| 方法请求 | B_SEND_ETH_REQ |
| 方法回复 | B_SEND_ETH_REQ |
| 事件发布 | B_SEND_ETH_REQ |
| 事件组订阅 | B_SEND_ETH_REQ |
| 事件组取消订阅 | B_SEND_ETH_REQ |
| CAN消息 | B_SEND_CAN_REQ |
3. 消息定义
B_HEARTBEAT(发送 心跳)
{
"msgId": "2a162236d7314671b7384cdf1d434bea",
"msgType": "B_HEARTBEAT",
"payload": null
}
B_SEND_ETH_REQ(发送以太网消息)
| 字段名 | 类型 | 说明 |
|---|---|---|
| msgId | string | 随机值,用于跟踪消息链路。 当 type = 1 (METHOD) 且 actionType = B_SIM_SERVER_METHOD_RES 时,应使用方法请求携带的 msgId。 |
| msgType | string | 固定为 "B_SEND_ETH_REQ" |
| payload | object | 发送以太网消息的业务对象 |
| payload.instanceId | int | SOME/IP 实例 ID |
| payload.actionId | string | 方法 ID 或事件 ID (10进制/16进制均可) |
| payload.type | int | 1:METHOD / 2:EVENT / 3:EVENT_GROUP / 4:FIELD_GET / 5:FIELD_SET / 6:FIELD_NOTIFIER |
| payload.actionType | string | 根据 type 取值:① METHOD → B_SIM_CLIENT_METHOD_REQ(方法请求) / B_SIM_SERVER_METHOD_RES(方法回复)② EVENT → B_SIM_SERVER_EVENT_PUB_REQ(发布事件)③ EVENT_GROUP → B_SIM_CLIENT_EVENT_GROUP_SUB_REQ(订阅事件组) / B_SIM_CLIENT_EVENT_GROUP_UNSUB_REQ(取消订阅事件组) |
| payload.timeout | int | 方法超时时间,仅当 type = METHOD 且 actionType = B_SIM_CLIENT_METHOD_REQ 时生效,默认 0 |
| payload.errCode | int | 方法回复状态码,仅当 type = METHOD 且 actionType = B_SIM_SERVER_METHOD_RES 时生效,默认 0 |
| payload.reason | string | 方法回复错误原因,仅当 type = METHOD 且 actionType = B_SIM_SERVER_METHOD_RES 时生效 |
| payload.payload | object | SOME/IP 业务数据结构: 可在网络仿真页面创建对应节点,右键节点 → 复制为 JSON 即可生成。 方法请求参数需额外用数组包裹。 |
-
发布事件
{ "msgId": "2a162236d7314671b7384cdf1d434bea", "msgType": "B_SEND_ETH_REQ", "payload": { "instanceId": 1403, "actionId": "0x3", "type": 6, "actionType": "B_SIM_SERVER_EVENT_PUB_REQ", "payload": { "OnlineStReturnCode": { "requestID_Member": [ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "exception_Member": 0, "Device_ID_Member": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "BDU_hw_version_code": [ 0, 0, 0, 0, 0, 0, 0, 0 ], "BDU_sw_version_code": [ 0, 0, 0, 0, 0, 0, 0, 0 ], "trip_id_code": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "can_matrix_version_code": [ 0, 0, 0, 0, 0, 0, 0, 0 ], "config_id_code": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] } } } }
-
事件组订阅
{ "msgId": "2a162236d7314671b7384cdf1d434bea", "msgType": "B_SEND_ETH_REQ", "payload": { "instanceId": 1404, "actionId": "0x1", "type": 3, "actionType": "B_SIM_CLIENT_EVENT_GROUP_SUB_REQ" } }
-
事件组取消订阅
{ "msgId": "2a162236d7314671b7384cdf1d434bea", "msgType": "B_SEND_ETH_REQ", "payload": { "instanceId": 1404, "actionId": "0x1", "type": 3, "actionType": "B_SIM_CLIENT_EVENT_GROUP_UNSUB_REQ" } }
-
方法请求
{ "msgId": "2a162236d7314671b7384cdf1d434bea", "msgType": "B_SEND_ETH_REQ", "payload": { "instanceId": 1404, "actionId": "0x3", "type": 1, "actionType": "B_SIM_CLIENT_METHOD_REQ", "payload": [{"sigOnlineSt":{"requestID_Member":[2,1,2,3,4,5,6,0,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,0,0,0,0,0,0],"Online_Member":0}}] } }
-
方法回复
{ "msgId": "f9efc4f8276845378b3991b8e5db3f7c", "msgType": "B_SEND_ETH_REQ", "payload": { "instanceId": 1403, "actionId": "515", "type": 1, "actionType": "B_SIM_SERVER_METHOD_RES", "payload": { "OnlineStReturnCode": { "requestID_Member": [ 6, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "exception_Member": 0, "Device_ID_Member": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "BDU_hw_version_code": [ 0, 0, 0, 0, 0, 0, 0, 0 ], "BDU_sw_version_code": [ 0, 0, 0, 0, 0, 0, 0, 0 ], "trip_id_code": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "can_matrix_version_code": [ 0, 0, 0, 0, 0, 0, 0, 0 ], "config_id_code": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] } } } }
B_SEND_CAN_REQ(发送 CAN 报文)
| 字段名 | 类型 | 说明 |
|---|---|---|
| msgId | string | 随机值,用于跟踪消息返回, 同一个方法的S_SEND_ETH_RES返回会使用相同的msgId |
| msgType | string | 固定为 "B_SEND_CAN_REQ" |
| payload | object | CAN 发送消息体 |
| payload.channel | int | CAN 通道号 |
| payload.canId | string | CAN 报文 ID |
| payload.serialization | string | dbc / raw 默认dbc |
| payload.payload | object/string | 信号 JSON(dbc)或十六进制字符串(raw) |
-
can消息
{ "msgId": "2a162236d7314671b7384cdf1d434bea", "msgType": "B_SEND_CAN_REQ", "payload": { "channel": 1546, "canId": "0x280", "serialization": "dbc", "payload": { "BAC_SW": 1 } } }
S_SEND_ETH_RES(仅 请求参数异常时返回)
{
"msgId": "2a162236d7314671b7384cdf1d434bea",
"msgType": "S_SEND_ETH_RES",
"errorCode": 400,
"reason": "未找到方法定义,serviceId=8269, actionId=8211"
}
S_SEND_CAN_RES(仅 请求参数异常时返回)
{
"msgId": "test-001",
"msgType": "S_SEND_CAN_RES",
"errorCode": 400,
"reason": "请求参数不正确:CAN 报文信号【BAC_SW】值【5.0】大于最大值【1.0】"
}
S_SIM_SERVER_METHOD_REQ(接收方法请求)
| 字段名 | 类型 | 说明 |
|---|---|---|
| msgId | string | 消息唯一标识(需要记录下来,用于回复消息) |
| msgType | string | 固定为 "S_SIM_SERVER_METHOD_REQ" |
| payload | object | 方法请求消息体 |
| payload.logTs | long | 时间戳 |
| payload.instanceId | int | 仿真实例 ID |
| payload.serviceId | string | 服务 ID |
| payload.actionId | string | 方法动作 ID |
| payload.displayPayload | array | 方法参数显示数据(解析后格式) |
-
方法请求
{ "msgId": "411c9f9d9b5842c0b789cd1df37e23fd", "msgType": "S_SIM_SERVER_METHOD_REQ", "payload": { "logTs": 1766471438970101, "instanceId": 1403, "serviceId": "8269", "actionId": "3", "displayPayload": [ { "sigOnlineSt": { "requestID_Member": [ { "UUIDChar": 1 }, { "UUIDChar": 2 }, { "UUIDChar": 3 }, { "UUIDChar": 4 }, { "UUIDChar": 5 }, { "UUIDChar": 6 }, { "UUIDChar": 0 }, { "UUIDChar": 7 }, { "UUIDChar": 8 }, { "UUIDChar": 9 }, { "UUIDChar": 10 }, { "UUIDChar": 11 }, { "UUIDChar": 12 }, { "UUIDChar": 13 }, { "UUIDChar": 14 }, { "UUIDChar": 15 }, { "UUIDChar": 16 }, { "UUIDChar": 17 }, { "UUIDChar": 18 }, { "UUIDChar": 19 }, { "UUIDChar": 20 }, { "UUIDChar": 21 }, { "UUIDChar": 22 }, { "UUIDChar": 23 }, { "UUIDChar": 24 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 } ], "Online_Member": 0 } } ] } }
S_SIM_CLIENT_METHOD_RES(接收方法响应)
| 字段名 | 类型 | 说明 |
|---|---|---|
| msgId | string | 消息唯一标识 (需要保持和请求msgId一致) |
| msgType | string | 固定为 "S_SIM_CLIENT_METHOD_RES" |
| payload | object | 方法请求消息体 |
| payload.logTs | long | 时间戳 |
| payload.errCode | int | 错误码,0为正确 |
| payload.displayPayload | array | 方法参数显示数据(解析后格式) |
-
方法回复
{ "msgId": "aa82278b-1988-4a30-8efe-77e06ee65237", "msgType": "S_SIM_CLIENT_METHOD_RES", "payload": { "logTs": 1766476033962327, "errCode": 0, "displayPayload": { "OnlineStReturnCode": { "requestID_Member": [ { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 } ], "exception_Member": 0, "Device_ID_Member": [ { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 } ], "BDU_hw_version_code": [ { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 } ], "BDU_sw_version_code": [ { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 } ], "trip_id_code": [ { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 } ], "can_matrix_version_code": [ { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 } ], "config_id_code": [ { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 }, { "UUIDChar": 0 } ] } } } }