{"id":4786,"date":"2019-06-12T09:48:36","date_gmt":"2019-06-12T07:48:36","guid":{"rendered":"https:\/\/www.diarioelectronicohoy.com\/blog\/?p=4786"},"modified":"2020-06-13T21:16:22","modified_gmt":"2020-06-13T19:16:22","slug":"esp8266-programar-ota","status":"publish","type":"post","link":"https:\/\/www.diarioelectronicohoy.com\/blog\/esp8266-programar-ota","title":{"rendered":"ESP8266 programar OTA."},"content":{"rendered":"\r\n<h3 class=\"wp-block-heading\">INTRODUCCI\u00d3N \u00bfQU\u00c9 ES OTA?<\/h3>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Se trata la actualizaci\u00f3n por v\u00eda aire (OTA) es una caracter\u00edstica de los micro-controladores que tengan habilitado el WiFi en lugar de un puerto serie como los ESP8266, NodeMCU, etc. Es la capacidad que permite actualizar \/ cargar un nuevo programa al ESP8266 usando Wi-Fi (de forma inal\u00e1mbrica) o Bluetooth. Para realizar la actualizaci\u00f3n del nuevo programa, la funcionalidad se vuelve \u00fatil cuando el acceso f\u00edsico al m\u00f3dulo es limitado o nulo. Por eso OTA es extremadamente \u00fatil en caso de no tener acceso f\u00edsico al m\u00f3dulo ESP.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">La gesti\u00f3n del OTA se puede hacer usando:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">\u00b7 Arduino IDE\r\n\u00b7 Navegador web\r\n\u00b7 Servidor HTTP<\/pre>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">La primera opci\u00f3n es usar OTA principalmente para la fase de desarrollo del software, para subir los proyectos desde el IDE Arduino, la primera carga de firmware se realizar\u00e1 como hasta ahora a trav\u00e9s de un puerto serie. Si hemos implementado las rutinas OTA correctamente en el boceto, entonces todas las subidas posteriores se pueden realizar c\u00f3modamente por aire.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Las opciones del navegador web as\u00ed como el servidor HTTP, se ver\u00e1n m\u00e1s \u00fatiles despu\u00e9s de la primera implementaci\u00f3n, facilitando las actualizaciones del m\u00f3dulo como una alternativa m\u00e1s r\u00e1pida a la carga de un nuevo boceto.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">SEGURIDAD B\u00c1SICA.<\/h3>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Normalmente el m\u00f3dulo estar\u00e1 expuesto de forma inal\u00e1mbrica en el momento de actualizarlo con una nueva versi\u00f3n o boceto, esto nos plantea un inconveniente ya que el m\u00f3dulo puede ser hakeado intencionadamente y cargarlo con un c\u00f3digo fraudulento. El dilema es que en la gesti\u00f3n del OTA no existe una opci\u00f3n integrada de f\u00e1brica para la seguridad, es decir, la responsabilidad es del desarrollador, garantizar que las actualizaciones s\u00f3lo se permitan realizar desde fuentes leg\u00edtimas o autorizadas.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">El programador har\u00e1 un an\u00e1lisis de riesgos dependiendo de la aplicaci\u00f3n y decidir\u00e1 qu\u00e9 funciones de biblioteca implementar. Es tarea del desarrollador asegurarse de que, la aplicaci\u00f3n se ejecuta en el m\u00f3dulo, que se cierra el m\u00f3dulo y reinicia de manera segura una vez completada la actualizaci\u00f3n.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">En este apartado de seguridad, t\u00e9ngase en cuenta que actualmente sistemas de protecci\u00f3n por contrase\u00f1a y verificaci\u00f3n MD5 se consideran de seguridad muy d\u00e9bil. Para reducir en lo posible ser hackeado, proteger sus subidas con una contrase\u00f1a, considere la implementaci\u00f3n de otros medios de protecci\u00f3n contra la pirater\u00eda seleccionando cierto puerto OTA, exponga el m\u00f3dulo para las cargas de acuerdo con unas condiciones concretas, que para \u00abactivar\u00bb la opci\u00f3n OTA, si hay coincidencia con un c\u00f3digo dedicado a actualizar, etc.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">En la librer\u00eda\u00a0<a href=\"https:\/\/github.com\/esp8266\/Arduino\/tree\/master\/libraries\/ArduinoOTA\">ArduinoOTA<\/a>, cierta funcionalidad de protecci\u00f3n ya est\u00e1 incorporada y no requiere ninguna codificaci\u00f3n adicional por parte del desarrollador. No obstante, verifique que esta librer\u00eda para mejorar la seguridad contiene las siguientes funciones:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">void setPort(uint16_t port);\r\nvoid setHostname(const char* hostname);\r\nvoid setPassword(const char* password);<\/pre>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Cuando se procede al OTA, \u00e9ste acapara el ancho de banda y los recursos del ESP mientras se carga. Posteriormente se reiniciar\u00e1 el m\u00f3dulo y empezar\u00e1 el nuevo boceto, es el momento de analizar y comprobar la funcionalidad entre el boceto existente y el nuevo.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Puesto que el ESP se ubicar\u00e1 en un lugar remoto y adem\u00e1s controlar\u00e1 varios dispositivos, se debe poner una atenci\u00f3n a\u00f1adida por lo que suceda si un proceso de actualizaci\u00f3n se interrumpe inesperadamente. Por este y otros motivos debe poner el m\u00f3dulo en un estado seguro antes de iniciar la actualizaci\u00f3n.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Supongamos un caso concreto, el m\u00f3dulo controla un sistema de alarma en secuencia del per\u00edmetro de la vivienda. Si dicha secuencia no se apaga correctamente y queda un sensor activo, la alarma se accionar\u00e1 sin posibilidad de parar su llamada, si no se cierra al finalizar OTA y se reinicia el m\u00f3dulo, con las consecuencias que genera.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">La librer\u00eda ArduinoOTA nos proporciona unas funciones dise\u00f1adas para lograr la funcionalidad de nuestra aplicaci\u00f3n durante etapas especificas OTA, veamos en caso de si se produce un error de OTA:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">void onStart(OTA_CALLBACK(fn));\r\nvoid onEnd(OTA_CALLBACK(fn));\r\nvoid onProgress(OTA_CALLBACK_PROGRESS(fn));\r\nvoid onError(OTA_CALLBACK_ERROR (fn));<\/pre>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Usted como usuario debe hacer su propio an\u00e1lisis de riesgos como se ha dicho y dependiendo de la aplicaci\u00f3n, decida qu\u00e9 funciones de biblioteca implementar. Si es necesario, considere la implementaci\u00f3n de otros medios de protecci\u00f3n contra la pirater\u00eda, por ejemplo: ponga el m\u00f3dulo a la carga solo de acuerdo con un horario, despu\u00e9s de pulsar un bot\u00f3n, etc.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">En consecuencia y visto lo expuesto, se recomienda que el tama\u00f1o del flash del chip tenga un tama\u00f1o 2 veces el tama\u00f1o del boceto. Ya vimos en\u00a0<a href=\"https:\/\/www.hispavila.com\/funcionalidad-de-spiffs\/\">funcionalidad SPIFFS<\/a>\u00a0las capacidades de los diferentes chips de la familia ESP.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/tabla_flash-1.gif\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4790 aligncenter\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/tabla_flash-1.gif\" alt=\"\" width=\"361\" height=\"304\" \/><\/a>\r\n<figcaption>Fig. 1<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Para m\u00e1s informaci\u00f3n sobre seguridad y actualizaciones vea m\u00e1s abajo las referencias.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">EL IDE ARDUINO.<\/h3>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Durante el desarrollo del firmware como el medio m\u00e1s r\u00e1pido en la carga en serie desde el IDE Arduino especialmente adaptada a este escenario de los ESP, donde el ESP y la computadora estar\u00e1n conectados a la misma red.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Arduino a partir de la versi\u00f3n 1.6.4, permite la instalaci\u00f3n de paquetes de plataformas de terceros mediante el Administrador de tarjetas. Tienen paquetes disponibles para Windows, Mac OS y Linux (32 y 64 bits). Yo instale la versi\u00f3n actual del IDE de Arduino 1.8.7. La versi\u00f3n actual est\u00e1 en el\u00a0<a href=\"https:\/\/www.arduino.cc\/en\/main\/software\">sitio web de Arduino<\/a>.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Como siempre inicie Arduino y abra la ventana de Preferencias y en el campo\u00a0<em>URLs adicionales de Board Manager<\/em>\u00a0ingrese:\u00a0<em>https:\/\/arduino.esp8266.com\/stable\/package_esp8266com_index.json<\/em>. En el\u00a0<strong>Administrador de tablas<\/strong>\u00a0desde el men\u00fa\u00a0<strong>Herramientas&gt; Placa<\/strong>\u00a0e instale la plataforma ESP8266. Luego seleccione su placa ESP8266 en el men\u00fa Herramientas.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Adem\u00e1s de Arduino, se pueden utilizar otros medios como\u00a0<strong>LUA<\/strong>,\u00a0<strong>espota.py<\/strong>, pero se ha hecho m\u00e1s popular por su sencillez, a la mayor\u00eda de los usuarios el IDE de Arduino. Veamos los pasos que necesitamos realizar con el IDE de Arduino para programar la primera vez, porque hay que realizar una primera carga en el ESP y as\u00ed dar soporte para cargar y preparar las sucesivas actualizaciones del ESP8266 por medio de OTA.<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">1.- Instalaci\u00f3n del sistema Python.<\/h4>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Descargue el\u00a0<a href=\"https:\/\/www.python.org\/downloads\/\">Python 2.7<\/a>\u00a0(no instale Python 3.5 no es compatible). Si usted es usuario de Windows a la hora de la instalaci\u00f3n debe seleccionar la opci\u00f3n \u00ab<strong>Agregar python.exe a la ruta<\/strong>\u00ab, ya que no viene seleccionada por defecto. Al ejecutar el instalador y siga el asistente de instalaci\u00f3n.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Descargue el\u00a0<a href=\"https:\/\/www.python.org\/downloads\/\">Python 2.7<\/a>\u00a0(no instale Python 3.5 no es compatible). Si usted es usuario de Windows al ejecutar el instalador, siga el asistente de instalaci\u00f3n, en la secci\u00f3n\u00a0<em>Personalizar Python 2.7.X<\/em>, aseg\u00farese de habilitar que la \u00faltima opci\u00f3n\u00a0<em>Agregar python.exe<\/em>, que normalmente no viene habilitada.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/Python_2.jpg\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4791 aligncenter\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/Python_2.jpg\" alt=\"\" width=\"358\" height=\"260\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/Python_2.jpg 572w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/Python_2-300x218.jpg 300w\" sizes=\"auto, (max-width: 358px) 100vw, 358px\" \/><\/a>\r\n<figcaption>Fig. 2<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">2.- Instalaci\u00f3n de la librer\u00eda OTA en Arduino.<\/h4>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Si no dispone de la librer\u00eda y las herramientas para OTA\u00a0<a href=\"ota_files\/esp8266_ota.zip\">haga clic aqu\u00ed<\/a>. Ahora para instalar la librer\u00eda vaya a\u00a0<em>Programa\/Incluir librer\u00eda\/Gestor de librer\u00edas<\/em>\u00a0y navegue hasta el archivo\u00a0<strong>ESP8266_ota.zip<\/strong>\u00a0y siga la instalaci\u00f3n, si es necesario reinicie Arduino.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Este es un paso imprescindible actualizar inicialmente el firmware, para poder realizar las siguientes actualizaciones o subidas de forma inal\u00e1mbrica. Carguemos la rutina OTA en serie, el ESP8266 no tiene una actualizaci\u00f3n OTA de f\u00e1brica, por lo tanto, primero se debe cargar el firmware OTA en el ESP8266 a trav\u00e9s de la interfaz serial.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Vaya en Arduino a\u00a0<strong>Archivo\/Ejemplos<\/strong>\u00a0y elija el archivo\u00a0<strong>BasicOTA<\/strong>\u00a0como se muestra en la figura 3.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/basicota.jpg\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4792 aligncenter\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/basicota.jpg\" alt=\"\" width=\"365\" height=\"369\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/basicota.jpg 726w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/basicota-296x300.jpg 296w\" sizes=\"auto, (max-width: 365px) 100vw, 365px\" \/><\/a>\r\n<figcaption>Fig. 3<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Hagamos unos cambios en el archivo BasicOTA y sigamos, suba el boceto:<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/modificar.jpg\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4793 aligncenter\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/modificar.jpg\" alt=\"\" width=\"384\" height=\"80\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/modificar.jpg 418w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/modificar-300x62.jpg 300w\" sizes=\"auto, (max-width: 384px) 100vw, 384px\" \/><\/a>\r\n<figcaption>Fig. 4<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">El procedimiento m\u00e1s b\u00e1sico es sencillo de implementar. El siguiente boceto contiene lo m\u00ednimo necesario (la configuraci\u00f3n de la red WiFi no se detalla, pues es algo com\u00fan al uso del ESP en general).<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><a href=\"#OTA01\">Archivo m\u00ednimo OTA.<\/a><\/h3>\r\n\r\n\r\n\r\n<p>Para subir el primer archivo OTA, la configuraci\u00f3n de la red WiFi no se detalla.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>\/\/ Simple OTA\r\n#include \"ESP8266WiFi.h\" \r\n#include \"ESP8266mDNS.h\"\r\n#include \"ArduinoOTA.h\"\r\n\r\nvoid setup() {\r\n WiFi.mode(WIFI_STA);\r\n WiFi.begin(\"ssid\", \"password\");\r\n while (WiFi.waitForConnectResult() != WL_CONNECTED) {\r\n  Serial.println(\"Connection Failed! Rebooting...\");\r\n  ESP.restart();\r\n }\r\n ArduinoOTA.begin();\r\n}\r\n\r\nvoid loop() {\r\n  ArduinoOTA.handle();\r\n}<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">B\u00e1sicamente, como en otros muchos m\u00f3dulos, se configura el sistema en el\u00a0<strong>setup()<\/strong>\u00a0usando el m\u00e9todo\u00a0<strong>ArduinoOTA.begin()<\/strong>\u00a0y en cada iteraci\u00f3n del bucle de eventos, con el m\u00e9todo\u00a0<strong>ArduinoOTA.handle()<\/strong>, se comprueba si hay alg\u00fan programador intentando cargar un nuevo boceto. \u00ab<em>La librer\u00eda se encarga de todos los detalles relacionados con la programaci\u00f3n, por lo que no ser\u00eda necesario hacer nada m\u00e1s<\/em>\u00ab, esta es una visi\u00f3n muy simplista, nosotros necesitamos ir m\u00e1s all\u00e1 en nuestro camino para aprender y adquirir nuevos conocimientos.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\" style=\"text-align: left;\">El siguiente es un programa bastante m\u00e1s elaborado, aunque siempre se puede a\u00f1adir funciones en la medida que se necesiten, sin perder de vista como ya se ha comentado, el tama\u00f1o del c\u00f3digo.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><a href=\"#OTA02\">Archivo BasicOTA.<\/a><\/h3>\r\n\r\n\r\n\r\n<p>Subir el primer archivo OTA.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>\/* BasicOTA.ino\r\n*\/\r\n\r\n#include \"ESP8266WiFi.h\"\r\n#include \"ESP8266mDNS.h\"\r\n#include \"WiFiUdp.h\"\r\n#include \"ArduinoOTA.h\"\r\n\r\n#ifndef STASSID\r\n#define STASSID \"your-ssid\"\r\n#define STAPSK \"your-password\"\r\n#endif\r\n\r\nconst char* ssid = STASSID;\r\nconst char* password = STAPSK;\r\n\r\nvoid setup() {\r\nSerial.begin(115200);\r\nSerial.println(\"Booting\");\r\nWiFi.mode(WIFI_STA);\r\nWiFi.begin(ssid, password);\r\nwhile (WiFi.waitForConnectResult() != WL_CONNECTED) {\r\nSerial.println(\"Connection Failed! Rebooting...\");\r\ndelay(5000);\r\nESP.restart();\r\n}\r\n\r\n\/\/ Port defaults to 8266\r\n\/\/ ArduinoOTA.setPort(8266);\r\n\r\n\/\/ Hostname defaults to esp8266-[ChipID]\r\n\/\/ ArduinoOTA.setHostname(\"myesp8266\");\r\n\r\n\/\/ No authentication by default\r\n\/\/ ArduinoOTA.setPassword(\"admin\");\r\n\r\n\/\/ Password can be set with it's md5 value as well\r\n\/\/ MD5(admin) = 21232f297a57a5a743894a0e4a801fc3\r\n\/\/ ArduinoOTA.setPasswordHash(\"21232f297a57a5a743894a0e4a801fc3\");\r\n\r\nArduinoOTA.onStart([]() {\r\nString type;\r\nif (ArduinoOTA.getCommand() == U_FLASH) {\r\ntype = \"sketch\";\r\n} else { \/\/ U_FS\r\ntype = \"filesystem\";\r\n}\r\n\r\n\/\/ NOTE: if updating FS this would be the place to unmount FS using FS.end()\r\nSerial.println(\"Start updating \" + type);\r\n});\r\nArduinoOTA.onEnd([]() {\r\nSerial.println(\"\\nEnd\");\r\n});\r\nArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {\r\nSerial.printf(\"Progress: %u%%\\r\", (progress \/ (total \/ 100)));\r\n});\r\nArduinoOTA.onError([](ota_error_t error) {\r\nSerial.printf(\"Error[%u]: \", error);\r\nif (error == OTA_AUTH_ERROR) {\r\nSerial.println(\"Auth Failed\");\r\n} else if (error == OTA_BEGIN_ERROR) {\r\nSerial.println(\"Begin Failed\");\r\n} else if (error == OTA_CONNECT_ERROR) {\r\nSerial.println(\"Connect Failed\");\r\n} else if (error == OTA_RECEIVE_ERROR) {\r\nSerial.println(\"Receive Failed\");\r\n} else if (error == OTA_END_ERROR) {\r\nSerial.println(\"End Failed\");\r\n}\r\n});\r\nArduinoOTA.begin();\r\nSerial.println(\"Ready v 1.0\");\r\nSerial.print(\"IP address: \");\r\nSerial.println(WiFi.localIP());\r\n}\r\n\r\nvoid loop() {\r\nArduinoOTA.handle();\r\n}<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Ahora abrimos el monitor serie y si todo ha ido bien nos mostrar\u00e1 la direcci\u00f3n IP de nuestro enrutador, anote la IP. Seg\u00fan la documentaci\u00f3n de la librer\u00eda, cuando cargas el programa con la gesti\u00f3n de OTA, en unos segundos aparecer\u00e1 la opci\u00f3n de un puerto OTA en el IDE como se aprecia en la figura 5.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/nuevo-puerto-ota.jpg\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4795 aligncenter\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/nuevo-puerto-ota.jpg\" alt=\"nuevo-puerto-ota\" width=\"355\" height=\"314\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/nuevo-puerto-ota.jpg 710w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/nuevo-puerto-ota-300x265.jpg 300w\" sizes=\"auto, (max-width: 355px) 100vw, 355px\" \/><\/a>\r\n<figcaption>Fig. 5<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Ahora nuestro ESP8266 est\u00e1 preparado para la carga de la nueva versi\u00f3n del programa v\u00eda aire (OTA). De modo que una vez cargado un primer programa como cargador OTA, nuestro ESP est\u00e1 predispuesto a ser actualizado por v\u00eda aire (OTA) .<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">3.- Carga de un nuevo boceto por el aire (v\u00eda WIFI).<\/h4>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Una vez hayamos terminado de subir el anterior archivo BasicOTA, ha llegado el momento de subir un nuevo archivo de forma inal\u00e1mbrica. Recordemos que siempre debemos agregar el c\u00f3digo OTA en cada boceto que carguemos, de lo contrario se perder\u00e1 la capacidad de OTA y no podr\u00e1n realizar las siguientes subidas por aire.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Ya disponemos de la IP de la red (que hemos guardado) y disponemos del puerto que hemos seleccionado (por defecto, 8266), por supuesto es necesario que estemos conectados de alg\u00fan modo a la misma red.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><a href=\"#OTA03\">Nuevo Archivo BasicOTA.<\/a><\/h3>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Para la prueba, es el mismo archivo OTA. Se ha modificado y activa un LED.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>\/\/ Nuevo_Archivo_BasicOTA.ino\r\n#include \"ESP8266WiFi.h\"\r\n#include \"ESP8266mDNS.h\"\r\n#include \"WiFiUdp.h\"\r\n#include \"ArduinoOTA.h\"\r\n\r\nconst char* ssid = \"..........\";\r\nconst char* password = \"..........\";\r\n\r\n\/\/ * nuevo\r\n\/\/ variables para blinking un LED con Millis\r\nconst int led = D0; \/\/ ESP8266 Pin a bordo al que est\u00e1 conectado el LED\r\nunsigned long previousMillis = 0; \/\/ guardar\u00e1 la \u00faltima vez que se actualiz\u00f3 el LED\r\nconst long interval = 1000; \/\/ intervalo en el cual parpadear (milisegundos)\r\nint ledState = LOW; \/\/ utiliza ledState para configurar el LED\r\n\/\/ *\r\n\r\nvoid setup() {\r\npinMode(led, OUTPUT); \/\/ * nuevo\r\n\r\nSerial.begin(115200);\r\nSerial.println(\"Booting\");\r\nWiFi.mode(WIFI_STA);\r\nWiFi.begin(ssid, password);\r\nwhile (WiFi.waitForConnectResult() != WL_CONNECTED) {\r\nSerial.println(\"Connection Failed! Rebooting...\");\r\ndelay(5000);\r\nESP.restart();\r\n}\r\n\r\n\/\/ Port defaults to 8266\r\n\/\/ ArduinoOTA.setPort(8266);\r\n\r\n\/\/ Hostname defaults to esp8266-[ChipID]\r\n\/\/ ArduinoOTA.setHostname(\"myesp8266\");\r\n\r\n\/\/ No authentication by default\r\n\/\/ ArduinoOTA.setPassword(\"admin\");\r\n\r\n\/\/ La contrase\u00f1a se puede establecer con su valor md5 tambi\u00e9n\r\n\/\/ MD5(admin) = 21232f297a57a5a743894a0e4a801fc3\r\nArduinoOTA.setPasswordHash(\"21232f297a57a5a743894a0e4a801fc3\");\r\n\r\nArduinoOTA.onStart([]() {\r\nString type;\r\nif (ArduinoOTA.getCommand() == U_FLASH)\r\ntype = \"sketch\";\r\nelse \/\/ U_SPIFFS\r\ntype = \"filesystem\";\r\n\r\n\/\/ NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()\r\nSerial.println(\"Start updating \" + type);\r\n});\r\nArduinoOTA.onEnd([]() {\r\nSerial.println(\"\\nEnd\");\r\n});\r\nArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {\r\nSerial.printf(\"Progress: %u%%\\r\", (progress \/ (total \/ 100)));\r\n});\r\n\r\nArduinoOTA.onError([](ota_error_t error) {\r\nSerial.printf(\"Error[%u]: \", error);\r\nif (error == OTA_AUTH_ERROR) Serial.println(\"Auth Failed\");\r\nelse if (error == OTA_BEGIN_ERROR) Serial.println(\"Begin Failed\");\r\nelse if (error == OTA_CONNECT_ERROR) Serial.println(\"Connect Failed\");\r\nelse if (error == OTA_RECEIVE_ERROR) Serial.println(\"Receive Failed\");\r\nelse if (error == OTA_END_ERROR) Serial.println(\"End Failed\");\r\n});\r\nArduinoOTA.begin();\r\nSerial.println(\"Ready v 2.0\");\r\nSerial.print(\"IP address: \");\r\nSerial.println(WiFi.localIP());\r\n}\r\n\r\nvoid loop() {\r\nArduinoOTA.handle();\r\n\r\n\/\/ * nuevas\r\n\/\/ bucle para parpadear sin demora (delay)\r\nunsigned long currentMillis = millis();\r\nif (currentMillis - previousMillis &gt;= interval) {\r\n\/\/ * Guarda la \u00faltima vez que parpade\u00f3 el LED.\r\npreviousMillis = currentMillis;\r\n\/\/ * Si el LED est\u00e1 apagado, enci\u00e9ndalo y viceversa:\r\nledState = not(ledState);\r\n\/\/ * configurar el LED con el ledState de la variable:\r\ndigitalWrite(led, ledState);\r\n}\r\n\r\n}<\/code><\/pre>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Adviertase que, en esta ocasi\u00f3n en este programa no utilizamos el retardo delay() para que parpadee el LED, debido a que el modulo ESP8266 detiene el programa durante el delay(), de manera que si en la pr\u00f3xima solicitud de OTA se produce mientras Arduino est\u00e1 en pausa esperando que pase el delay(). el programa perder\u00e1 dicha solicitud.<\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Cuando haya cargado el nuevo boceto a su IDE Arduino, iremos a la opci\u00f3n\u00a0<strong>Herramientas&gt;Puerto<\/strong>\u00a0encontrar\u00e1 un puerto similar a:\u00a0<strong>esp8266-xxxx xxxx at su_esp_ip_address<\/strong>, como se aprecia en la figura 5, s\u00fabalo al ESP y ver\u00e1 que el LED integrado en al ESP empieza a parpadear.<\/p>\r\n\r\n\r\n\r\n<div align=\"center\">\r\n<figure><iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/jqv6ihkVWAQ\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/figure>\r\nV\u00eddeo<\/div>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\"><strong>Nota:<\/strong>\u00a0Para poder cargar su boceto una y otra vez utilizando OTA, debe insertar rutinas OTA en su interior. Eso es todo por ahora, en un pr\u00f3ximo tutorial se tratar\u00e1 con m\u00e1s ejemplos esta posibilidad de OTA.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">Ay\u00fadenos a mantener la comunidad en lo positivo y \u00fatil. \r\nSobre el tema, sea respetuoso con todas las edades y niveles\r\ncon la habitual responsabilidad. \r\nSea amable y no haga Spam - \u00a1Gracias!<\/pre>\r\n\r\n\r\n\r\n<h5 class=\"wp-block-heading\">Referencias.<\/h5>\r\n\r\n\r\n\r\n<p><a href=\"https:\/\/arduino-esp8266.readthedocs.io\/en\/latest\/ota_updates\/readme.html\">https:\/\/arduino-esp8266.readthedocs.io\/en\/latest\/ota_updates\/readme.html<\/a><\/p>\r\n\r\n\r\n\r\n<p><a href=\"https:\/\/github.com\/esp8266\/Arduino\/blob\/master\/doc\/ota_updates\/ota_updates.md\">https:\/\/github.com\/esp8266\/Arduino\/blob\/master\/doc\/ota_updates\/ota_updates.md<\/a><\/p>\r\n\r\n\r\n\r\n<p><a href=\"https:\/\/github.com\/esp8266\/Arduino\/tree\/master\/libraries\/ArduinoOTA\">https:\/\/github.com\/esp8266\/Arduino\/tree\/master\/libraries\/ArduinoOTA<\/a><\/p>\r\n\r\n\r\n\r\n<p class=\"has-medium-font-size\">Esto es todo, por este simple tutorial.<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>INTRODUCCI\u00d3N \u00bfQU\u00c9 ES OTA? Se trata la actualizaci\u00f3n por v\u00eda aire (OTA) es una caracter\u00edstica de los micro-controladores que tengan habilitado el WiFi en lugar de un puerto serie como los ESP8266, NodeMCU, etc. Es la capacidad que permite actualizar \/ cargar un nuevo programa al ESP8266 usando Wi-Fi (de forma inal\u00e1mbrica) o Bluetooth. Para [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":4801,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[289,346,15],"tags":[310,290,345],"class_list":["post-4786","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-esp8266","category-esp8266-programar-ota","category-microcontroladores","tag-esp8266-01","tag-nodemcu-esp12","tag-ota"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/4786","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/comments?post=4786"}],"version-history":[{"count":21,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/4786\/revisions"}],"predecessor-version":[{"id":4889,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/4786\/revisions\/4889"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/media\/4801"}],"wp:attachment":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/media?parent=4786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/categories?post=4786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/tags?post=4786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}