En el tutorial anterior, se analizó el protocolo FTP y la transferencia de archivos entre un cliente y un servidor. El protocolo FTP puede resultar realmente útil en muchas aplicaciones de IoT. Muchos dispositivos IoT se instalan en lugares como plantas de energía nuclear, redes eléctricas y otras instalaciones industriales donde este tipo de dispositivos pueden tener algunos errores y necesitan actualizaciones de software de aplicación para solucionarlos. En los protocolos estándar de IoT como MQTT, CoAP, etc., es difícil actualizar y reinstalar el software de la aplicación porque la mayoría de los protocolos de IoT están diseñados para la comunicación de IoT entre dispositivos y la red, pero no para tareas como actualizaciones de aplicaciones. La actualización de la aplicación en un dispositivo IoT solo es posible a través de la pila TCP/IP. El protocolo FTP es el protocolo diseñado específicamente sobre la pila TCP/IP para transferir archivos entre un cliente y un servidor. Por lo tanto, un dispositivo IoT puede utilizarlo para descargar software de aplicación actualizado y reinstalarlo después de la descarga.
En este proyecto, se utiliza una Raspberry Pi como dispositivo IoT que ejecuta una aplicación Python simple para hacer parpadear un LED. Por tanto, el dispositivo IoT diseñado en este proyecto es una Raspberry Pi interconectada con un LED. Otra aplicación Python también continúa ejecutándose en la placa hija, que continúa buscando una actualización del código LED parpadeante desde un servidor FTP. La aplicación de búsqueda de actualizaciones se conecta al servidor FTP y rastrea el número de versión del código LED parpadeante disponible en el servidor FTP. Si el número de versión del código LED parpadeante cambia, el código de recuperación de actualización descarga el código actualizado y lo reinstala en la Raspberry Pi. El proceso de actualización se produce automáticamente y no requiere ninguna intervención humana. Por lo tanto, cargar y descargar archivos FTP es confiable y rápido ya que muchas aplicaciones usan FTP en servidores de actualización.
Componentes necesarios –
1) Frambuesa Pi 3
2) LED
3) resistencia de 1KΩ
4) Cables de puente
Software requerido –
1) Sistema operativo Raspbian
2) Leafpad/GNU Nano/Python 3 IDLE (para escribir scripts en Python)
Diagrama de bloques -
Figura 1: Diagrama de bloques del cliente FTP IoT basado en Raspberry Pi 3
Conexiones de circuito –
En este proyecto se diseña un dispositivo IOT simple. Tiene un LED conectado a la Raspberry Pi 3. El dispositivo se diseña ensamblando los siguientes componentes.
Raspberry Pi 3: Raspberry Pi 3 es la Raspberry Pi de tercera generación. Es una maravilla en miniatura, que reúne una potencia informática considerable en un espacio no mayor que el de una tarjeta de crédito. El procesador central del sistema Raspberry Pi es un sistema en chip (SoC) Broadcom BCM2837 que alberga un procesador Quad Core ARM Cortex-A53 de 1,2 GHz. La gran mayoría de los componentes del sistema, incluidas sus unidades de procesamiento central y de gráficos, junto con el. El hardware de audio y comunicaciones está integrado en este único componente, junto con el chip de memoria LPDDR2 de 1 GB en el centro de la placa. No es sólo este diseño de SoC lo que hace que el BCM2837 sea diferente del procesador que se encuentra en una computadora de escritorio o portátil típica; sin embargo, también utiliza una arquitectura de conjunto de instrucciones (ISA) diferente conocida como ARM.
El Pi viene equipado con una toma Ethernet 10/100 BaseT integrada, un puerto compuesto HDMI y RCA para vídeo, un conector de salida de audio de 3,5 mm, una interfaz serie de cámara MIPI de 15 pines (CSI-2), una interfaz serie de pantalla, Bluetooth 4.1, 802.11 b. /g/n LAN inalámbrica, tarjeta Micro SDIO a Micro SD, 4 conectores USB 2.0, conector de 40 pines que contiene 27 pines GPIO y toma Micro USB para fuente de alimentación.
La Raspberry Pi es una computadora de placa única diseñada para ejecutar un sistema operativo llamado GNU/Linux Raspbian. En lo sucesivo denominado simplemente Linux. A diferencia de Windows u OS X, Linux es de código abierto, por lo que puedes descargar el código fuente de todo el sistema operativo y realizar los cambios que desees. Raspberry Pi 3 también puede ejecutar Windows 10 IoT y muchos otros sistemas operativos integrados, muchos de los cuales se derivan de Linux. El sistema operativo debe cargarse en una tarjeta MicroSD y arrancar desde ella. Con potentes capacidades informáticas, una gran cantidad de interfaces multimedia y pines GPIO, Raspberry Pi 3 es una opción adecuada para ejecutar un proyecto integrado o de IoT basado en software complejo que requiere suficiente potencia informática, así como conectividad de sensores a gran escala. Con Bluetooth y Wi-Fi integrados, este Pi de tercera generación se puede implementar fácilmente en una red IoT. Las principales especificaciones de Raspberry Pi 3 se resumen en la siguiente tabla:
Figura 2: Tabla que enumera las especificaciones técnicas de Raspberry Pi 3
El encabezado de 40 pines en Raspberry Pi 3 tiene la siguiente configuración de pines:
Fig. 3: Tabla que enumera la configuración de pines del encabezado de 40 pines de Raspberry Pi
Fig. 4: Tabla que enumera la configuración de pines del encabezado de 40 pines de Raspberry Pi
En este proyecto, un LED interactúa con el pin GPIO18 de Raspberry Pi. La placa se alimenta mediante un adaptador USB.
LED: un LED está conectado al GPIO18 de Raspberry Pi. Su ánodo está conectado al pin Raspberry Pi y el cátodo está conectado a tierra. El LED está conectado al Pi a través de una resistencia pull-up de 1K ohmios en serie.
Fuente de alimentación: la fuente de alimentación está conectada a la Raspberry Pi. El Pi debe funcionar con un adaptador de 5 V con salida de corriente de 2,5 A. El adaptador se puede conectar a la toma Micro USB.
Cómo funciona el circuito –
El dispositivo IoT diseñado aquí es simplemente una Raspberry Pi 3 que controla un LED. Para controlar el LED y mantener el Pi conectado a un servidor FTP, se deben ejecutar dos scripts de Python separados en la placa secundaria. Una secuencia de comandos de Python controla el LED parpadeante y otra secuencia de comandos de Python puede actualizar automáticamente la secuencia de comandos del LED parpadeante. En primer lugar, es necesario cargar la Raspberry Pi con un sistema operativo. El sistema operativo oficial Raspberry Pi, Linux Raspbian, está instalado aquí. Durante la instalación del sistema operativo, la Raspberry Pi debe estar conectada a un monitor mediante un cable HDMI y un teclado y mouse a través de puertos USB.
Para instalar el sistema operativo Raspbian en una tarjeta MicroSD, primero descargue la imagen más reciente del sistema operativo Raspbian desde el sitio web de Raspberry Pi en el siguiente enlace:
Sistema operativo Raspbian
Copie la última imagen del sistema operativo Raspbian a la tarjeta MicroSD. Si la tarjeta MicroSD utilizada es de 32 GB o menos, se debe formatear en FAT32 (sistema de archivos) antes de copiar la imagen, o si la tarjeta MicroSD tiene más de 32 GB, se debe formatear en exFAT antes de copiar la imagen. Extrae el Zip del sistema operativo y cópialo en la tarjeta MicroSD. La imagen se puede escribir en la tarjeta conectándola a una computadora portátil o PC mediante un lector de tarjetas MicroSD. Después de copiar la imagen extraída, inserte la tarjeta en la ranura MicroSD como se muestra a continuación:
Fig. 5: Imagen típica de la ranura para tarjetas MicroSD de Raspberry Pi 3
Conecte la Raspberry Pi a un monitor mediante un cable HDMI, un teclado y un mouse. Encienda la tarjeta conectándola a un adaptador de corriente. El LED rojo en la placa comenzará a parpadear y el sistema operativo comenzará a iniciarse desde la tarjeta MicroSD. El proceso de inicio se mostrará en el monitor y una vez que se complete el inicio, el LED verde se iluminará en la Raspberry Pi. Después de instalar con éxito el sistema operativo Raspbian en Raspberry Pi, se recomienda realizar una actualización de software. Esto se puede hacer ejecutando los siguientes comandos de Linux en la Terminal de Linux:
$ sudo apt-obtener actualización
$ sudo apt-obtener actualización
Después de instalar Raspbian, es hora de escribir y ejecutar scripts de Python en Raspbian. Se puede escribir un script de Python en Raspbian usando un editor de texto como Leafpad o GNU Nano. El script de Python también se puede escribir utilizando el IDE de Python estándar, como Python 2 IDLE o Python 3 IDLE. Abra Python 3 IDLE navegando por Menú -> Programación -> Python 3 IDLE. Se abrirá una ventana llamada Python 3.4.2 Shell. Escriba los scripts de Python y guárdelos en un directorio.
El script de Python escrito para este proyecto debe ejecutarse al inicio cuando el Pi 3 está encendido. El script ejecuta un bucle infinito para que nunca termine. Existen algunos métodos mediante los cuales se puede configurar Raspberry Pi para ejecutar un script de Python al inicio. Se puede utilizar cualquiera de los siguientes métodos:
1) Edición de rc.local –
Se pueden agregar comandos al archivo /etc/rc.local para ejecutar un programa o comando cuando se inicia Raspberry Pi. Esto es especialmente útil si el Pi necesita conectarse a una fuente de alimentación sin cabeza y ejecutar un programa sin configuración o inicialización manual. El archivo debe editarse con root ejecutando los siguientes comandos en la Terminal de Linux:
sudo nano /etc/rc.local
Ahora agregue comandos para ejecutar el script de Python usando la ruta completa del archivo y agregue un signo comercial al final del comando para que el script se ejecute en un proceso separado y la inicialización pueda continuar. Se debe agregar el siguiente comando donde los scripts de Python se guardan como FTP.py y CODE.py-
sudo python /home/pi/FTP.py &
salida 0
El comando debe agregarse justo antes de la línea de salida 0 en el archivo rc.local.
2) Edición de .bashrc –
El .bashrc es un archivo oculto en la carpeta de inicio que contiene opciones de configuración del usuario. Abra el archivo .bshrc ejecutando los siguientes comandos en la terminal de Linux:
sudo nano /home/pi/.bashrc
Agregue las siguientes líneas después de la última línea del archivo:
echo ejecutándose al inicio
sudo python /home/pi/FTP.py
3) Agregar script al directorio init.d –
El directorio init.d contiene los scripts que se inician durante el proceso de arranque (además, todos los programas aquí se ejecutan cuando el Pi se apaga o reinicia). Agregue el script que se ejecutará al inicio al directorio init.d usando los siguientes comandos:
sudo cp /home/pi/securitysystem.py /etc/init.d/
Vaya al directorio de inicio y abra el script de Python ejecutando los siguientes comandos:
CD /etc/init.d
sudo nano ftp.py
Agregue las siguientes líneas al script de Python para convertirlo en una base estándar de Linux (LSB):
# /etc/init.d/sample.py
### INFORMACIÓN DE INICIO
# Proporcionar: muestra.py
# Inicio obligatorio: $remote_fs $syslog
# Parada obligatoria: $remote_fs $syslog
# Inicio predeterminado: 2 3 4 5
# Parada predeterminada: 0 1 6
# Breve descripción: iniciar el demonio en el momento del arranque
# Descripción: Habilita el servicio proporcionado por el demonio.
### INFORMACIÓN FINAL INICIO
Haga ejecutable el script de Python en el directorio de inicio cambiando su permiso ejecutando el siguiente comando:
sudo chmod +x FTP.py
Luego ejecute el siguiente comando:
valores predeterminados sudo update-rc.d FTP.py
Luego reinicie el Pi ejecutando el siguiente comando:
reiniciar sudo
Cualquiera de los métodos anteriores se puede utilizar para ejecutar el script de Python al inicio. Ahora el Pi 3 se puede desconectar del monitor, teclado y mouse. Conecte el LED a la Raspberry Pi y enciéndalo.
Ahora, cuando el Pi se encienda, ejecutará ambos scripts al inicio. El script principal (CODE.py) controla el parpadeo del LED. Dejó que el LED parpadeara durante unos segundos. El otro script (FTP.py) continúa verificando el archivo en el servidor FTP para obtener la versión del archivo principal. El archivo verificado por el script y que contiene el número de versión se llama 'Readme.txt' y simplemente contiene el número de versión del script LED parpadeante como texto sin formato. Si el script de actualización (FTP.py) encuentra algún cambio en el archivo de indicación de versión (Readme.txt) en el servidor FTP, significa que el archivo de la aplicación ha sido cambiado (en este caso, el período de parpadeo del LED puede haber cambiado en CODE.py subido al servidor FTP), indica que hay disponible una nueva versión del archivo principal. Ahora se ha descargado la versión actualizada del archivo principal del servidor FTP. Después de la descarga, el script principal se reinicia para que los cambios surtan efecto y, por lo tanto, se cambia la duración del parpadeo del LED.
FTP.py se ejecuta al inicio y verifica el código de la aplicación (CODE.py) del servidor FTP. El propio FTP.py puede descargar, instalar y ejecutar el código principal, es decir, CODE.py.
Guía de programación –
Hay dos scripts de Python escritos que se ejecutan al inicio. Uno de los scripts de Python simplemente hace parpadear el LED conectado a la Raspberry Pi y se guarda como CODE.py. Este script comienza importando las bibliotecas necesarias: la biblioteca RPi.GPIO para manejar la entrada y salida digitales y la biblioteca de temporización para retrasos. RPi.GPIO es un módulo para controlar los canales GPIO de Raspberry Pi. Puede haber más de un script/circuito en el GPIO de Raspberry Pi. Como resultado de esto, si RPi.GPIO detecta que un pin se ha configurado en algo distinto al predeterminado (entrada), puede emitir una advertencia cuando el Pi intenta configurar el script. Para desactivar estas advertencias, el argumento falso se pasa al método setwarning. Se inicializa una variable y se establece en 24. El sistema de numeración GPIO está configurado en BCM, que se refiere a los números de canal en el SoC Broadcom. El canal BCM número 24 se configura como salida GPIO usando el método de configuración y se establece en BAJO usando el método de salida. Se ejecuta un bucle infinito en el que la salida GPIO se establece en ALTA y BAJA alternativamente usando el método de salida y el retraso de tiempo se proporciona usando el método de suspensión del módulo de tiempo que acepta el intervalo de retraso como parámetro en milisegundos.
El segundo archivo (FTP.py) es el script de actualización. El archivo de la aplicación puede ser cualquier archivo de script que en este caso es CODE.py. El script de actualización se divide en cuatro partes:
1. Configurar el servidor FTP
2. Conexión al servidor FTP
3. Descargar el archivo de versión y comparar
4. Descargar el archivo de la aplicación y reiniciar la aplicación.
1. Servidor de configuración: el servidor FTP debe contener dos archivos, readme.txt (que contiene la información de la versión) y code.py (que contiene el archivo de código de la aplicación principal). Cualquier servidor FTP abierto como www.biz.nf se puede utilizar para alojamiento web. Crea una cuenta allí y sube estos dos archivos.
2. Conexión al servidor FTP: Para conectarse al servidor FTP, se importa una biblioteca de Python que admite comandos FTP "ftplib". Debe importarse al comienzo del script de actualización.
importar ftplib como ftp
Para conectarse al servidor FTP, la conexión se inicia en una variable de sesión. La dirección del servidor y su nombre de usuario y contraseña se proporcionan a la variable.
sesión = ftp.FTP('192.168.1.100′,'iot_user','123123123′)
3. Descargar el archivo de versión y comparar: el archivo Léame en el servidor contiene información sobre la versión actual del código de la aplicación. También en el script de actualización, la versión actual se define con una variable.
versión_c = “1”
El archivo Léame del servidor FTP se descarga y almacena en una variable de "versión". El archivo se abre y se lee para detectar el número de versión.
con open('README.txt', 'r') como miarchivo:
versión=miarchivo.leer .replace('n', ”)
Después del almacenamiento, se comparan las variables de versión y, si se encuentran cambios, comienza el proceso de descarga del código de la aplicación desde el servidor FTP.
si (versión! = c_version):
versión c_global
c_version = versión
4. Descargar el archivo de la aplicación y reiniciar la aplicación: después de comparar la versión y detectar el cambio de versión, el Code.py actualizado comienza a descargarse desde el servidor FTP.
session.retrbinary('RETR CODE.py', open('CODE.py', 'wb').write)
El archivo se recupera y almacena con el mismo nombre que el archivo principal de la aplicación. Primero, se elimina la aplicación en ejecución.
check_kill_process(“CÓDIGO.py”)
Luego se inicia un hilo separado para reiniciar la aplicación.
inicio = 'sudo python CODE.py'
proc = subproceso.Popen(inicio, shell=Verdadero, stdout=subproceso.PIPE, stderr=subproceso.PIPE, stdin=subproceso.PIPE)
Así es como se puede utilizar el protocolo FTP en una aplicación IoT para la actualización automática de la aplicación. Consulte los scripts de Python en la sección de códigos y pruébelos. En el siguiente tutorial, aprenderá sobre el protocolo SFTP. SFTP es una variante segura del protocolo FTP.
Código fuente del proyecto
### //Programa para importar ftplib como ftp tiempo de importación importar sistema operativo, señal subproceso de importación versión = "" versión_c = "1" sesión = ftp.FTP('192.168.1.100','iot_user','123123123') #stop = 'sudo kill $(ps aux grep CODE.py awk ' {{print $2}} ')' inicio="sudo python CODE.py" actualización definitiva: #ftp.cwd('debian') #session.retrlines('LISTA') session.retrbinary('RETR README.txt', open('README.txt', 'wb').write) con open('README.txt', 'r') como miarchivo: versión=miarchivo.leer .replace('n', '') si (versión! = c_version): versión_c global session.retrbinary('RETR CODE.py', open('CODE.py', 'wb').write) c_version = versión tiempo.dormir(1) check_kill_process("CÓDIGO.py") imprimir "pase de PARADA" tiempo.dormir(1) proc = subproceso.Popen(inicio, shell=Verdadero, stdout=subproceso.PIPE, stderr=subproceso.PIPE, stdin=subproceso.PIPE) imprimir "Pase INICIO" tiempo.dormir(3) imprimir "¡ACTUALIZADO!" demás: tiempo.dormir(5) imprimir "SIN ACTUALIZACIONES" def check_kill_process(pstring): para la línea en os.popen("ps ax grep " + pstring + " grep -v grep "): campos = línea.split pid = campos(0) os.kill(int(pid), señal.SIGKILL) mientras es cierto: intentar: actualizar excepto excepción como e: sesión.salir imprimir y ###
Diagramas de circuito
Diagrama de circuito-Cliente-FTP-IoT basado en Raspberry-Pi-3 |