提问人:Starivore 提问时间:1/18/2017 最后编辑:EricSchaeferStarivore 更新时间:6/8/2022 访问量:1801
Android处理没有互联网连接的物联网设备
Android dealing with IoT devices with NO Internet connection
问:
我正在尝试构建一个项目,我必须通过 Wifi 从智能手机试用物联网设备。
此设备集成了 SPWF01 Wifi 模块,并配置为安全类型为 WEP 的接入点(无法访问 Internet)。在此接入点配置中,我们还有一个TCP套接字服务器,可以拦截智能手机通信。
在智能手机方面,我们有扫描并连接到我们设备的接入点的部分(这可以工作,尽管我在 wifi 图标上得到了感叹号,因为它无法访问 Internet)。连接后,我们启动客户端套接字,该套接字连接到物联网设备上的服务器(服务器套接字的 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,我认为这一定是因为接入点无法访问 Internet,所以我使用此处提出的解决方案进行测试:
adb shell settings put global captive_portal_detection_enabled 0
这是一个在没有root访问权限的情况下无法以编程方式完成的解决方案,但我想测试这是否是问题所在。但是,尽管wifi图标上的感叹号已经消失,但客户端套接字仍然给了我同样的异常错误。
有人对这种行为有解决方案吗?先谢谢你!
有时客户端套接字设法打开,成功率为 1/20 次。但是当它发生时,我通常会在发送几条消息后收到另一个异常:
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.");
}
评论