Los dispositivos de tiro ocupan un lugar especial en la cultura del hardware: una batería de celda de moneda, un LED y un imán que pueden arrojarse a un lugar inaccesible y quedarse como un pequeño faro de luz de colores. Muchos de nosotros recordaremos esto como un primer proyecto. Por desgracia, el tiempo avanza inevitablemente, y lanzar luces alegres ya no me enseña nuevas habilidades. Haciendo un guiño a esos tiempos más simples, he estado trabajando en la idea inusual de construir un servidor completamente funcional que se pueda dejar en lugares remotos y que permanezca funcional, como un thrie (por favor, no lo tire). Es un poco raro, pero aún así debería proporcionar algunos años de acceso remoto ocasional si lo deja en algún lugar con luz solar.

Hace poco, describí Las etapas de potencia para esta energía solar.Servidor Linux accesible en la nube. Solo se activa bajo demanda, por lo que una pequeña celda solar y una batería modesta son suficientes para mantener todo el programa en funcionamiento.

Donde lo dejamos, tenía una célula solar que podía cargar una batería y proporcionar salidas reguladas de 12 V y 5 V. Para que sea un dispositivo funcional, hay tres problemas de alto nivel para resolver:

  1. Debe ser posible configurar el dispositivo sin acceso físico directo
  2. Debe poder encenderlo y apagarlo de forma remota según sea necesario.
  3. Necesita ser accesible desde internet.

Lo curioso es que este hardware me recuerda a un satélite. Por supuesto, no está destinado a ir al espacio, pero sí planeo ponerlo en un lugar que no sea fácil de encontrar, funciona con energía solar, y hay un subsistema especial (ESP8266) para atenderlo, verificar la activación remota, y encienda y apague la computadora principal (Raspberry Pi 3) según sea necesario. Esto se parece mucho a la tecnología de la carrera espacial, ¿verdad?

Como tengo un poco más de código de lo habitual para compartir con ustedes hoy, analizaré las partes más interesantes y proporcionaré enlaces a los archivos de firmware completos al final del artículo.

Configuración de dispositivo

La configuración del dispositivo es un buen lugar para comenzar, y tiene dos componentes: el sistema operativo en la Raspberry Pi 3 (en este caso Raspbian Stretch Lite) y los sistemas de bajo consumo de energía que controlan si la Raspberry Pi 3 está encendida o apagada . En ambos casos, manejamos esto buscando una red inalámbrica con un SSID conocido (por ejemplo, desde su teléfono móvil).

En Raspbian, esto es bastante fácil: abrimos / etc / network / interfaces y establecemos la prioridad de nuestra red de configuración en un número alto:




red = {
ssid = "configurar nombre de red"
psk = "configurar contraseña de red"
prioridad = 999
}

Para nuestro hardware de control de energía, hay un módulo disponible en NodeMCU llamado ‘configuración del usuario final’Que le permite conectarse al ESP8266 de forma remota, buscar redes y conectarse a uno de ellos, guardando las credenciales. Todo lo que necesitamos hacer es ejecutar selectivamente un programa que lo contenga cuando un determinado punto de acceso está dentro del rango:




función listap ()
dofile ('setup.lua')
fin

scan_cfg = {}
scan_cfg.ssid = "configurar el nombre de la red"
scan_cfg.show_hidden = 1
wifi.sta.getap (scan_cfg, 1, listap)

Luego, en setup.lua, ejecutamos la configuración del usuario final. Esto hace que el ESP8266 actúe como un punto de acceso llamado ‘SetupGadget’ seguido de unos pocos dígitos hexadecimales:




enduser_setup.start (
función()
imprimir ("Conectado a wifi como:" .. wifi.sta.getip ())
fin,
función (err, str)
print ("enduser_setup: Err #" .. err .. ":" .. str)
fin
)

tmr.alarm (1,1000, 1, función () si wifi.sta.getip () == nil entonces imprime ("Espere la dirección IP!") else print ("Nueva dirección IP es" ..wifi.sta. getip ()) tmr.stop (1) node.dsleep (2000000) end end)

