gpt4 book ai didi

java - Android 处理没有互联网连接的物联网设备

转载 作者:行者123 更新时间:2023-12-04 23:36:32 25 4
gpt4 key购买 nike

我正在尝试构建一个项目,我必须通过 Wifi 从智能手机试用 IoT 设备。
此设备集成了 SPWF01 Wifi 模块,并配置为安全类型 WEP 的接入点(无法访问 Internet)。在这个接入点配置上,我们还有一个 TCP 套接字服务器,它拦截智能手机通信。
在智能手机方面,我们有扫描并连接到我们设备的接入点的部分(虽然我在 wifi 图标上得到了 esclamation 点,因为它没有互联网接入)。连接后,我们在 IoT 设备上启动 Client Socket 连接到服务器(服务器套接字的 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
}
这是我得到的异常(exception):
java.net.SocketException: socket failed: ENONET (Machine is not on the network)
我什至在到达 nsocket.connect() 之前就收到了这个错误,恰好在 setReuseAddress 上。
由于我得到的异常(exception)是ENONET,我认为这一定是因为接入点没有互联网接入所以我使用了建议的解决方案 here用于测试目的:
adb shell settings put global captive_portal_detection_enabled 0
这是一个在没有 root 访问权限的情况下无法以编程方式完成的解决方案,但我想测试这是否是问题所在。但是虽然wifi图标上的感叹号消失了,但是客户端socket还是给了我同样的异常错误。
有人对此行为有解决方案吗?先感谢您!

有时客户端套接字会设法打开,成功率为 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。

对棉花糖进行的测试。

最佳答案

我不能 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.");
}

关于java - Android 处理没有互联网连接的物联网设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41718710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com