Vous êtes sur la page 1sur 29

UNIVERSIDADE ESTADUAL DO PIAU UESPI CURSO DE BACHARELADO EM CINCIAS DA COMPUTAO

RELATRIO DE ATIVIDADES OMNET++

LUCAS MIURA WANDERSON ANTONIO

Sumrio

1 Introduo ...................................................................................................... 2 2 Funcionamento ............................................................................................... 2 3 Tutorial ............................................................................................................ 3 3.1 Instalao .......................................................................................... 3 3.2 Exemplo pratico ............................................................................... 9

1. INTRODUO OMNeT++ um framework de simulao modular de eventos discretos de redes orientado objeto. Tem uma arquitetura genrica, para que possa ser (e tem sido) usado em vrios domnios de problema: modelagem das redes de comunicaes com e sem fios modelagem de protocolo modelagem de redes de filas (queueing networks) modelagem de multiprocessadores e outros sistemas de hardware distribuda validao de arquiteturas de hardware avaliar aspectos do desempenho de sistemas de software complexos na modelagem, gerais e simulao de qualquer sistema em que a abordagem a eventos discretos adequado e pode ser facilmente mapeados em entidades de comunicao por troca de mensagens. Omnet++ frequentemente citado como um simulador de rede, quando na verdade ele no [Andras Varga et al 2010]. Ele inclui a maquinaria e ferramentas bsicas para escrever simulaes, mas ele prprio no fornece os componentes especificamente para redes de computadores, redes de filas ou de qualquer outro domnio. Em vez disso, essas reas de aplicao so suportadas por modelos de simulao de vrios frameworks, como o INET Framework (Disponvel em: <http://inet.omnetpp.org/>. Acesso em: 12 de maro de 2011>) ou Castalia (Disponvel em: <http://castalia.npc.nicta.com.au/>. Acesso em: 12 de maro de 2011>). As facilidades proporcionadas pelo Omnet++ incluem um kernel C++ e biblioteca de classes para a construo de componentes de simulao (mdulos), infra-estrutura para montar simulaes a partir destes componentes e configur-los (linguagem NED, ini); interface grfica e modo batch da simulao em tempo de execuo, um Ambiente Integrado de Desenvolvimento (IDE) baseado na plataforma Eclipse para a concepo, execuo e avaliao de simulaes; interfaces de extenso para a simulao em tempo real, emulao, MRIP, simulao paralela distribuda, conectividade de dados e assim por diante.

2. FUNCIONAMENTO DO OMNeT++ Um modelo OMNeT++ consiste das seguintes partes: Descrio da topologia com a linguagem NED - NEtwork Description (arquivos .ned) que descreve a estrutura do mdulo com parmetros, gates, etc. Arquivos NED pode ser escrito usando qualquer editor de texto, mas a IDE do Omnet++ fornece um excelente suporte para edio de texto e grfica.

Definies de mensagem (arquivos .msg). Voc pode definir vrios tipos de mensagens e adicionar campos de dados a eles. Omnet++ ir traduzir definies de mensagem em classes C++. Fontes de modulos simples. Eles so arquivos C++, com sufixo .h/.cc Quando o programa iniciado, ele primeiro l todos os arquivos NED contendo a topologia do modelo, em seguida, ele l um arquivo de configurao (geralmente chamado de omnetpp.ini). Este arquivo contm configuraes que controlam como a simulao executada, os valores dos parmetros do modelo, etc O arquivo de configurao tambm pode prescrever vrias execuo de simulao. A estrutura do modelo em Omnet++ so compostos de mdulos e conexes. Os mdulos podem ser mdulos simples (atmico) ou mdulos compostos. Mdulos simples so os componentes ativos em um modelo, e seu comportamento definido pelo programador com cdigo C++, usando as classes da biblioteca da simulao. Grupos de mdulos podem ser encapsulados em mdulos compostos, o nmero de nveis de hierarquia no limitado. As conexes so associados aos objetos de canais. Objetos de canais encapsulam comportamento do canal: propagao e transmisso de tempo de modelagem, modelagem de erro, e possivelmente outros. Os mdulos e os canais so chamados de componentes. Os componentes so representados com a classe cComponent em C++. Tendo com subclasse a classe do modulo cModule e a classe do canal cCHANNEL. cModule tem duas subclasses: cSimpleModule e cCompoundModule. O usurio define os tipos de mdulos simples pela subclasse cSimpleModule. As subclasses de cCHANNEL incluem trs tipos de canal: cDelayChannel, cIdealChannel e cDatarateChannel.

Figura 1. Arquivos NED apenas declaram a interface externamente visvel do mdulo (portes, parmetros). A definio NED no contm nenhum cdigo para definir o

funcionamento do mdulo, esta parte expressa em C++. Por padro, Omnet++ olha para classes C++ com o mesmo nome do tipo do NED. NED permite ao usurio declarar mdulos simples, e ligar e mont-las em mdulos compostos. O usurio pode rotular alguns mdulos compostos como redes, isto , independente de modelos de simulao. Os canais so outro tipo de componente, cujas instncias tambm podem ser usados em mdulos compostos.

3.

TUTORIAL

3.1 Instalao O Omnet++ pode ser instalado nos seguintes sistemas operacionais: Distribuies Linux(Ubuntu, Fedora 13, OpenSUSE e etc.) Mac OS X 10.5 e 10.6 Windows 7, Vista, XP Para mais informaes consulte o site oficial no link,

http://omnetpp.org/documentation, e veja os tutoriais e manuais que podem ajudar.

Neste tutorial iremos mostrar como instalar o Omnet++ 4.1 no Ubuntu 10.10. 3.1.1 Download Uma forma de adquirir o Omnet++ pode ser feita pelo site official:
http://omnetpp.org/component/docman/cat_view/17-downloads/1-omnet-releases

Para este caso, faa o download do arquivo .tgz. 3.1.2 Instalando os pacotes necessrios Para a instalao dos pacotes voc pode usar uma interface grfica, como o synaptic, ou por meio de linhas de comando no terminal. 3.1.2.1 Instalando pacotes pelo Terminal Abra o terminal, Applications > Accessories > Terminal Antes de instalar os pacotes, atualize os pacotes inserindo o seguinte comando no terminal: $ sudo apt-get update Para iniciar a instalao dos pacotes digite no terminal:

$ sudo apt-get install build-essential gcc g++ bison flex perl \ tcl-dev tk-dev blt libxml2-dev zlib1g-dev openjdk-6-jre \ doxygen graphviz openmpi-bin libopenmpi-dev libpcap-dev

Figura 2: Conifrmar instao de pacotes Para continuar a instalao digite Y. 3.1.2.2 Instalando pacotes pelo Synaptic Abra o synaptic, System > Administration > Synaptic Package Manager Marque os pacote abaixo para instalao: build-essential, gcc, g++, bison, flex, perl, tcl-dev, tk-dev, blt, libxml2-dev, zlib1g- dev, openjdk-6-jre, doxygen, graphviz, openmpi-bin, libopenmpi-dev, libpcap-dev

Figura 3: Selecionando pacotes para instalao.

Depois de todos os pacotes estarem marcados click em apply.

3.1.3 Descompactando o arquivo .tgz Considerando j feito o download do arquivo, omnetpp-4.1-src.tgz, copie este arquivo para o diretrio que deseja fazer a instalao. Geralmente escolhido o diretrio /home/<voc> para extrao do arquivo. Abra o terminal, entre no diretrio onde esta localizado o arquivo omnetpp-4.1src.tgz e digite o comando abaixo: $ tar xvfz omnetpp-4.1-src.tgz

3.1.4 Variveis de ambiente Depois de descompactado, ainda no terminal, entre no diretrio omnetpp-4.1 $ cd omnetpp-4.1 Digite o comando: $ . setenv Agora iremos editar o arquivo .bashrc, para isso iremos usar o gedit, no terminal digite:

$ gedit ~/.bashrc Com o arquivo aberto, no final, adicione a seguinte linha: export PATH=$PATH:$HOME/omnetpp-4.1/bin Nota: Certifique-se que o diretrio que esta sendo adicionado nesta linha, esteja referenciando a pasta omnetpp-4.1.

Figura 4: adicionando linha no final do arquivo .bashrc. Salve a alterao e feche o gedit e o terminal.

3.1.5 Configurando e compilando o Omnet++ Abra o terminal, entre na pasta omnetpp-4.1 e digite o comando: $ ./configure Ao final da operao anterior, aparecer uma linha como segue abaixo:

Figura 5: Linha de comando Copie esta linha, abra com o gedit o arquivo .bashrc e cole a linha selecionada no final deste arquivo:

Figura 6: Adicionando linha de comando no arquivo .bash.

10

Agora salve as alteraes no gedit, feche-o e logo em seguida reinicie o terminal. Entre no diretrio omnetpp-4.1 digite no terminal o comando abaixo: $ ./configure

Figura 10: Confirmao da alterao do arquivo .bashrc.

Digite o comando no terminal: $ make MODE=release Agora para instalar um atalho menu digite no terminal: $ make install-menu-item Para instalar um atalho na area de trabalho digite: $ make install-desktop-icon Inicie o Omnet++ pelo comando: $ omnetpp Fim de instalao.

11

3.2 Exemplo prtico Neste exemplo iremos implementar no Omnet++ uma rede simples com 9 ns. Por esses ns, ir passar uma mensagem registrando o n corrente, para ser exibido no prximo n, e o numero de saltos dados pela mensagem. Em cada n, por onde passa a mensagem, ser exibido no console o Id do n anterior, com exceo do primeiro n, e uma mensagem informando o registro do n corrente na mensagem. Depois de a mensagem ter passado por todos os ns, ser exibido o numero de saltos dados pela mensagem e o numero de ns na rede. Este tutorial esta divido em 4 passos: criao do projeto, criao de arquivos (.ned, .cc e .msg), implementao e execuo. Na fase de criao de projeto, ser mostrado como criar um novo projeto no omnet++, nesse projeto ser criado uma estrutura de pastas onde ser armazenado os arquivos de uso desse projeto. Na criao de arquivos, ser destacado os principais arquivos de uso deste tutorial, onde nesses, poder ser visto a funcionalidade de cada arquivo atravs dessa aplicao pratica. Na fase de implementao, iniciaremos a insero do cdigo que ira conduzir a execuo da aplicao, para essa codificao ser usado a linguagem C++, que estar presente nos principais arquivos de uso desta aplicao. E por fim, ser mostrado como ser executado a implementao pelo console do omnet++.

3.2.1 Criao do projeto Exemplos Nesta seo ser criado um novo projeto, que ir comportar os principais arquivos de uso deste exemplo. Estes arquivos estaro organizados em pastas, sendo que estas podem ser criadas pelo usurio para estruturar o projeto a seu critrio. O omnet++ j oferece alguns projeto prontos para estudo. Com o omnet++ j iniciado, click em File>New>Project e surgir a janela ilustrada na figura 11.

Figura 11: Selecionando o assistente.

12

Selecione a opo OmneT++ Project... e clique em Next Agora iremos atribuir um nome ao projeto, como na figura 12

Figura 12: Nomeando projeto. Em seguida click em Next Na prxima janela iremos defini o contedo, conforme a figura 13

Figura 13: Selecionando template para o projeto

Selecione o template Empty project e click em Finish

13

Figura 14: Projeto EmxemploPratico.

Por fim o projeto criado, o prximo passo ser inserir os arquivos .ned, .cc e .msg

3.2.2 Criando arquivos .NEDs, .CC e .MSG Nesta seo sero criados os principais arquivos para execuo desta aplicao. Primeiro, ser criado o arquivo .ned, onde ser definida a topologia da rede deste exemplo. Em seguida ser criado o arquivo .cc, nele ser inserido o cdigo fonte em c++ para manipulao dos mdulos criados no arquivo .ned. E por fim ser criado o arquivo .msg,onde ser definido a mensagem responsvel por levar algumas informaes ao ns, mdulos simples. Ao criamos estes arquivos poderemos observar o surgimento de outros arquivos que so gerados de forma automtica pelo omnet++. Por exemplo, ao criarmos o arquivo .msg sero gerados dois outros arquivos .cc e .h. No arquivo .cc estaro os gettes e setters dos atributos criados na definio de mensagem entre outros mtodos herdados da classe cMessage. No arquivo .h, criada uma classe de mesmo nome do arquivo .msg, nesta classe estaro as declaraes de atributo e mtodos criados no arquivo .msg. Para iniciarmos, click com o boto direito do mouse sobre o projeto ExemploPratico Caso o projeto esteja fechado, escolha a opo Open project Click com o boto direito do mouse sobre o projeto ExemploPratico novamente Movimente o mouse at a opo New e selecione a opo Network Description File (NED)

14

Ir surgir uma janela, figura 15, para nomeao do arquivo .ned. Para este exemplo, nomearemos com o nome ExNED.ned. Em seguida click em Next

Figura 15: Nomeando arquivo .ned. Selecione o template Empty NED file e clique em Finish

Figura 16: Template para arquivo .ned.

15

Para o arquivo .ned o omnet oferece duas abas para sua edio, Design e Source.

Figura 17: Editor para o arquivo .ned.

No modo Design voc pode arrastar e soltar os elementos grficos para a edio do cdigo. J em Source, voc devera digitar os comando no editor do omnet++ para descrio desse arquivo. Neste exemplo usaremos o modo Source. Agora iremos criar o arquivo fonte .cc para a programao em c++ Click com o boto direito do mouse sobre o projeto ExemploPratico Movimente o mouse at a opo New e selecione a opo File

16

Figura 18: Nomeando arquivo .cc

Digite no campo do nome do arquivo ExNos.cc e click em Finish Agora iremos criar o arquivo .msg Click com o boto direito do mouse sobre o projeto ExemploPratico Movimente o mouse at a opo New e selecione a opo Message Definition (msg) Na janela que surge, figura 19, insira o nome do arquivo Msg.msg e click em Next

17

Figura 19: Nomeando arquivo .msg.

Na janela seguinte, figura 20, selecione o template Empty Message File e click em Finish

Figura 20: Template para criao de arquivo .msg.

18

Em seguida, figura 21, surgir o editor para insero de cdigo

Figura 21: Editor para o arquivo .msg. Finalizado o processo de criao de arquivos

3.2.3 Implementao do exemplo Nesta seo, ser realizada a implementao de cdigo deste exemplo pratico. Primeiro, iremos descrever a rede no arquivo .ned. No arquivo, iremos definir o modulo simples e a rede. No modulo simples sero declaradas as porta, meio de comunicao entre os mdulos. Na definio de rede sero instanciados os mdulos simples e estabelecidas as conexes entre eles. Para definir os mdulos usada a clausula simple, nela iremos encontrar a seo gates, onde ser inserido as portas do modulo. Na clausula Network, ser dividida em duas sees, submodules e connections. Em submodules, instanciado os mdulos, cada um com seus parmetros. Em connections, cada modulo criado na seo submodules ser estabelecida uma conexo. Primeiro, insira o cdigo abaixo no editor(Source) do arquivo ExNos.ned

19

package exemplopratico;

simple ExNos { gates:

// modulo simples de nome Rota

// Declarao de portas

inout port[]; // Um vetor de portas do tipo bidirecional }

No trecho de cdigo anterior definido o modulo simples de nome ExNos, declarada um vetor de uma porta de entrada e sada, inout, de nome port Insira o seguinte cdigo

network NetRota {

// Rede que comportar os mdulos simples

submodules: No1: ExNos {

// Seo de submodulos // Seo do modulo No1 do tipo ExNos // parmetro para posicionamento na tela

@display("p=370,260"); } No2: ExNos {

@display("p=472,260"); } No3: ExNos { @display("p=370,171"); } No4: ExNos { @display("p=267,260"); }

20

No5: ExNos { @display("p=370,352"); } No6: ExNos { @display("p=578,260"); } No7: ExNos { @display("p=370,73"); } No8: ExNos { @display("p=156,260"); } No9: ExNos { @display("p=370,433"); }

connections: // Seo de conexo entre os mdulos

No1.port++ <--> No2.port++; // No1 conecta de forma // bidirecional com o No2 // e incrementa o ndice do vetor // de cada N No1.port++ <--> No3.port++; No1.port++ <--> No4.port++; No1.port++ <--> No5.port++; No2.port++ <--> No6.port++; No3.port++ <--> No7.port++; No4.port++ <--> No8.port++; No5.port++ <--> No9.port++;

21

Neste trecho, mdulos do tipo ExNos so instanciados na seo submodules. E suas conexes so estabelecidas na seo connections. No final o cdigo devera estar como na figura 22

Figura 22: Cdigo fonte arquivo .ned.

22

Na aba Design os mdulos podero estar disponveis como abaixo

Figura 23: Viso da rede no modo design.

Salve as alteraes Agora iremos implementar o arquivo Msg.msg Selecione o arquivo Msg.msg Insira o seguinte cdigo

23

message Msg{ int cont=0; int hopCount = 0; int No; }

// Declara uma mensagem de rotulo Msg // contador // contador de saltos

// armazena o Id do N

Finalizada a implementao do arquivo Msg.msg Salve as alteraes Segue abaixo a implementao do arquivo ExNos.cc

#include <stdio.h> #include <string.h> #include <omnetpp.h> #include "Msg_m.h"

//Classe responsvel por criar os atributos e mtodos class ExNos : public cSimpleModule // Ateno! O nome da classe deve // ser o mesmo da clausula simple no // aruivo .ned

{ private: // Declarao de atributos // contador usado para as portas

int numPortas;

protected: // Declarao de mtodos virtual int contaNo(int saltos, int voltas); // Mtodo para contagem // de Ns na rede virtual void forwardMessage(Msg *msg); // Mtodo para passagem de // mensagem virtual void initialize(); // Mtodo para inicializao // dos Ns

24

virtual void handleMessage(cMessage *msg);

// Mtodo para // comunicao entre // os Ns atravs de // uma mensagem

}; Define_Module(ExNos); // Registra na classe C++ o module simples, de // mesmo nome da classe, do arquivo .NED //Mtodo para inicializao do N corrente void ExNos::initialize() {

int n = gateSize("port");

// inicializa para cada N o // numero de sua respectivas // portas

numPortas=n; if (strcmp(getName(),"No1")==0) { Msg *msg = new Msg("Menssagem"); scheduleAt(1.0, msg); } } // Mtodo para troca de mensagem entre os Ns // O N corrente recebe a mensagem do N anterior void ExNos::handleMessage(cMessage *msg) { Msg *ttmsg = check_and_cast<Msg *>(msg); // Converso de uma // varivel do tipo // cMessage para o // tipo Msg //Definindo mensagem de // contudo Menssagem // funo de agendamento // de mensagens // Inicia no No1 o envio da // mensagem

25

forwardMessage(ttmsg); } //Mtodo para movimentao da mensagem entre os Ns void ExNos::forwardMessage(Msg *msg) { msg->setHopCount(msg->getHopCount()+1);

// Invoca o metodo // forwardMessagem

// Incrementa o numero de // saltos dados pela // mensagem // Declarao da varivel // copy do Tipo // Msg(SubClasse cMessage)

Msg *copy;

if (numPortas>0){

// Se o numero de portas de um n for maior // que zero ser mostrado no console o Id do // N que a mensagem acabou de passar e uma // mensagem de registro do Id do N corrente

EV<<"NoId anterior: "<<msg->getNo()<<"\n"; EV<<"Registrando "<<getName()<<" na menssagem. "; msg->setNo(getId()-1); copy = (Msg *) msg->dup(); send(copy, "port$o",(numPortas-1)); // Copia a mensagem do // remetente // Envia a copia dessa // mensagem para // a porta de nome "port" // de inicial "$o" // para a porta "numPortas// 1" numPortas--; }else{ int nos=contaNo((msg->getHopCount()-1),1); // Invoca o mtodo // contaNo() para // Decrementa o numero de // portas no No corrente

26

// retornar o numero // de Ns na rede if (strcmp(getName(),"No1")==0){ EV<<"Saltos totais: "<<(msg->getHopCount()-1)<<"\n"; EV<<"Numero de Ns na rede: "<<nos<<"\n"; } } } // Mtodo para contar o numero de N na rede int ExNos::contaNo(int saltos, int voltas){ int nos=0; nos = (saltos/voltas)-((saltos/voltas)/2); // Relao para retornar o // numero de N pelo o numero // saltos dados pela // mensagens e numero de // voltas dadas // rede

return nos+1; }

Pronto, terminada a seo de implementao

3.2.4 Execuo Nesta seo iremos executar o que foi feito na seo anterior. A execuo ser realizada no arquivo ExNED.ned. Ao executar, o omnet++ oferece uma interface grfica com uma simulao animada do que esta acontecendo na rede. No OMNeT++/Tkenv, janela que oferece o controle central da simulao, possvel observar o console com as informaes de cada evento da simulao.

27

Figura 24: Exemplo depois da implementao A figura acima mostra a interface grfica de animao da simulao em tempo de execuo A segui, exibido o OMNeT++/Tkenv, com as informaes de execuo de cdigo em tempo de execuo. Neste exemplo, informado no console o n anterior em que a mensagens estava, uma informao de registro na mensagem do n corrente e ao final exibido a quantidade de saltos dados pela mensagem na rede o nmero de ns da rede.

28

Figura 25: OMNeT++/Tkenv Para executar este exemplo, click com o boto direito do mouse encima do projeto ExemploPratico Arraste o mouse para a opo Build Configurations > Build e selecione a opo All nota: a construo do projeto, tambm, pode ser realizada pela opo Build Project Ainda no ProjectExplorer, navegador de projetos, click com o boto direito do mouse no arquivo ExNED.ned Leve o mouse at a opo Run As e selecione a opo 1 OMNeT++ Simulation... Click em Run (ou pressione F5 ) para iniciar a simulao

29

Figura 26: Execuo do exemplo.

Fim da fase de execuo.