Android trata con dispositivos IoT sin conexión a Internet

Estoy tratando de construir un proyecto en el que tengo que pilotar un dispositivo IoT desde el teléfono inteligente a través de wifi.

Este dispositivo tiene integrado el módulo Wifi SPWF01 y está configurado como un punto de acceso (que no tiene acceso a Internet) con el tipo de seguridad WEP. En esta configuración de punto de acceso también tenemos un TCP Socket Server que intercepta comunicaciones de teléfonos inteligentes.

En el lado del teléfono inteligente, tenemos la parte que escanea y se conecta al punto de acceso de nuestro dispositivo (que funciona, aunque obtengo el punto de esclamación en el icono wifi ya que no tiene acceso a Internet). Después de que nos hayamos conectado, comenzamos el zócalo del cliente que conecta con el servidor en nuestro dispositivo IoT (la dirección IP del zócalo del servidor es realmente la entrada del punto de acceso). Y aquí es donde comienza el problema, porque el socket del cliente no se iniciará. Aquí está el código:

public void SocketInit(String ip, int port) throws IOException { InetAddress addr = InetAddress.getByName(ip); SocketAddress sockaddr = new InetSocketAddress(addr, port); nsocket = new Socket(); nsocket.setReuseAddress(true); nsocket.setTcpNoDelay(false); nsocket.setReceiveBufferSize(700); //Must be less than 730byte witch is the module buffer nsocket.setSendBufferSize(700); nsocket.connect(sockaddr, 5000); //5 second connection timeout } 

Y aquí está la excepción que recibo:

 java.net.SocketException: socket failed: ENONET (Machine is not on the network) 

Y me sale ese error incluso antes de llegar a nsocket.connect (), precisamente en setReuseAddress.

Puesto que la excepción que consigo es ENONET, pensé que debe ser porque el punto de acceso no tiene acceso del Internet así que utilicé la solución propuesta aquí para el propósito de la prueba:

 adb shell settings put global captive_portal_detection_enabled 0 

Esta es una solución que no se puede hacer mediante programación sin tener acceso de root, pero quería probar si ese era el problema. Pero aunque el signo de exclamación en el icono wifi había desaparecido, el socket del cliente todavía me dio el mismo error de excepción.

¿Alguien tiene una solución para este comportamiento? ¡Gracias de antemano!


A veces, el socket de cliente logra abrir, con una tasa de éxito de 1 de cada 20 veces. Pero cuando lo hace, normalmente obtengo otra excepción después de un par de mensajes enviados:

 java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer) 

Aquí está el código que usé para conectarme al punto de acceso desde el teléfono inteligente:

  WifiConfiguration wc=new WifiConfiguration(); wc.SSID= host; wc.status = WifiConfiguration.Status.ENABLED; wc.priority = 40; wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); wc.allowedGroupCiphers.clear(); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); wc.wepKeys[0] = password; wc.wepTxKeyIndex = 0; int netId=mainWifi.addNetwork(wc); try { //mainWifi.setWifiEnabled(true); mainWifi.disconnect(); mainWifi.enableNetwork(netId, true); mainWifi.reconnect(); startConnectionCheck = true; System.out.println("enabled network"); } catch (Exception e) { e.printStackTrace(); System.out.println(e.getMessage()); } 

El tipo de seguridad del punto de acceso es WEP. Esto se debe a que el módulo wifi no puede implementar WPA.


Pruebas realizadas en Marshmallow.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.