Cooperative TSN tutorial
Versões de softwares
- SO Host Principal: Ubuntu 22.04.4 LTS
- SO Host TSNSched: Ubuntu 24.04
- OMNeT++: 6.0.3
- Veins: 5.2
- SUMO: 1.11.0
- Docker: 28.1.1+1
1. Instalação do cooperativeTSN
-
Download da imagem de Docker com o comando
docker pull dr.nsm.inf.tu-dresden.de/jannusch/wons25:latest
- Verificar se a imagem foi baixada, via comando
docker images
. O resultado deve ser algo como:REPOSITORY TAG IMAGE ID CREATED SIZE dr.nsm.inf.tu-dresden.de/jannusch/wons25 latest c74d154dec49 7 months ago 12.1GB
- Cria container com a imagem baixada. Nomeie esse container como cooperativeTSN.
sudo docker run -it --name cooperativeTSN ID_IMAGEM bash
OBS: Nesse exemplo, ID_IMAGEM seria: c74d154dec49.
- Verificar se container foi criado com o comando
sudo docker ps -a
. O resultado deve ser algo como:CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a5832644e8ce c74d154dec49 "bash" About a minute ago Exited (0) 2 seconds ago cooperativeTSN
-
Acessar o container com o comando
sudo docker attach cooperativeTSN
.5.1. Atualizar pacotes do sistema
sudo apt update && sudo apt upgrade -y
5.2. Destravar PIP e instalar pacote para comunicação inter-processos.
python3 -m pip config set global.break-system-packages true
python3 -m pip install --user --upgrade posix_ipc
5.3. Aplicar variáveis de ambiente
bash docker-env.sh
-
Compilação do OMNeT++
6.1. Preparação
- Acessar pasta
omnetpp/
. - Instalar todos os pacotes necessários indicados na documentação.
sudo apt install -y build-essential clang lld gdb bison flex perl \ python3 python3-pip qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools \ libqt5opengl5-dev libxml2-dev zlib1g-dev doxygen graphviz libwebkit2gtk-4.0-37 xdg-utils
- Alteração no arquivo
configure.user
: as flagsPREFER_CLANG=
eWITH_QTENV=
devem ser alteradas de yes para no.
6.2. Compilação (aproveite para tomar um café ☕, pois isso levará algum tempo…)
source setenv
./configure
make -j $(nproc)
Se tudo der certo, a última mensagem da compilação será: Now you can type ‘omnetpp’ to start the IDE.
- Acessar pasta
-
Compilação do SUMO
7.1. Acessar diretório
sumo/
7.2. Exportar variável de ambiente
SUMO_HOME
export SUMO_HOME="$PWD"
7.3. Compilação
mkdir build/cmake-build && cd build/cmake-build
cmake ../..
make -j$(nproc)
make install
-
Compilação do cooperativeTSN
8.1. Acessar diretório
cooperativeTSN
8.2. Configurar todos os projetos
source setenv
./configure
8.3. Construa o projeto (pode tomar outro café ☕, pois isso também levará algum tempo…)
bear --append -- make -j $(nproc)
-
Criar arquivo
cooperative_tsn_run
no diretóriocooperativetsn/cooperative_tsn/bin
9.1. Acessar diretório
cooperative_tsn/bin/
9.2. Copiar modelo de arquivo
cp /opt/cooperativetsn/cooperative_tsn/src/scripts/cooperative_tsn.in.py cooperative_tsn_run
9.3. Adicionar informações abaixo no arquivo criado, especificamente entre as linhas
v-- contents of out/config.py go here
e^-- contents of out/config.py go here
.run_libs = ['../plexe/src/plexe', '../veins/subprojects/veins_inet/src/veins_inet', '../inet/src/INET', '../veins/src/veins', 'src/cooperative_tsn'] run_neds = ['../plexe/src/plexe', '../veins/subprojects/veins_inet/src/veins_inet', '../inet/src', '../veins/src/veins', 'src/cooperative_tsn'] run_excs = ['../inet/.nedexclusions'] run_imgs = ['../plexe/images', '../veins/subprojects/veins_inet/images', '../inet/images', '../veins/images', 'images']
9.4. Torne o arquivo executável
chmod +x cooperative_tsn_run
9.5. Editar arquivo
freeway.rou.xml
, emexamples/platoon_with_plexe/sumocfg/
, removendo a flaglaneChangeModel="LC2013_CC"
.9.6. Testar instalação com o comando
./run -c Sinusoidal
no diretório/opt/cooperativetsn/cooperative_tsn/examples/platoon_with_plexe/
. A saída deve contar algo como:OMNeT++ Discrete Event Simulation (C) 1992-2022 Andras Varga, OpenSim Ltd. Version: 6.0.3, build: 240223-17fcae5ef3, edition: Academic Public License -- NOT FOR COMMERCIAL USE See the license for distribution terms and warranty disclaimer Setting up Cmdenv... Loading NED files from ../../../plexe/src/plexe: 36 Loading NED files from ../../../veins/subprojects/veins_inet/src/veins_inet: 10 Loading NED files from ../../../inet/src: 1139 Loading NED files from ../../../veins/src/veins: 44 Loading NED files from ../../src/cooperative_tsn: 10 Loading NED files from .: 2 Preparing for running configuration Sinusoidal, run #0... Scenario: $nCars=5, $platoonSize=5, $nLanes=1, ... Assigned runID=Sinusoidal-0-20250917-20:20:15-346339 Setting up network "Platooning"... Initializing... Running simulation... ** Event #0 t=0 Elapsed: 1.1e-05s (0m 00s) 0% completed (0% total) Speed: ev/sec=0 simsec/sec=0 ev/simsec=0 Messages: created: 4 present: 4 in FES: 4 Loading configuration ... done. ** Event #256 t=1.0103050956 Elapsed: 1.31874s (0m 01s) 6% completed (1% total) Speed: ev/sec=194.884 simsec/sec=0.766117 ev/simsec=254.379 Messages: created: 702 present: 615 in FES: 38 ...
- Instalar ferramenta para testar conectividade via ping
apt install iputils-ping net-tools -y
-
Instalar pacotes para comunicação gRPC, no diretório
cooperativetsn/cooperative_tsn/src/gRPC/
11.1. Criar virtualenv :
set -e
python3 -m venv .venv
11.2. Acessar virtualenv :
source ./.venv/bin/activate
11.3. Instalar
requirements
no virtualenv :pip install -r requirements.txt
11.4 Sair do virtualenv :
deactivate
-
CTRL + D para fechar o container.
- Feito!
2. Instalação do TSNSched
- Criar arquivo
Dockerfile
com base neste link.- Observação: mudar
FROM ubuntu:24.10
paraFROM ubuntu:24.04
.
- Observação: mudar
- Criar imagem chamada
tsnsched
com base noDockerfile
(um terceiro café ☕ aqui? cuidado com excesso de cafeína 😅):sudo docker build -t tsnsched .
- Verificar se a imagem foi criada, via comando
docker images
. O resultado deve ser algo como:REPOSITORY TAG IMAGE ID CREATED SIZE tsnsched latest ae2fb4115639 11 minutes ago 2.04GB dr.nsm.inf.tu-dresden.de/jannusch/wons25 latest c74d154dec49 7 months ago 12.1GB
- Cria container para servidor TSN com a imagem recém criada. Nomeie esse container como
TSNSched
:sudo docker run -it --name TSNSched ID_IMAGEM bash
OBS: Nesse exemplo, ID_IMAGEM seria: ae2fb4115639.
- Instalar pacotes necessários
apt install nano iputils-ping net-tools -y
-
Clonar repositório
git clone https://github.com/Jannusch/TSNsched.git
.6.1. Acessar diretório
TSNsched/
.6.2. Executar comandos de instalação
./gradlew tasks
./gradlew installDist
./gradlew shadowJar
- Criar script
run_server.sh
para facilitar a execução#!/bin/bash java -jar /opt/TSNsched/build/libs/TSNSCHED_New-1.0-SNAPSHOT-all.jar
- Permissão de execução ao script
chmod +x run_server.sh
-
CTRL + D para fechar o container.
- Feito!
3. Execução
- Listar containers com o comando
sudo docker ps -a
. O resultado será algo como:CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 761e837ae78f c74d154dec49 "bash" 17 minutes ago Up 17 minutes cooperativeTSN 9e0826eb4ad7 ae2fb4115639 "bash" 2 hours ago Up 2 hours TSNSched
-
Iniciar primeiro o container
cooperativeTSN
, para receber automaticamente o endereço IP 172.17.0.2.- Comando para iniciar o container
sudo docker start cooperativeTSN
- Comando para acessar o container
sudo docker attach cooperativeTSN
- Atualizar variável de ambiente do OMNeT++
cd omnetpp/
source setenv
- Atualizar variável de ambiente do SUMO
cd sumo/
export SUMO_HOME="$PWD"
- Comando para iniciar o container
-
Iniciar em outro terminal o container
TSNSched
, que vai receber automaticamente o endereço IP 172.17.0.3.- Comando para iniciar o container
sudo docker start TSNSched
- Comando para acessar o container
sudo docker attach TSNSched
- Comando para iniciar o container
- No container
TSNSched
, executar o scriptrun_server.sh
. Aparecerá algo como:Sep 17, 2025 9:22:32 PM com.tsnsched.grpc.TSNschedServer start INFO: Server started, listenig on 50051
- No container
cooperativeTSN
, executar o exemplo em.../examples/platoon_with_plexe/
:./run -c Platooning-TSN
- O resultado da execução será algo como:
OMNeT++ Discrete Event Simulation (C) 1992-2022 Andras Varga, OpenSim Ltd. Version: 6.0.3, build: 240223-17fcae5ef3, edition: Academic Public License -- NOT FOR COMMERCIAL USE See the license for distribution terms and warranty disclaimer Setting up Cmdenv... Loading NED files from ../../../plexe/src/plexe: 36 Loading NED files from ../../../veins/subprojects/veins_inet/src/veins_inet: 10 Loading NED files from ../../../inet/src: 1139 Loading NED files from ../../../veins/src/veins: 44 Loading NED files from ../../src/cooperative_tsn: 10 Loading NED files from .: 2 Preparing for running configuration Platooning-TSN, run #0... Scenario: $nCars=5, $platoonSize=5, $nLanes=1, $ploegH=0.5, .... Assigned runID=Platooning-TSN-0-20250917-23:45:05-548 Setting up network "Platooning"... Initializing... Running simulation... ** Event #0 t=0 Elapsed: 1e-05s (0m 00s) 0% completed (0% total) Speed: ev/sec=0 simsec/sec=0 ev/simsec=0 Messages: created: 4 present: 4 in FES: 4 Loading configuration ... done. ** Event #256 t=1.0103050956 Elapsed: 1.99488s (0m 01s) 6% completed (1% total) Speed: ev/sec=128.83 simsec/sec=0.50645 ev/simsec=254.379 Messages: created: 731 present: 644 in FES: 42 Interrupt signal received, trying to exit gracefully.5 ACT 5 BUF 0) ** Event #21348 t=4.31 Elapsed: 2.49714s (0m 02s) 28% completed (4% total) Speed: ev/sec=41992.5 simsec/sec=6.56975 ev/simsec=6391.8 Messages: created: 20149 present: 1834 in FES: 44 ...
- Feito!
Enjoy Reading This Article?
Here are some more articles you might like to read next: