La clase Node y NetDevice, junto con el canal de comunicación, simulan el hardware de nuestra red. Un objeto de la clase Node podríamos identificarlo con un PC, un móvil, un sensor, etc. es decir cualquier dispositivo de cómputo donde vamos a instalar cosas. Al igual que los dispositivos de cómputo en la realidad, los objetos de la clase Node necesitan interfaces de red para comunicarse. Estas interfaces de red son de una tecnología específica (Bluetooth, Wifi, Ethernet, LTE, etc.). Al igual que en la realidad, un objeto Node puede tener mas de un interfaz de red. Las interfaces de red en NS3 vienen representadas por objetos de la clase específica de la tecnología que hereda de la clase abstracta NetDevice.
Por ejemplo una interfaz wifi viene representada por la clase WifiNetDevice que hereda de NetDevice.
El ejemplo mínimo de creación de un nodo lo podemos ver con el ejemplo node1.cc . Es un ejemplo que crea un único nodo y obtiene su ID. Cada nodo tiene un Id único. La variable n es, a todos los efectos, una caja vacía donde luego instalaremos y configuraremos el resto de cosas.
Si ponemos el archivo node1.cc en el directorio scratch y lo ejecutamos con NS_LOG="Node" ./waf --run node1
veremos la información del módulo Node (es lo que indicamos con NS_LOG="Node"
antes del comando waf) y el identificador del nodo. Salvo que estes depurando, evita usar muchos LOG ya que ralentizan la simulación. Podemos habilitar el sistema de Log desde el código fuente tal y como veremos en otra entrada de blog.
El problema de crear los nodos de forma directa es que tienes que ocuparte de hacer todas las operaciones a todos los nodos. Para simplificar este proceso habitual en una simulación, NS3 dispone de la clase NodeContainer.
Si has echado un vistazo a la clase Node verás que es bastante sencilla, puedes instalar aplicaciones, puedes conectar interfaces de red y registrar manejadores o gestores de protocolos.
En vez de usar directamente la clase Node, usaremos la clase NodeContainer para este tipo de tareas. En NodeContainer.cc podemos ver que hay varias formas de crear un contenedor (añadiendo nodos ya creados, indicando el número de nodos a crear con Create, concatenando dos contenedores ya creados, etc.) con un aspecto importante a tener en cuenta, el número id de un nodo es único e irrepetible.
Al igual que otros asistentes que veremos, el NodeContainer es un contenedor inspirado en los contenedores STL.Como tal, se pueden iterar sobre sus elementos con un iterador (por ejemplo, la función imprimirContainerIds en NodeContainer.cc), concatenar contenedores (por ejemplo, el NodeContainer c del ejemplo), etc.