我正在尝试建立一个项目,我必须通过wifi从智能手机试用物联网设备。
此设备集成了SPWF01 Wifi模块,并配置为安全类型为WEP的接入点(无法访问Internet)。在此接入点配置中,我们还有一个拦截智能手机通信的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,我认为必须是因为接入点没有互联网接入,所以我使用了建议的here解决方案用于测试目的:
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。
在Marshmallow上进行的测试。