{"id":296,"date":"2021-03-11T13:43:30","date_gmt":"2021-03-11T12:43:30","guid":{"rendered":"http:\/\/blog.uclm.es\/felixvillanueva\/?p=296"},"modified":"2021-03-11T13:43:30","modified_gmt":"2021-03-11T12:43:30","slug":"argumentos-de-entrada-en-simulaciones-de-ns3","status":"publish","type":"post","link":"https:\/\/blog.uclm.es\/felixvillanueva\/2021\/03\/11\/argumentos-de-entrada-en-simulaciones-de-ns3\/","title":{"rendered":"Argumentos de entrada en simulaciones de NS3"},"content":{"rendered":"<p>Para ahorrarte trabajo, puedes configurar mediante argumentos de entrada muchos par\u00e1metros o atributos de tu simulaci\u00f3n, tanto de los m\u00f3dulos que usas de NS3, como definir tus propios par\u00e1metros. Por ejemplo, si vas a simular el tr\u00e1fico en una red lorawan con topolog\u00eda en estrella, con la pasarela en el medio, puedes poner como par\u00e1metro configurable el n\u00famero de nodos o el radio de la estrella. Este ejemplo es el que vamos a utilizar para explicar c\u00f3mo gestionar los argumentos de entrada. El archivo que usaremos es el <a href=\"https:\/\/bitbucket.org\/FelixVillanueva\/ns3.tutorial\/src\/master\/iot\/\">lorawan.cc del repositorio<\/a>. Necesitar\u00e1s instalar el m\u00f3dulo de lorawan como indicamos <a href=\"https:\/\/blog.uclm.es\/felixvillanueva\/2020\/10\/05\/instalar-el-modulo-lorawan-en-ns3\/\">aqu\u00ed<\/a><\/p>\n<p>Si copiamos el archivo lorawan.cc al directorio scratch de nuestra instalaci\u00f3n NS3 podemos ver qu\u00e9 argumentos podemos definir por la linea de comandos mediante la opci\u00f3n &#8211;PrintHelp, esto es:<br \/>\n<code><br \/>\n$ .\/waf --run \"lorawan --PrintHelp\"<br \/>\nlorawan [Program Options] [General Arguments]<br \/>\n[...]<br \/>\nProgram Options:<br \/>\n--radio:     Radio of the disc where random put the nodes [20]<br \/>\n--numnodes:  Num. nodes in the grid for simulating [20]<\/code><\/p>\n<p><code><br \/>\n<\/code><code>General Arguments:<br \/>\n--PrintGlobals:              Print the list of globals.<br \/>\n--PrintGroups:               Print the list of groups.<br \/>\n--PrintGroup=[group]:        Print all TypeIds of group.<br \/>\n--PrintTypeIds:              Print all TypeIds.<br \/>\n--PrintAttributes=[typeid]:  Print all attributes of typeid.<br \/>\n--PrintHelp:                 Print this help message.<br \/>\n<\/code><br \/>\nComo podemos ver, despu\u00e9s de los mensajes de compilaci\u00f3n (sustituidos por [&#8230;]), podemos ver que el programa lorawan tiene definidos dos opciones, el radio y el numnodes, indicando el radio de la estrella y el n\u00famero de nodos respectivamente. El n\u00famero por defecto en ambos casos y si no indicamos esas opciones es 20. Si queremos simular 3 nodos en una topolog\u00eda en estrella con un radio de 10 metros, solo tendremos que indicarlo en l\u00ednea de argumentos:<br \/>\n<code>$ .\/waf --run \"lorawan --numnodes=3 --radio=10\"<br \/>\n[...]<br \/>\n<\/code><br \/>\nSi analizamos el archivo lorawan.cc, la definici\u00f3n de argumentos es relativamente sencilla, en primer lugar se indica que vamos a parsear la l\u00ednea de comandos en busca de atributos y se definen las variables que almacenar\u00e1n los valores que se pasen por l\u00ednea de comandos:<br \/>\n<code><br \/>\n#include \"ns3\/command-line.h\"<br \/>\n[...]<br \/>\ndouble radio = 20.0;<br \/>\nint numnodes = 20;<br \/>\n<\/code><br \/>\nA continuaci\u00f3n se definen los valores esperados en l\u00ednea de argumentos, en nuestro ejemplo, lo hacemos mediante una funci\u00f3n que definimos antes del main y a\u00f1adimos al final. En esta funci\u00f3n creamos la variable que almacenar\u00e1 y parsear\u00e1 los argumentos y a\u00f1adimos nuestros dos argumentos esperados mediante AddValue:<br \/>\n<code><br \/>\nCommandLine setupcmd(){<br \/>\nCommandLine cmd;<br \/>\ncmd.AddValue (\"radio\", \"Radio of the disc where random put the nodes\", radio);<br \/>\ncmd.AddValue (\"numnodes\", \"Num. nodes in the grid for simulating\",numnodes);<br \/>\nreturn cmd;<br \/>\n}<br \/>\n<\/code><br \/>\ncomo puedes ver indicamos el nombre, una peque\u00f1a ayuda y las variables que van a almacenar los valores.<br \/>\nFinalmente, parseamos la l\u00ednea de comandos:<br \/>\n<code><br \/>\n[..]<br \/>\nCommandLine cmd =setupcmd();<br \/>\ncmd.Parse (argc, argv);<br \/>\n[..]<br \/>\n<\/code><br \/>\nCon lo que en las variables definidas a tal efecto, guardaremos los valores que le pasemos.<\/p>\n<p>Aparte de poder definir nuestros propios argumentos de entrada para configurar nuestras simulaciones, muchos m\u00f3dulos que usamos tienen sus propios atributos configurables por l\u00edneas de comandos. Por ejemplo, si queremos ver un listado de todos los m\u00f3dulos disponibles, podemos verlos con la opci\u00f3n &#8211;PrintTypeIds<br \/>\n<code><br \/>\n.\/waf --run \"lorawan --PrintTypeIds\"<br \/>\nWaf: Entering directory `\/home\/felix\/tools\/ns-allinone-3.30\/ns-3.30\/build'<br \/>\nWaf: Leaving directory `\/home\/felix\/tools\/ns-allinone-3.30\/ns-3.30\/build'<br \/>\nBuild commands will be stored in build\/compile_commands.json<br \/>\n'build' finished successfully (1.112s)<br \/>\nRegistered TypeIds:<br \/>\nns3::A2A4RsrqHandoverAlgorithm<br \/>\nns3::A3RsrpHandoverAlgorithm<br \/>\n[..]<br \/>\nns3::LoraChannel<br \/>\nns3::LoraInterferenceHelper<br \/>\nns3::LoraNetDevice<br \/>\nns3::LoraPhy<br \/>\nns3::LoraRadioEnergyModel<br \/>\nns3::LoraTag<br \/>\nns3::LoraTxCurrentModel<br \/>\n[...]<br \/>\n<\/code><br \/>\nEn esa larga lista, podemos explorar qu\u00e9 atributos son configurables mediante la opci\u00f3n &#8211;PrintAttributes y el identificador o nombre del m\u00f3dulo. Por ejemplo, si queremos saber qu\u00e9 atributos puedo especificar mediante l\u00ednea de comandos del m\u00f3dulo de ns3 LoraRadioEnergyModel, podemos ejecutar:<br \/>\n<code><br \/>\n$ .\/waf --run \"lorawan --PrintAttributes=ns3::LoraRadioEnergyModel\"<br \/>\nWaf: Entering directory `\/home\/felix\/tools\/ns-allinone-3.30\/ns-3.30\/build'<br \/>\nWaf: Leaving directory `\/home\/felix\/tools\/ns-allinone-3.30\/ns-3.30\/build'<br \/>\nBuild commands will be stored in build\/compile_commands.json<br \/>\n'build' finished successfully (1.063s)<br \/>\nAttributes for TypeId ns3::LoraRadioEnergyModel<br \/>\n--ns3::LoraRadioEnergyModel::RxCurrentA=[0.0112]<br \/>\nThe radio Rx current in Ampere.<br \/>\n--ns3::LoraRadioEnergyModel::SleepCurrentA=[1.5e-06]<br \/>\nThe radio Sleep current in Ampere.<br \/>\n--ns3::LoraRadioEnergyModel::StandbyCurrentA=[0.0014]<br \/>\nThe default radio Standby current in Ampere.<br \/>\n--ns3::LoraRadioEnergyModel::TxCurrentA=[0.028]<br \/>\nThe radio Tx current in Ampere.<br \/>\n--ns3::LoraRadioEnergyModel::TxCurrentModel=[0]<br \/>\nA pointer to the attached tx current model.<\/code><\/p>\n<p><code><br \/>\n<\/code><code><\/code><br \/>\nDonde podemos ver que podemos definir la corriente de env\u00edo, recepci\u00f3n, dormir, etc.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para ahorrarte trabajo, puedes configurar mediante argumentos de entrada muchos par\u00e1metros o atributos de tu simulaci\u00f3n, tanto de los m\u00f3dulos que usas de NS3, como definir tus propios par\u00e1metros. Por ejemplo, si vas a simular el tr\u00e1fico en una red &hellip; <a href=\"https:\/\/blog.uclm.es\/felixvillanueva\/2021\/03\/11\/argumentos-de-entrada-en-simulaciones-de-ns3\/\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":182,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,5,6],"tags":[10,11,26,27,29,35,38],"class_list":["post-296","post","type-post","status-publish","format-standard","hentry","category-ns3","category-simulacion","category-tutorial","tag-argumentos","tag-atributos","tag-iot","tag-iot-ns3-ejemplo","tag-lorawan","tag-redes","tag-simulacion"],"_links":{"self":[{"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/posts\/296","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=296"}],"version-history":[{"count":0,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/posts\/296\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/media?parent=296"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/categories?post=296"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/tags?post=296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}