Con esta configuración, podemos conectar el servidor y controlar el hardware a una nueva red inalámbrica sin acceso físico directo. La energía solar requiere luz, es probable que esto esté en mi techo, y no me gusta la idea de escalar para obtenerla en cualquier momento en que necesito restablecer la contraseña de mi WiFi de casa. Si tienes un techo muy alto, construye una antena direccional de onda – He podido obtener un alcance de más de 100 metros de esta manera, a través de varios edificios de concreto. También está Brian Benchoff Antena parabolica ESP8266 para imprimir en 3D.

Control remoto de potencia

A continuación, debemos poder encender o apagar el servidor de forma remota. Haremos esto con MQTT apuntando a un nombre de dominio que se resuelve en un VPS en la nube. Lo único que necesitará en ese VPS es el agente MQTT de mosquitos, por lo que no tiene sentido pagar por un servidor de gama alta. Tenga en cuenta que hay maneras de implementar alguna seguridad básica aquí, pero en aras de la brevedad, lo dejaré como un ejercicio para que lo explore por su cuenta.

Tenga en cuenta que nuestro hardware solo está activo de vez en cuando; lo he configurado para que se active cada 15 minutos aproximadamente para comprobar el agente MQTT. Para asegurarse de que recibe mensajes, el remitente debe establecer el indicador de "retener" al enviar el comando de activación. Esto garantiza que el mensaje estará allí cuando el ESP8266 se despierte y compruebe si hay nuevos mensajes, siempre que no lo reemplacemos con algún otro mensaje retenido. Un breve ejemplo en Python para un agente MQTT en domain.com, y tema solarserver:




importe paho.mqtt.client como mqtt #import el cliente
broker_address = "domain.com"
client = mqtt.Client ("P1") #create new instance
client.connect (broker_address, port = 1883) #connect to broker
client.publish ("solarserver", payload = "active", qos = 0, retain = True)

En nuestro ESP8266, verificamos el comando "activar" y luego ejecutamos un programa que enciende la Raspberry Pi 3:




ID de cliente = 'Node001'
m = mqtt.Client (ClientID, 120)

m: connect ("domain.com", 1883, 0, función (cliente)
imprimir ("conectado")
cliente: subscribe ("/ solarserver", 0, función (cliente) print ("subscribe success") fin)
fin)

m: on ("mensaje", función (cliente, tema, datos)
imprimir (tema .. ":")
si datos ~ = nil entonces
imprimir (datos)
si los datos == "activan" entonces
dofile ('active.lua')
m: cerrar ()
fin

fin
fin)

El programa 'active.lua' eleva un GPIO alto para habilitar la línea de 5v a la Raspberry Pi 3 y controla el voltaje de la batería. Si el voltaje de la batería es demasiado bajo o se recibe un comando de apagado, se cortará la alimentación (primero es una buena idea apagar el equipo).

Cavando más profundo en túneles SSH

Sin embargo, ¿de qué nos sirve si podemos encender el dispositivo pero no acceder a él? Como planeo mover este dispositivo para las demostraciones de software, sería fantástico si no tuviera que preocuparme demasiado por los firewalls, los enrutadores y otras tareas pesadas que podrían estar detrás. Aquí es donde exploramos túneles SSH inversos.

Normalmente, establece una conexión SSH porque desea un acceso seguro de shell a una máquina remota y tiene un par de certificado o nombre de usuario + contraseña junto con la dirección de la máquina. En esta situación, la dirección del cliente y el estado de su red (los enrutadores por los que se encuentra, etc.) no suelen ser importantes, pero se supone que la dirección del servidor es conocida y que todas las configuraciones de reenvío de puertos y firewall están configuradas para aceptar el tráfico.

En una conexión SSH inversa, el servidor inicia una conexión con el cliente que se utiliza para permitir que el cliente vuelva a conectarse al servidor. Al iniciar la conexión del servidor al cliente, usted especifica un puerto. Cuando inicie sesión en el cliente, use SSH para iniciar sesión en localhost en ese puerto, y el tráfico se enviará al servidor, lo que le permitirá iniciar sesión.

Tendremos que automatizar este proceso para que sea útil. El primer paso es crear un usuario (su nombre de usuario en este ejemplo) con acceso restringido en su VPS. Nuestro servidor iniciará sesión automáticamente en él, hacer esto con la cuenta raíz es probablemente una idea terrible si tiene algo que valora de forma remota. Anote la contraseña de este nuevo usuario.

