Buenas, llevo un tiempo dándole vueltas al tema de identificar un router para añadirle arduinos, y no se si alguien puede iluminarme.
Busco la manera que cada hogar (con su router) pueda almacenar X arduinos, cada uno identificado con su dirección MAC.
A través de una API externa, conectaría al servidor MQTT con el topic: ipRouterHogar/macArduino y ya podría acceder a cada uno de ellos para obtener información.
Pero tengo muchas dudas ya que, a pesar de leer y leer información sobre el tema no consigo resolver. ¿Como identificar cada router de cada hogar? Pensé en la dirección IP pero he leído que puede cambiar aleatoriamente, en caso de que fuera una opción viable, como puedo a partir del Arduino, conocer por primera vez esa dirección IP del router del hogar?
Pienso que una vez tuviera una forma de identificar a ese router con algún campo único, ya no tendría problemas a la hora de comprobar los dispositivos que se le asignen a través de wifi manager.
Pero si te haces esa pregunta es que te falta leer algo de router y redes.
Existe algo llamado IP fija.
Un cliente puede contratar el servicio de IP Fija por un costo menor.
O bien podes poner en cada sitio un DDNS o sea un pequeño programa que reporta la ip pública como DynDNS o No-IP por ciitar dos conocidos, pero hay muchos mas.
De este modo siempre sabrás cual es la IP de ese cliente.
Luego hay que hacer porforward en cada router para acceder a los arduinos que mencionas. Ojo, eso crea vulnerabilidades en la red, asi que buena practica es tener un router para todo lo que sea IOT, porque además todo esto no será necesariamente seguro o depende que uses como las placas finales y sus MACs como mencionas.
Buenas @Surbyte ! Gracias por la respuesta. Tal y como mencionas tengo pendiente la parte de redes, soy programador pero nunca toque ese área y a pesar de leer no consigo obtener la idea para empezar a construirla.
En cuanto a lo que mencionas de la IP fija si lo leí, pero sería para utilizar en varias casas, por lo que no me valdría el servicio para mantener la IP fija en un router, ni abrir puertos del router o algo parecido, ya que no podría ir a cada una de las casas a configurar el router o hacerles que contraten una IP fija.
La idea que tengo es una vez el Arduino se haya conectado a la red por medio de Wifi Manager, averiguar la manera para identificar ese wifi del hogar y utilizaría ese campo identificativo para conocer que dispositivos se han configurado en ese hogar.
Una vez solucione esa forma de identificar cada wifi de las casas, ya tengo montado la estructura para obtener para cada casa datos necesario de esos arduinos.
Por ponerte un ejemplo aproximado sería como Alexa, puedes conectar 1 o varias a tu wifi y ya identifica que ese hogar tiene X alexas conectadas al wifi.
Creo que la idea que me has ofrecido sobre hacer un pequeño script a partir del ddns para saber la IP del router me puede valer pero claro, vuelvo a la duda sobre qué pasa al cambio de esa IP , si es muy frecuente o es algo poco usual ese cambio de IP del router, ya que me tiraría el saber que dispositivos había para ese hogar. Aunque creo que puedo plantearme alguna idea para poder identificar ese cambio de IP.
Investigaré primero como puedo crear algún script para que los arduinos puedan utilizar esos ddns que mencionas y así obtener la IP del router y creo que tengo alguna idea para saber, en caso de cambio de IP, que hogar fue el que realizó el cambio.
Tal y como indico busco ideas para poder investigar y desarrollar el trabajo. También ver si estoy enfocando bien el tema y abrir la mente para el desarrollo del objetivo.
Varias cosas te cometo. Primero que hoy en día es muy probable que cuando contratas, por lo menos en España, una ADSL te den ip variable y encima te dan IP Shared. Esto quiere decir que tu tienes una IP pública que pueden tener la misma otros clientes de tu proveedor de internet.
Existe opción, como comentó surbyte, de contratar ip fija pero NO todos los proveedores de internet te la pueden ofrecer. Por ejemplo el mío no me lo puede ofrecer, lo más que me ofrece es sacarme del shared y que me den una ip única para mi pero que cambia cuando se resetea el router u otras caracterísiticas.
Por otro lado, y tal como surbyte te comentó, un DDNS sirve precisamente para cuando cambia la IP te actualiza en un DNS la IP. busca NO-IP o DynDNS para saber más sobre este tema.
Volviendo al tema principal, si comparas con alexa, yo creo que estás haciendo las cosas al revés. Tú sabes qué dispositivos tienes en casa no porque te comuniques con ellos desde el teléfono sino por que ellos (los dispositivos) se comunican con un servidor de amazon para indicar que están encendidos y en qué cliente, qué son, etc..
Cada X segundos mandan un "keep alive" al servidor de amazon para indicar que aún están encendidos etc.
Si dices "alexa apaga la luz" el dispositivo control de voz previamente se ha conectado por internet para saber qué dispositivos están en tu wifi pero no lo hace a través de internet.
Yo creo que quizá tu concepto esté equivocado. que la solución es que montes un servidor que centralice todo y éste sirva para comandar los dispositivos remotos.
Lo peor de eso es que si no contratas IP fija jamas podras superar la barrera del router, esa es la trampa del proveedor para que pagues un extra.
Es decir el cliente o abonado debe tener servicio de IP FIJA si o si. Yo tuve que hacerlo porque no podia ni ver cámaras ni manejar mi domótica. Antes tenia IP Shared.
Creo qeu @DanX3 DanX3 tiene razón, usa su sugerencia para encontrar una posible solución.
Buenas! Lo primero muchas gracias por vuestra respuesta @DanX3 y @Surbyte . Es un gusto hablar con gente que quiere ayudar y entiende de bastantes temas.
En cuanto a lo que comentas de Alexa de que haya un servidor el cual sabe los dispositivos, el tipo y demás es justo lo que le comentaba a Surbyte que ya tengo desarrollado.
Por eso no creo que me esté explicando bien, no pretendo acceder al router y una vez dentro de el a cada dispositivo. Todo el manejo de datos lo tengo desde un servidor, el cual se encarga de almacenar/modificar datos.
En resumen los arduinos emiten datos a ese servidor y el servidor a la app móvil, sin necesidad de acceder a puertos ni a redirecciones dentro del router.
El problema que tengo es que necesitaría algo que me identifique ese hogar, para identificar sus dispositivos (la típica digamos clave primaria en una BD, la cual sea única e identificativa, por eso había pensado en algo relacionado con la conexión wifi del hogar unida a algún otro parámetro como el ssid o similar). Es decir el mismo ejemplo que ponemos de Alexa, pero en varios hogares, cada Alexa consulta al servidor pero, se tiene que identificar para que se sepa que dispositivos son los que están unidos a ella.
Creo que lo tengo montado justo con la lógica que me explicas al final de tu comentario @DanX3 , ya que siempre es el servidor el encargado de comandar los dispositivos no entre ellos mismos.
En ese mismo tenor, puedes registrar cada placa en la BD usando el identificador único del Arduino, asociándolo con el hogar correspondiente al momento de darlo de alta.
Hay una librería ArduinoUniqueID.h que extrae ese número del microcontrolador.
Yo la he usado solamente como curiosidad, pero a ti sí te puede servir. Cada vez que el Arduino inicie sesión con el servidor estaría enviando ese número al servidor y con eso se identifica y como ya estaría asociado al hogar donde está instalado, lo demás es lo de menos...
Buenas @mancera1979 , lo que mencionas del id único del Arduino creo que se refiere a la MAC, pero le echaré un ojo a la librería que comentas.
En cuanto a lo del hogar, el problema es que como ya tengo montado un broker mqtt y una API para acceder a el, quería intentar ahorrarme esa BD (ya que solo la cogería para crear el hogar y hacerle la relación con los arduinos y aunque eso resolvería mi problema de identificar esas relaciones, pero ese sería el único uso que le daría a esa BD por lo que creo que puedo optar por otra alternativa, intentando hacer esa conexión de hogar-arduino de forma que se pueda crear con algún parámetro del wifi de ese hogar y ya los subtopics serian los MACs de los arduinos), y ya estaría todo conectado a través de la estructura de topic/subtopic del mqtt.
Pero claro, que parámetros puedo obtener que sirvan para poder formar esa clave desde la app móvil conectada al wifi y el Arduino en si. Ahí es donde me quedo fuera de juego por el momento.
Obviamente puedes obtener la mac de la wifi del ESPxx con WiFi.macAddress()
el SSID de la wifi con WiFi.SSID()
Y el BSSID con https://www.arduino.cc/reference/en/libraries/wifi/wifi.bssid/
Con el BSSID puedes saber si los dispositivos están en el mismo hogar (serán los que tienen el mismo BSSID)
Identificar el BSSID con el SSID para tener el nombre del hogar.
Osea debes de tener "cliente" "hogar" y "dispositivo" como mínimo.