Flow启动SUMO多客户端TraCI数据采集端口及连接异常求助
Flow+SUMO多TraCI客户端问题排查与解决
问题说明
- Flow未按指定配置分配端口:明明在
SumoParams里指定了45678端口,但实际SUMO启动后用的是随机端口(比如代码里的49745) - 跨机TraCI连接异常:第二台机器能连上第一台的SUMO仿真,但连接后程序直接退出,数据没保存,第一台的仿真却能正常运行
第一台机器(仿真启动端)代码
sim_params = SumoParams(port=45678, render=VISUALIZE_SIM_IN_SUMO, sim_step=1, num_clients=2)
第二台机器(数据采集端)代码
# 因为Flow一开始没用到指定端口,得等第一台启动仿真后再看实际端口 PORT = 49745 traci.init(PORT,tc.DEFAULT_NUM_RETRIES,"second_computer.local") traci.setOrder(2) # 只要每个客户端序号唯一就行
解决建议
1. 修复Flow端口不生效的问题
- 升级Flow版本:旧版Flow存在端口参数被忽略的bug,直接更新到最新稳定版大概率能解决
- 手动指定SUMO启动命令:如果升级没用,直接给Flow传完整的SUMO启动命令,强制绑定端口:
sumo_cmd = ["sumo", "-c", "你的仿真配置文件.sumocfg", "--remote-port", "45678", "--num-clients", "2"] sim_params = SumoParams(sumo_cmd=sumo_cmd, render=VISUALIZE_SIM_IN_SUMO, sim_step=1)
- 检查端口占用:先用
netstat -ano | findstr 45678(Windows)或ss -tulpn | grep 45678(Linux)确认端口没被别的进程占用,被占的话Flow会自动换端口
2. 解决TraCI连接后立即退出的问题
- 添加持续运行循环:当前代码只做了连接和设置序号,没有持续运行逻辑,程序自然会直接结束。要加循环跟随仿真步骤,同时采集数据:
import traci import traci.constants as tc PORT = 45678 # 端口问题解决后直接用指定值 traci.init(PORT, tc.DEFAULT_NUM_RETRIES, "第一台机器的IP或主机名") # 注意填第一台的地址,不是自己的 traci.setOrder(2) try: # 只要仿真还有车辆就持续运行 while traci.simulation.getMinExpectedNumber() > 0: traci.simulationStep() # 这里添加数据采集逻辑,比如保存车辆速度 all_vehicles = traci.vehicle.getIDList() for veh_id in all_vehicles: speed = traci.vehicle.getSpeed(veh_id) # 写入数据到文件 with open("sim_data.txt", "a", encoding="utf-8") as f: f.write(f"{traci.simulation.getTime()}, {veh_id}, {speed}\n") finally: traci.close()
- 核对客户端序号:第一台的Flow客户端默认序号是1,第二台要设为2,同时
num_clients必须设为2,序号不匹配会导致客户端同步失败直接退出 - 检查网络与防火墙:确保两台机器在同一局域网,第一台的防火墙放开45678端口的入站连接,用
telnet 第一台IP 45678测试端口连通性
内容的提问来源于stack exchange,提问作者Lorenzo_1997
相关产品推荐
相关产品推荐

