{"id":310,"date":"2021-04-15T10:37:41","date_gmt":"2021-04-15T09:37:41","guid":{"rendered":"https:\/\/blog.uclm.es\/felixvillanueva\/?p=310"},"modified":"2021-04-15T10:37:41","modified_gmt":"2021-04-15T09:37:41","slug":"simulando-consumo-de-energia-en-ns3-ii","status":"publish","type":"post","link":"https:\/\/blog.uclm.es\/felixvillanueva\/2021\/04\/15\/simulando-consumo-de-energia-en-ns3-ii\/","title":{"rendered":"Simulando consumo de energ\u00eda en NS3 (II)"},"content":{"rendered":"<p>Seguimos explicando el modelo de simulaci\u00f3n del consumo de energ\u00eda. Ya <a href=\"https:\/\/blog.uclm.es\/felixvillanueva\/2020\/10\/02\/simulando-consumo-de-energia-en-ns3\"> explicamos en la primera entrada relativa a la energ\u00eda <\/a> los conceptos b\u00e1sicos modelados en NS3. Seguimos trabajando con el ejemplo b\u00e1sico examples\/energy\/energy-model-example.cc<\/p>\n<p>Si observamos el ejemplo, existen dos funciones a\u00f1adidas justo antes de la funci\u00f3n principal, RemainingEnergy y TotalEnergy:<br \/>\n<code><br \/>\n\/\/\/ Trace function for remaining energy at node.<br \/>\nvoid<br \/>\nRemainingEnergy (double oldValue, double remainingEnergy)<br \/>\n{<br \/>\nNS_LOG_UNCOND (Simulator::Now ().GetSeconds ()<br \/>\n&lt;&lt; \"s Current remaining energy = \" &lt;&lt; remainingEnergy &lt;&lt; \"J\");<br \/>\n}<\/code><\/p>\n<p><code>\/\/\/ Trace function for total energy consumption at node.<br \/>\nvoid<br \/>\nTotalEnergy (double oldValue, double totalEnergy)<br \/>\n{<br \/>\nNS_LOG_UNCOND (Simulator::Now ().GetSeconds ()<br \/>\n&lt;&lt; \"s Total energy consumed by radio = \" &lt;&lt; totalEnergy &lt;&lt; \"J\");<br \/>\n}<br \/>\n<\/code><br \/>\nEstas funciones, como podemos ver, imprimen la energ\u00eda que queda en la fuente de energ\u00eda y el total de energ\u00eda consumida por la radio.<\/p>\n<p>Para invocar estas funciones cuando existe un cambio en la energ\u00eda restante y\/o energ\u00eda consumida, debemos enlazar las funciones anteriores a los cambios de estado de la fuente de energ\u00eda y del modelo de energ\u00eda consumido respectivamente. De esta forma, obtenemos primero una referencia a la fuente de energ\u00eda con ID 1. A continuaci\u00f3n, mediante la funci\u00f3n  TraceConnectWithoutContext, vinculamos el cambio de estado en RemainingEnergy a una llamada a la misma funci\u00f3n, mediante MakeCallBack y un puntero a la funci\u00f3n deseada, en este caso RemainingEnergy tambi\u00e9n:<br \/>\n<code><br \/>\nPtr basicSourcePtr = DynamicCast (sources.Get (1));<br \/>\nbasicSourcePtr-&gt;TraceConnectWithoutContext (\"RemainingEnergy\", MakeCallback (&amp;RemainingEnergy));<br \/>\n<\/code><br \/>\nA continuaci\u00f3n se sigue el mismo proceso obteniendo el modelo de consumo de energ\u00eda de un dispositivo:<br \/>\n<code><br \/>\n\/\/ device energy model<br \/>\nPtr basicRadioModelPtr =<br \/>\nbasicSourcePtr-&gt;FindDeviceEnergyModels (\"ns3::WifiRadioEnergyModel\").Get (0);<br \/>\nNS_ASSERT (basicRadioModelPtr != NULL);<br \/>\nbasicRadioModelPtr-&gt;TraceConnectWithoutContext (\"TotalEnergyConsumption\", MakeCallback (&amp;TotalEnergy));<br \/>\n<\/code><br \/>\nDe esta forma se tracean los cambios de estado en las fuentes de energ\u00eda,  que simulan bater\u00edas, modelos de energ\u00eda, que simulan el consumo de las tarjetas de red, y los recolectores de energ\u00eda que simular\u00edan paneles solares, viento, etc.<\/p>\n<p>La funci\u00f3n TraceconnectWithoutContext conecta una fuente de trazas (es decir, algo que representa un estado dentro de NS3 y que puede cambiar) con una funci\u00f3n. Identificaremos estas fuentes de trazas por que son variables de la plantilla TracedValue, por ejemplo, puedes ver en la definici\u00f3n <a href=\"https:\/\/www.nsnam.org\/docs\/release\/3.31\/doxygen\/basic-energy-source_8h_source.html\">BasicEnergySource<\/a> tiene una variable <code> TracedValue m_remainingEnergyJ;<\/code> que es susceptible de ser traceada mediante una funci\u00f3n asociada con TraceconnectWithoutContext asoc\u00edandole una funci\u00f3n que tenga como argumentos el valor antiguo y nuevo. El tipo de argumentos en este caso ser\u00e1 double. La documentaci\u00f3n de cada clase proporciona qu\u00e9 TracedSources tiene para usar este mecanismo (e.g. <a href=\"https:\/\/www.nsnam.org\/docs\/release\/3.31\/doxygen\/classns3_1_1_basic_energy_source.html#details\">BasicEnergySource<\/a>).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seguimos explicando el modelo de simulaci\u00f3n del consumo de energ\u00eda. Ya explicamos en la primera entrada relativa a la energ\u00eda los conceptos b\u00e1sicos modelados en NS3. Seguimos trabajando con el ejemplo b\u00e1sico examples\/energy\/energy-model-example.cc Si observamos el ejemplo, existen dos funciones &hellip; <a href=\"https:\/\/blog.uclm.es\/felixvillanueva\/2021\/04\/15\/simulando-consumo-de-energia-en-ns3-ii\/\">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":[23,26,30,37,40],"class_list":["post-310","post","type-post","status-publish","format-standard","hentry","category-ns3","category-simulacion","category-tutorial","tag-energia","tag-iot","tag-ns3","tag-sensores","tag-simulador"],"_links":{"self":[{"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/posts\/310","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=310"}],"version-history":[{"count":0,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/posts\/310\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/media?parent=310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/categories?post=310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/tags?post=310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}