{"id":368,"date":"2023-05-29T12:12:35","date_gmt":"2023-05-29T12:12:35","guid":{"rendered":"https:\/\/blog.uclm.es\/felixvillanueva\/?p=368"},"modified":"2023-05-29T12:12:35","modified_gmt":"2023-05-29T12:12:35","slug":"emulacion-en-ns3","status":"publish","type":"post","link":"https:\/\/blog.uclm.es\/felixvillanueva\/2023\/05\/29\/emulacion-en-ns3\/","title":{"rendered":"Emulaci\u00f3n en NS3"},"content":{"rendered":"\n<p>El proceso de simulaci\u00f3n en el simulador NS3 es el m\u00e1s ampliamente utilizado. Ya lo hemos visto en entradas anteriores. Una caracter\u00edstica menos conocida y menos utilizada que te permite NS3 es la emulaci\u00f3n. Efectivamente, <a href=\"https:\/\/www.nsnam.org\/docs\/models\/html\/emulation-overview.html\">NS3<\/a> te permite crear un escenario (nodos, pila de protocolos y aplicaciones) y que el tr\u00e1fico generado por ese escenario \u00absalga\u00bb al mundo real. Por ejemplo, podemos crear un sensor en ns3 que genere tr\u00e1fico de forma que el servidor que recoge la informaci\u00f3n no distinga si es un sensor real o no. Las aplicaciones de la emulaci\u00f3n son muy numerosas, por ejemplo, para testear servicios software reales , probar configuraciones, crear perfiles de tr\u00e1fico, etc.<\/p>\n\n\n\n<p>Vamos a ver un ejemplo de c\u00f3mo crear este tipo de escenarios, y luego iremos viendo cosas concretas. Nuestro objetivo es generar tr\u00e1fico <a href=\"https:\/\/blog.uclm.es\/felixvillanueva\/2020\/10\/05\/instalar-el-modulo-lorawan-en-ns3\/\" data-type=\"post\" data-id=\"208\">LoraWan<\/a> de un nodo a una pasarela en NS3 y que ese tr\u00e1fico salga por una interfaz virtual que se crea en el ordenador que ejecuta la simulaci\u00f3n.<\/p>\n\n\n\n<p>La parte de la simulaci\u00f3n LoraWan ya la hemos visto y tenemos<a href=\"https:\/\/bitbucket.org\/FelixVillanueva\/ns3.tutorial\/src\/master\/iot\/\"> un ejemplo en los repositorios de este blog<\/a>. Sigue las instrucciones para hacer el ejemplo si no lo has hecho todav\u00eda. <\/p>\n\n\n\n<p>Vamos a partir de ese ejemplo de LoraWan b\u00e1sico que constaba de un nodo lora representando un sensor y una pasarela o hub que recib\u00eda ese tr\u00e1fico. <\/p>\n\n\n\n<p class=\"has-text-align-left\">Bien, vamos a coger ese ejemplo y vamos a modificarlo para que ese tr\u00e1fico lora salga por una interfaz de red virtual  que se crea en el ordenador que ejecuta la simulaci\u00f3n. Para ello necesitamos dos cosas, una es a\u00f1adir un nodo que denominaremos \u00abfantasma\u00bb que recoja el tr\u00e1fico de la red que llega a la pasarela LoraWan y la saque por la interfaz virtual. El otro elemento que necesitamos es una aplicaci\u00f3n que reciba el tr\u00e1fico de la interfaz LoRa y lo reenv\u00ede por una interfaz CSMA (Ethernet). Esa aplicaci\u00f3n la instalaremos en la pasarela LoraWan y le a\u00f1adiremos una interfaz CSMA. Al otro extremo de la interfaz CSMA conectaremos el nodo ghost que ser\u00e1 al que tendremos que conectar la interfaz virtual del tipo \u00ab<a href=\"https:\/\/www.nsnam.org\/docs\/release\/3.15\/doxygen\/classns3_1_1_tap_bridge.html\">TapBridge\u00bb<\/a>.<\/p>\n\n\n\n<p>Para ello, creamos una interfaz tapBridge, con su asistente:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<code>\nTapBridgeHelper tapBridge;<br>tapBridge.SetAttribute (\"Mode\", StringValue (\"ConfigureLocal\"));<br>tapBridge.SetAttribute (\"DeviceName\", StringValue (\"virtualtwin\"));\n<\/code>\n\n\n\n<p>Ahora vamos a crear un asistente para crear una red Ethernet que conecte el Ghostnode, y el hub que recoge el tr\u00e1fico LoraWan, \u00e9ste ghostnode ser\u00e1 el que cree la interfaz virtual. Podr\u00edamos hacer que el hub que recoge el tr\u00e1fico LoraWan creara la interfaz virtual, pero realmente los gateways\/hub realmente recogen el tr\u00e1fico y lo reenvian a una interfaz Ethernet y quer\u00edamos modelar tambi\u00e9n ese paso:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nNodeContainer ghostNode;\nghostNode.Create(1);\nghostNode.Add(hub.Get(0));\nCsmaHelper csma;\ncsma.SetChannelAttribute (\"DataRate\", StringValue (\"100Mbps\"));\ncsma.SetChannelAttribute (\"Delay\", TimeValue (NanoSeconds (6560)));\n\nNetDeviceContainer hubDevice = csma.Install(ghostNode);<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>B\u00e1sicamente se a\u00f1ade el hub (que ya lo hab\u00edamos creado previamente) al nuevo contenedor de nodos y se conectan todos a un canal csma. La expresi\u00f3n hub.Get(0) devuelve el nodo en la posici\u00f3n 0 del asistente de creador de nodos o contenedor de nodos,  hub. Ese contenedor s\u00f3lo ten\u00eda un nodo.  <\/p>\n\n\n\n<p>Asignamos la direcci\u00f3n IP en ese canal:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><code>InternetStackHelper stack;<br>stack.Install (ghostNode);<br>Ipv4AddressHelper address;<br>address.SetBase (\"10.0.0.0\", \"255.255.255.0\");<br>Ipv4InterfaceContainer p2pInterfaces;<br>p2pInterfaces = address.Assign(hubDevice);<\/code><\/p>\n\n\n\n<p><code>tapBridge.Install(hub.Get(0),hubDevice.Get(0));<\/code><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>y ya solo nos falta instalar las aplicaciones pertinentes, la primera es la aplicaci\u00f3n que simular\u00e1 el tr\u00e1fico del sensor, ya la hemos visto:<\/p>\n\n\n\n<p><code>PeriodicSenderHelper periodicSenderHelper;<br>periodicSenderHelper.SetPeriod (Seconds (12));<br>periodicSenderHelper.Install (nodes);<\/code><\/p>\n\n\n\n<p>Tambi\u00e9n necesitamos una aplicaci\u00f3n que recoja toda la informaci\u00f3n que le llega a la interfaz  lorawan del hub y la reenv\u00ede por la interfaz csma que le hemos a\u00f1adido. Por defecto, esa aplicaci\u00f3n no existe, por lo que la hemos tenido que crear junto con su asistente para instalarlo. En otra entrada de blog la analizaremos, por el momento vamos a ver que se \u00abinstala\u00bb en el hub como otra aplicaci\u00f3n cualquiera:<\/p>\n\n\n\n<p><code>ForwardercdmaHelper ForwardercdmaHelper;<br>ForwardercdmaHelper.Install (hub);<\/code><\/p>\n\n\n\n<p>Hemos incluido el c\u00f3digo de esa aplicaci\u00f3n (ForwaredercdmaHelper) en el ejemplo de esta entrada.<\/p>\n\n\n\n<p>Al ejecutar la simulaci\u00f3n podemos ver c\u00f3mo se genera una interfaz \u00abvirtualtwin\u00bb mediante el comando ifconfig. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"247\" src=\"https:\/\/blog.uclm.es\/felixvillanueva\/wp-content\/uploads\/sites\/81\/2023\/05\/virtualtwin-if-1024x247.jpg\" alt=\"\" class=\"wp-image-377\" srcset=\"https:\/\/blog.uclm.es\/felixvillanueva\/wp-content\/uploads\/sites\/81\/2023\/05\/virtualtwin-if-1024x247.jpg 1024w, https:\/\/blog.uclm.es\/felixvillanueva\/wp-content\/uploads\/sites\/81\/2023\/05\/virtualtwin-if-300x72.jpg 300w, https:\/\/blog.uclm.es\/felixvillanueva\/wp-content\/uploads\/sites\/81\/2023\/05\/virtualtwin-if-768x186.jpg 768w, https:\/\/blog.uclm.es\/felixvillanueva\/wp-content\/uploads\/sites\/81\/2023\/05\/virtualtwin-if-500x121.jpg 500w, https:\/\/blog.uclm.es\/felixvillanueva\/wp-content\/uploads\/sites\/81\/2023\/05\/virtualtwin-if.jpg 1300w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Created with GIMP<\/figcaption><\/figure>\n\n\n\n<p>En esa interfaz sale todo el tr\u00e1fico que mandemos al nodo ghost, entre ellos, el tr\u00e1fico lorawan que hemos reenviado en el hub. <\/p>\n\n\n\n<p>El ejemplo completo lo podemos encontrar en el <a href=\"https:\/\/bitbucket.org\/FelixVillanueva\/ns3.tutorial\/src\/master\/emulacion\/\">directorio emulaci\u00f3n del repositorio github<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El proceso de simulaci\u00f3n en el simulador NS3 es el m\u00e1s ampliamente utilizado. Ya lo hemos visto en entradas anteriores. Una caracter\u00edstica menos conocida y menos utilizada que te permite NS3 es la emulaci\u00f3n. Efectivamente, NS3 te permite crear un &hellip; <a href=\"https:\/\/blog.uclm.es\/felixvillanueva\/2023\/05\/29\/emulacion-en-ns3\/\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":182,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,5,6],"tags":[26,30,38,43],"class_list":["post-368","post","type-post","status-publish","format-standard","hentry","category-ns3","category-simulacion","category-tutorial","tag-iot","tag-ns3","tag-simulacion","tag-tutorial"],"_links":{"self":[{"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/posts\/368","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/users\/182"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/comments?post=368"}],"version-history":[{"count":9,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/posts\/368\/revisions"}],"predecessor-version":[{"id":378,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/posts\/368\/revisions\/378"}],"wp:attachment":[{"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/media?parent=368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/categories?post=368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/tags?post=368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}