Estoy desarrollando un proyecto en el que un dispositivo android (a traves de una aplicación que no es mia https://play.google.com/store/apps/details?id=com.luvago.netio&hl=es) envía peticiones al arduino a través de un puerto tcp.
Para que esto funcione desde fuera de casa he configurado una cuenta no-ip para que todas las peticiones que le lleguen a no-ip las enrute a la ip pública de mi router y este lo he configurado para que todas las peticiones que lleguen por cierto puerto las enrute a la ip local del arduino.
Por ejemplo:
Android -> Peticion a xxx.ddns.net puerto 3200
No-ip -> Host xxx.ddns.net - 8x.13x.1x.25x (ipPublica de mi router que me encargo de actualizar cuando cambia)
Puertos Router -> Puerto externo 3200 - Puerto interno 3200 - Tcp y Udp - ip 192.168.1.22
Arduino -> Ethernet.begin((mac)0xDE, 0xAD, 0xBE, 0xEF, 0xAD, 0xED, (ip)192,168,1,22, (puertaEnlace)192,168,1,1, (subMasc)255,255,255,0);
Todo esto FUNCIONA cuando envío peticiones con el móvil conectado a la red 3G, el problema se da cuando tengo el movil conectado a la red WIFI del router al que tengo conectado el arduino. No me llega la petición al arduino.
He buscado información sobre este problema y en arduino no he encontrado nada, si que he visto en otros foros que hay gente que tiene montado un servidor(pc) e intenta acceder a una web alojada en este desde un pc que está en la misma red la solucion que dan es que en el fichero HOST del segundo pc se añada una linea que indique que cuando se vayan a lanzar peticiones a la dirección no-ip las haga por la ip local del arduino.
Creo que el problema que tienes es de LOOPBACK. Hay algunos proveedores como ONO que lo permiten y otros (Telefonica) que por defecto no es posible.
El LOOPBACK es una opción que tienen algunos routers que permiten que las peticiones internas (desde dentro de la red local) de la dirección IP de la red externa (la IP de internet) se enruten de igual forma que las peticiones externas.
Seria algo asi como llamar a tu numero de movil con tu movil (Para que se entienda mas o menos).
Podias instalar alguna aplicación (en el móvil) que permita hacer traceroute a la IP del arduino y ver por donde te manda.
EDIT: Se me acaba de ocurrir. Estás conectando siempre a xxx.ddns.net ?
Desde dentro no deberías hacer eso, pero podrías resolverlo si por ejemplo el DNS que uses (si es el router) y tiene una tabla para forzar entradas, añadirle que xxx.ddns.net lo resuelva como 192.168.1.22, de modo que cuando estás en la red WiFi el DNS te resuelve eso y si estás fuera te resuelve ddns.net a la IP que tengas en el ADSL
-Nenfive, esa solución se me ocurrió, tener una pestaña por cada situación o un programa por cada, pero me parece engorroso y me gustaría que estando en wifi o en 3g funcionase poniendole la ip pública o la No-Ip.
-Rafa_Jurado, esta semana he estado indagando mas y he visto lo que me comentas, que el problema es el LOOPBACK.
-josemaX, si, la configuración en netio la tengo siempre a xxx.ddns.net. Por que no debería hacer eso?
Tengo un liveBox2 de orange, y la dns en el arduino se la tengo puesta con la ip del router(192.168.1.1). En el router no hay opcion para cambar las dns. Y no se como forzar una entrada en este router...
El problema es el que e dice Rafa, que yo llamo reflexión NAT y es que desde tu lan cuando accedes al nombre ddns, entonces el router no hace el port Forwarding a la ip y puertos especificados.
Esto lo puedes resolver (usando el nombre ddns) bien con un router que permita activar la reflexión (o loopback) o si no, haciendo que tu DNS resuelva en la lan ese nombre de host a tu IP del arduino.
La última opción seria usar la IP del arduino cuando estés en la conexión LAN.
Hay routers que hacen de DNS y puedes añadirle entradas que se usarán en vez de resolver con los DNS de tu proveedor si existen en ese DNS local.
No se si lo explico bien. El asunto es que desde fuera se resuelva tu IP pública y desde dentro la IP del arduino.
Entiendo el problema, en otro foro me han comentado que ya que este router no hace loopBack se puede hacer este router de bridge y poner otro ruoter que si haga loopback, al que esté conectado el arduino (y supongo que también el movil).
Voy a ver cuanto cuesta ese router y si me interesa.
Por que esto que me dices, josemaX, no se puede hacer con mi router no? Mi router creo que no tiene la opcion de resolver, al menos capado como lo tiene orange...
Se me ha ocurrido tambien hablar con los que han desarrollado netio, para ver si pueden incluir una opcion en el programa en la que se pueda configurar dos conexiones simultaneas para cada elemento. Ya he probado que puede haber varias conexiones distintas en cada elemento en la misma pantalla, y funcionan a la par. Pero en un solo elemento dos conexiones no se puede. Que primero intentase conectar con una, y poniendole un timeout hiciese otro intento con la otra.