El archivo Flash del sistema SPI.
Sistema de ficheros SPIFFS
En la actualidad el Internet de las cosas (IoT) es nuestro aliado para la domótica y la investigación de los sistemas embebidos, nos aporta sus avances con los que podemos desarrollar nuestros dispositivos y además la mayoría o casi todos utilizan código abierto. Tratamos de ‘domesticar’ el entorno.
Nuevas palabras se agolpan en nuestro lenguaje, tales como SPIFFS. Pero que significa todo esto de sistema de ficheros SPIFFS , después de buscar y leer una apreciable cantidad de información al respecto, abreviando, se puede decir que los dispositivos que se basan en el ESP nos sirven para utilizarlos en domótica ya que el ESP8266, dispone de una especie de disco duro en su interior, conocido por las siglas SPIFFS (del inglés Serial Periferial Interface File Flahs System), esto quiere decir que dentro del ESP se dispone de un espacio de memoria FLASH (como disco duro) al que con ciertas condiciones podemos acceder para leer o escribir en él, y eso es lo que vamos a aprender aquí.
El ESP8266 es un dispositivo SPIFF que, fue diseñado para sistemas con memoria SPI NOR flash en dispositivos embebidos. El sistema de archivos tiene como objetivo principal, usar la menor memoria RAM posible.
El sistema ESP reserva un espacio en la memoria flash para la creación de archivos, que pueden variar según el modelo del módulo ESP que está en uso. Esta asignación puede ir desde 64 KB hasta 3 MB, siendo configurable en algunos modelos, como se muestra en la siguiente tabla.
Una característica importante a destacar es que el SPIFF no tiene carpetas, pero el nombre del archivo puede contener “barra de herramientas”, como por ejemplo “/ log/archivo.txt” y por convención, se entiende que el archivo está dentro del registro de la carpeta log.
La biblioteca SPIFF ya es nativa en el entorno Arduino para la familia ESP8266. Para utilizar el sistema de archivos, simplemente incluya la biblioteca siguiente include «FS. h« en su proyecto.
OTA
Hasta ahora, hemos subido archivos (programas) a un ESP8266 mediante el uso de un puerto serie para comunicar el IDE de Arduino y el ESP, cada vez que queriamos subir un nuevo archivo para modificar el comportamiento, teníamos que utilizar este método. La actualización OTA (Over the Air <=> Por el aire) es como se llama al proceso de cargar el firmware al módulo ESP utilizando una conexión Wi-Fi en lugar de un puerto serie. Dicha funcionalidad se vuelve realmente útil en el caso de un acceso físico limitado o incluso nulo a dicho módulo. De este modo, ahora ya podemos subir los archivos de programa y datos a un ESP8266 que tenga capacidad, bien desde Arduino o mediante OTA como hacíamos hasta ahora.
1 2 3 4 |
Arduino IDE Navegador web Servidor HTTP |
Así pues, la opción Arduino IDE está destinada principalmente a la fase de desarrollo del software. Las otras dos opciones serían más útiles después de la implementación, para proporcionar al módulo las actualizaciones de la aplicación manualmente con un navegador web o automáticamente usando un servidor http.
De lo dicho, se entiende que, la primera carga del firmware debe hacerse a través de un puerto serie. Si las rutinas de OTA se implementan correctamente en un boceto, todas las subidas posteriores se pueden realizar por aire.
No obstante, no hay seguridad prevista de ser pirateado el proceso OTA. Depende del desarrollador asegurarse de que las actualizaciones solo se permitan desde una fuente legítima / confiable. Una vez que se completa la actualización, el módulo se reinicia y se ejecuta un nuevo código. El desarrollador debe asegurarse que la aplicación que se ejecuta en el módulo, se cierre y se reinicie de manera segura.
Seguridad
Como es habitual al conectar el módulo para actualizarlo con un nuevo boceto de manera inalámbrica, si no se toman las medidas de seguridad más adecuadas, para evitar la posibilidad de que el módulo sea violentamente pirateado e incluso cargado con algún otro código no deseado. Algunas formas básicas de reducir la probabilidad de ser pirateado, considere proteger sus cargas con una contraseña, seleccionar cierto puerto OTA, etc.
Compruebe la funcionalidad proporcionada con la biblioteca ArduinoOTA con la que puede mejorar la seguridad:
1 2 3 |
void setPort(uint16_t port); void setHostname(const char* hostname); void setPassword(const char* password); |
Cierta funcionalidad de protección ya está incorporada y no requiere ninguna codificación adicional por parte del desarrollador. ArduinoOTA y espota.py usan Digest-MD5 para autenticar la carga. La integridad de los datos transferidos se verifica en el lado ESP utilizando la suma MD5 de comprobación.
Sin emabrgo, se recomienda realizar su propio análisis de riesgos y, según la aplicación, decida qué funciones de biblioteca implementar. Si es necesario, considere la implementación de otros medios de protección contra el pirateo, por ejemplo, exponer el módulo para cargas solo según un cronograma específico, disparar OTA solo al presionar el botón dedicado «Actualización», etc.
Entienda que el proceso OTA tiene una gran responsabilidad en la seguridad ya que maneja los recursos de ESP y el ancho de banda durante la carga. Luego se reiniciará el módulo y se ejecutará el nuevo boceto. Debe analizar y comprobar cómo afecta la funcionalidad de su actual boceto respecto del nuevo.
Imagine por un momento que, el ESP se coloca en una ubicación remota y controla algunos equipos, debe prestar atención adicional a lo que sucede si el funcionamiento de este equipo se interrumpe repentinamente por el proceso de actualización. Por lo tanto, debe decidir cómo emplazar este equipo en un estado seguro antes de comenzar la actualización.
Por ejemplo, su módulo puede controlar un sistema de riego de jardín en secuencia. Si ésta secuencia no se ejecuta correctamente y se deja abierta una válvula de agua, su jardín/casa puede inundarse si esta válvula no se cierra después de que la OTA finalice y el módulo se reinicie.
La biblioteca ArduinoOTA proporciona las siguientes funciones y están destinadas a manejar la funcionalidad de su aplicación durante etapas específicas de OTA o en un error OTA:
1 2 3 |
void onStart(OTA_CALLBACK(fn));void onEnd(OTA_CALLBACK(fn)); void onProgress(OTA_CALLBACK_PROGRESS(fn)); void onError(OTA_CALLBACK_ERROR (fn)); |
Requerimientos básicos.
1 2 |
El tamaño del flash en el chip es 2 veces el tamaño del boceto. El ESP y la computadora deben estar conectados a la misma red. |
Quizás un ejemplo nos pueda aclarar la idea, veamos esta práctica.
Práctica.
La domótica en estos días está a nuestro alcance para ser utilizada en muchas de nuestras cosas. La empresa Itead pone a nuestra elección una serie de productos según nuestros interesés por unos pocos euros y una moderada/baja complejidad.
Cuando adquiero un nuevo dispositivo no se el motivo que me impulsa a abrirlo y ver su composición. Así que, voy a destripar un relé Sonoff WiFi que hemos adquirido, al que modificaré y luego cargare el firmware de código abierto ESPurna, de su creador Xose Pérez.
Sonoff Basic es un conmutador inteligente WiFi asequible que proporciona a los usuarios un control inteligente del hogar. El interruptor eléctrico Sonoff Basic WiFi transmite datos a una plataforma en la nube a través de WiFi Router, que permite a los usuarios controlar de forma remota todos los dispositivos conectados, a través de la aplicación móvil eWeLink.
Esta tarea no va a ser nada fácil, ya que vamos a conocer conceptos y cosas nuevas que, nos permitirán tener un dispositivo totalmente configurable para que se adapte a tus necesidades.
Se supone que tenemos instalado el IDE de Arduino, si no es así, empiece por instalar el IDE de Arduino y las librerías de NodeMcu. Copie y pegue el siguiente enlace al IDE en Gestor de URLs Adicionales que encontrará en Archivo / Preferencias, puede añadir más separados por una coma.
Instalar Python.
Sería conveniente y es recomendable tener conocimientos sobre Python y así poder seguir esta práctica. Para poder seguir esta práctica, usted necesitará instalar en su sistema, una serie de herramientas y librerías de código abierto que puede ver en la lista que sigue:
1 2 3 4 5 |
La librería ESP8266FS.h. Y el programa Python para así, poder subir archivos por SPIFF. Gestor de paquetes de Python pip. Instalar esptool.py La librería pubsubclient. |
Necesitamos disponer de Python, si no lo tiene instalado vaya a python.org y descargue la versión 2.7 (no la 3 o posteriores) que se ajuste a su sistema(yo uso Windows 10 y la versión Python 2.7.16), si uisted es usuario de Windows a la hora de la instalación debe seleccionar la opción «Apregar python.exe a la ruta», ya que no viene selccionada por defecto. Al ejecutar el instalador y siga el asistente de instalación.
Fig. 4 Agregar ruta.
Instalación de PyCharm
Descargue e instale PyCharm, esta es una herramienta muy completa que le puede interesar, hará mas fácil su trabajo. Instrucciones de instalación de PyCharm.
1 2 |
Ejecute el archivo pycharm - 2018.2.exe que inicia el Asistente de instalación Siga todos los pasos sugeridos por el asistente. Preste especial atención a las opciones de instalación correspondientes. |
Además se debe añadir una serie de herramientas entre las que se encuentran pip.py y en el siguiente enlace encontrará cómo descargar e instalar esptool.py No se preocupe demasiado si no tiene ni idea de como proceder, siga leyendo y practique lo que se indica, ya verá que si puede.
Como ya se ha dicho, esptool.py es una utilidad basada en Python independiente de la plataforma, que nos permite comunicarnos con el cargador de archivos y comunicar directamente con la memoria ROM del ESP8266 o ESP32. Esta herramienta está escrita en Python y por eso tenemos que tener instalado este lenguaje de programación y el gestor de paquetes pip.
En primer lugar, abra una vantana de comandos. Una forma rápida de abrir la ventana, vaya a la barra de direcciones y escriba: cmd. Verá que se habre una ventana para ejecutar comandos.
Y se abrirá una ventana.
También se debe añadir una serie de herramientas entre las que se encuentran pip.py y en el siguiente enlace encontrará cómo descargar e instalar esptool.py Para eso, hemos abierto el terminal de comandos, con el que trabajaremos un poco, siga estos pasos:
Vamos a instalar esptool.py. En primer lugar, tan sólo hay que ejecutar un comando escriba:
1 |
c:\>pip install --upgrade esptool |
Enter y nos mostrará un cuadro como el siguiente:
Para saber que versión tiene, abra el terminal de comandos y en la línea de comandos escriba:
1 |
c:\>python --version |
La ventana mostrará algo parecido a esta imagen:
Le mostrará la versión 2 o 3 de Python, igual ya viene instalada, en otro caso visite Instalar y asegúrese de actualizar pip. Para instalar pip, descargue de forma segura get-pip.py.
Compruebe su versión escriba en la línea de comandos:
1 |
c:\>pip --version |
La ventana mostrará algo parecido a esta imagen:
Además, para poder compilar un proyecto será necesario añadir la librería pubsubclient.
En un artículo anterior ya vimos, como hacer el control de un relé vía WIFI, que nos puede servir de guía.
Hacer una copia del firmware.
Tengamos en cuenta que al subir un nuevo archivo a la memoria FLASH, estaremos eliminando la información que tengamos en ella y por lo tanto no se podrá recuperar. Es conveniente antes de subir un nuevo boceto al Sonoff hacer una copia de seguridad del firmware que viene precargado de fábrica, ya que en caso contrario se perderá definitivamente.
Veamos como proceder siguiendo las indicaciones. El autor de Spurna indica los pasos que debemos seguir en su tutorial para hacer el backup.
«El propio autor del proyecto Spurna advierte que este procedimiento se proporciona TAL CUAL, al igual que el resto del proyecto, indica que a el le ha funcionado, pero podría no funcionar para otros. Se trata de un simple volcado del contenido de la memoria flash, incluidos los datos EEPROM emulados. Desconoce el diseño de la memoria flash. Por lo tanto, se trata de un procedimiento simple de copia de seguridad y restauración.
De manera que para hacer una imagen copia de seguridad, deberá iniciar su placa en modo flash. El procedimiento es exactamente el mismo que cuando se está preparando para flashear una nueva imagen y dependerá de su dispositivo. Consulte la página de hardware compatible para obtener instrucciones. Después de cada comando, esptool reiniciará el dispositivo.
Realizar una copia de seguridad se entiende que es completa, especifique la address inicio como 0 y el size como tamaño flash en bytes (hexadecimal o decimal):
$ esptool.py read_flash –help
usage: esptool read_flash … address size filename
positional arguments:
address Start address
size Size of region to dump
filename Name of binary dump
$ esptool.py –port /dev/ttyUSB0 read_flash 0x00000 0x400000 d1-mini.bin
Para placas de 1 MB o 2 MB:
$ esptool.py –port /dev/ttyUSB0 read_flash 0x00000 0x100000 esp-1MB-backup.bin
$ esptool.py –port /dev/ttyUSB1 read_flash 0x00000 0x200000 esp-2MB-backup.bin
Para restaurar la imagen, solo necesita especificar la dirección de inicio:
$ esptool.py –port /dev/ttyUSB0 write_flash 0x00000 d1-mini.bin «
He reproducido TAL CUAL los pasos propuestos por el autor de Spurna. No he probado su funcionamiento por falta de tiempo, de modo que no puedo confirmar ni desmentir este procedimiento.