安卓处理没有互联网连接的物联网设备

2022-09-02 22:45:52

我正在尝试构建一个项目,我必须通过Wifi从智能手机试用物联网设备。

此设备集成了 SPWF01 Wifi 模块,并配置为安全类型为 WEP 的接入点(没有互联网接入)。在此接入点配置上,我们还有一个拦截智能手机通信的TCP套接字服务器。

在智能手机方面,我们有扫描并连接到我们设备的接入点的部分(这有效,尽管我在wifi图标上获得了解释点,因为它没有互联网接入)。连接后,我们启动连接到物联网设备上的服务器的客户端套接字(服务器套接字的IP地址实际上是接入点的网关)。这就是问题开始的地方,因为客户端套接字不会启动。代码如下:

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
}

这是我得到的例外:

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

我甚至在到达nsocket.connect()之前就得到了这个错误,正是在setReuseAddress上。

由于我得到的例外是ENONET,我认为它一定是因为接入点没有互联网访问权限,所以我使用这里提出的解决方案进行测试:

adb shell settings put global captive_portal_detection_enabled 0

这是一个解决方案,如果没有root访问权限,就无法以编程方式完成,但我想测试这是否是问题所在。但是,尽管wifi图标上的感叹号已经消失,但客户端套接字仍然给了我同样的异常错误。

有没有人有这种行为的解决方案?提前感谢您!


有时客户端套接字设法打开,成功率为20次中的1次。但是当它这样做时,我通常会在发送几条消息后得到另一个异常:

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

以下是我用于从智能手机连接到接入点的代码:

    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());
    }

接入点的安全类型为 WEP。这是因为Wifi模块无法实现WPA。


在棉花糖上完成的测试。


答案 1

我不能100%确定这个问题是否相同。

我不得不在一段时间内做一个项目,并使用Java套接字。

在进行初始测试时,我使用本地环回,并在同一台计算机和多个线程上使用端口。最终,它运行良好,可以在两台计算机之间进行测试。我发现它在两台计算机之间不起作用。在关闭网络上的所有防火墙和保护等并且绝望地使用直接连接以太网电缆后,我找到了问题。

套接字关心您使用哪个网关。解决方案是让我使用网关而不是环回...现在回想起来很明显...

无论如何,您的移动网关,wifi网关和本地环回很可能都不同。

这是一个丑陋的代码模糊,我希望在灵感很少的情况下给出方向......

Socket socket = null;
try {
    socket = new Socket(ip, port, InetAddress.getLoopbackAddress(), localServerPort);
}
catch (Exception e) {
}
if (socket == null) {
    try {
        socket = new Socket(ip, port, InetAddress.getLocalHost(), localServerPort);
    }
    catch (Exception e) {
    }
}
if(socket == null) {
    throw new Exception("Neither the loop back nor the host could find this sucker.");
}

答案 2

推荐