简介#
变量订阅允许您一次性请求一组结构体变量,并定期检索它们。与普通值检索命令(0xa0-0xae)相比,订阅命令按“域”(即结构体的类型)进行划分:
- 命令 0xd0:从感应线圈检索信息(可检索变量列表参见 感应线圈值检索)
- 命令 0xd1:从多入口/多出口检测器检索信息(参见 多入口出口检测器值检索)
- 命令 0xd2:从交通信号灯检索信息(参见 交通信号灯值检索)
- 命令 0xd3:从车道检索信息(参见 车道值检索)
- 命令 0xd4:从车辆检索信息(参见 车辆值检索)
- 命令 0xd5:从车辆类型检索信息(参见 车辆类型值检索)
- 命令 0xd6:从路径检索信息(参见 路径值检索)
- 命令 0xd7:从兴趣点检索信息(参见 兴趣点值检索)
- 命令 0xd8:从多边形检索信息(参见 多边形值检索)
- 命令 0xd9:从路口检索信息(参见 路口值检索)
- 命令 0xda:从道路检索信息(参见 道路值检索)
- 命令 0xdb:从仿真检索信息(参见 仿真值检索)
使用“Subscribe ... Variable”命令(0xd0-0xde)启动对结构体变量的订阅。该命令在请求时立即进行评估,以此进行验证。它会返回一个“Subscribe ... Variable”响应(0xe0-0xee)。对于车辆,一旦车辆离开仿真,订阅即被取消调度。
一旦订阅被接受,它将在每次调用 仿真步进(2) 命令后执行。
命令 0xdX: Subscribe ... Variable#
| 时间 | 时间 | 字符串 | 字节 | 字节[n] |
|---|---|---|---|---|
| 开始时间 | 结束时间 | 对象 ID | 变量数量 | 要返回的变量列表 |
注意事项:
- 开始时间:仅在时间步长 >= 此值时执行订阅;单位为毫秒
- 结束时间:在时间步长 <= 此值时执行订阅;如果仿真达到更高的时间步长,则移除订阅;单位为毫秒
- 变量列表的大小必须等于“变量数量”字段。
响应 0xeX: ... Subscription Response#
| 字符串 | 字节 | 字节 | 字节 | 字节 | <返回类型> | ... | 字节 | 字节 | 字节 | <返回类型> |
|---|---|---|---|---|---|---|---|---|---|---|
| 对象 ID | 变量数量 | 变量 #1 ID | 变量 #1 状态 | 变量 #1 的返回类型 | <变量值#1> | ... | 变量 #n ID | 变量 #n 状态 | 变量 #n 的返回类型 | <变量值#n> |
对 "Subscribe ... Variable" 的响应。
如果变量可以成功检索,状态为 0x00 (RTYPE_OK)。否则,状态为 0xff (RTYPE_ERR)。在后一种情况下,变量类型设置为字符串,变量值包含错误消息。
变量数量 是返回的订阅数量。
客户端库方法#
- 在 Python 库 中,所有域都支持 subscribe 和 unsubscribe 方法
- 在 C++ 库 中,simulation.subscribe 方法接受一个额外的参数来编码域
特殊情况#
- VAR_LEADER 变量是特殊的,因为 getLeader (0x68) 命令需要一个额外的距离参数。要订阅 VAR_LEADER,Python 客户端 提供了 subscribeLeader 函数。
- VAR_PARAMETER_WITH_KEY 通用变量是特殊的,因为 getParameterWithKey (0x3e) 命令需要一个额外的键参数。要订阅 VAR_PARAMETER_WITH_KEY,Python 客户端 提供了 subscribeParameterWithKey 函数。
带参数的订阅#
除了上述两种特殊情况外,还有一种通用机制来订阅需要额外参数的值。通常,您需要向函数提供一个额外的映射(map),其中键(key)是您要订阅的变量,值(value)是参数的值(在 C++ / Java 情况下,包装在相应的 TraCIResult 对象中)。
如果您需要订阅具有多个参数的值,目前仅在 Python 中可行。您需要提供一个值元组,其中第一项描述参数的类型(总是以 "t" 开头表示元组,然后是 "d"、"i"、"s" 分别表示浮点数、整数和字符串)。第二项是参数的数量,然后是实际的参数值。
一个例子是:param = {traci.constants.VAR_STOP_SPEED: ("tdd", 2, 0., 0.)}。