A continuación, encendemos la Raspberry Pi 3 (asumiremos que utiliza Raspbian Lite aquí), establecemos una nueva contraseña de root, instalamos autossh para administrar la conexión, creamos un nuevo usuario (el mismo nombre que el usuario del VPS) con un certificado, y finalmente copia ese certificado usando SSH-copy-id a nuestro VPS:




$ apt-get install autossh
$ useradd -m -s / bin / bash su_usuario
$ su - nombre_de_usuario
$ ssh-keygen -t ed25519
$ ssh-copy-id your_username @ (dirección IP del VPS) -p 22

Luego ejecutamos raspi-config para habilitar el servidor SSH y hacer que ese usuario inicie sesión automáticamente en el arranque. Ahora estamos configurados para iniciar sesión en nuestro VPS a través de SSH con certificados en lugar de un par de nombre de usuario y contraseña, que es más fácil de automatizar. Vamos a establecer un túnel SSH inverso desde nuestra Raspberry Pi 3 para probarlo:




$ autossh -M 0 nombre_de_usuario @ (dirección IP del SPV) -p 22 -N -R 8081: localhost: 22 -vvv

Si eso tiene éxito, debería poder establecer una conexión SSH a su Raspberry Pi desde su VPS a través del comando:




$ ssh tu_usuario @ localhost -p 8081

Suponiendo que funcione según lo previsto, pasamos a crear un servicio que establezca esa conexión unos segundos después de que se activen las interfaces de red. Haremos esto con systemctl, pero primero necesitamos crear un script de shell corto para que llame systemctl. Cree un archivo autossh.sh, conviértalo en ejecutable (por ejemplo, con chmod) y rellénelo con:




dormir 15
autossh -M 0 nombre_de_usuario @ (dirección IP del VPS) -p 22 -N -R 8081: localhost: 22 -vvv

El "reposo 15" espera 15 segundos después de que las interfaces de red se activan durante el arranque. Sin esto, descubrí que la secuencia de comandos se ejecuta un poco demasiado pronto y no puedo resolver el host VPS. Hay maneras más elegantes de solucionar esto, pero esta fue la más fácil. Ahora creamos el servicio que ejecuta este script con:




$ systemctl edit --force --full autoautossh.service

Luego ingresamos lo siguiente, luego guardamos el archivo:


[Unit]

Descripción = Mi servicio de script
Quiere = network-online.target
Después = network-online.target

[Service]
Tipo = simple
Usuario = pi
WorkingDirectory = / home / your_username
ExecStart = / bin / bash /home/your_username/autossh.sh

[Install]
WantedBy = multi-user.target

Luego lo habilitamos y lo probamos. Después del segundo comando, el túnel SSH inverso debería estar operativo y puedes probarlo. Si no funciona ahora, tampoco funcionará en el arranque:




$ systemctl habilita autoautossh.service
$ systemctl start autoautossh.service

Si tiene acceso ahora, debe establecer automáticamente el túnel SSH inverso después del inicio y restablecerlo automáticamente si se rompe. Si tiene problemas con conexiones de red deficientes, puede investigar Mosh como una alternativa a SSH.

El caso probablemente debería ser blanco, dado que va a estar sentado mucho al sol. Dos paneles solares encajan muy bien, por lo que ahora utiliza 0.6W de paneles solares. El pegamento caliente es para llenar el pequeño espacio entre los paneles y la caja, y por supuesto, por efecto cosmético.

En este punto, ya está más o menos listo: simplemente conecte la salida de 5 V de sus etapas de potencia en su Raspberry Pi y colóquela en una caja a prueba de intemperie. Cuando envíe un mensaje retenido "activar" a su tema MQTT, el servidor se encenderá dentro de quince minutos aproximadamente. Recomiendo probarlo y escuchar el tema de MQTT por un tiempo para asegurarse de que todo funciona como se espera y para tener una idea de cuánto dura la batería.

Como se prometió, aquí está el código fuente de firmware completo. Revíselo y deje cualquier pregunta que tenga en la sección de comentarios a continuación. ¿También me encantaría escuchar para qué usarías un thrie de Linux?

1 Comentario

  1. Hola buenas, me ha encantado el post y tu idea.

    La verdad llevaba tiempo pensando en como hacer un microsat con la raspi y me has resuelto muchas dudas pero tengo otras con el túnel de ssh que no muy bien como implementarlo.

    Si me las pudieras resolver te lo agradecería mucho.

Dejar respuesta

Please enter your comment!
Please enter your name here