我正在设置我的Android设备和wiFly(RN-171)模块之间的通信。我在Android设备上创建了一个ad-hoc网络,并将wiFly连接到网络。 wiFly配置为侦听169.254.1.1:2000。我在应用程序中创建套接字以与wiFly进行通信。代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.os.Bundle;
import android.os.StrictMode;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
Socket echoSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
echoSocket = new Socket("169.254.1.1", 2000);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: wiFly.");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for "
+ "the connection to: wiFly.");
}
BufferedReader stdIn = new BufferedReader(
new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo: " + in.readLine());
}
out.close();
in.close();
stdIn.close();
echoSocket.close();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
很抱歉使用StrictMode。一旦运行,将切换到AsyncTask。 以下是警告信息:
03-29 21:55:40.352: W/AdHoc(15118): failed to connect to /169.254.1.1 (port 2000): connect failed: ENETUNREACH (Network is unreachable)
03-29 21:55:40.352: W/System.err(15118): java.net.ConnectException: failed to connect to /169.254.1.1 (port 2000): connect failed: ENETUNREACH (Network is unreachable)
03-29 21:55:40.362: W/System.err(15118): at libcore.io.IoBridge.connect(IoBridge.java:114)
03-29 21:55:40.362: W/System.err(15118): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
03-29 21:55:40.362: W/System.err(15118): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
03-29 21:55:40.362: W/System.err(15118): at java.net.Socket.startupSocket(Socket.java:566)
03-29 21:55:40.362: W/System.err(15118): at java.net.Socket.tryAllAddresses(Socket.java:127)
03-29 21:55:40.362: W/System.err(15118): at java.net.Socket.<init>(Socket.java:177)
03-29 21:55:40.362: W/System.err(15118): at java.net.Socket.<init>(Socket.java:149)
03-29 21:55:40.362: W/System.err(15118): at com.example.udp.MainActivity.onCreate(MainActivity.java:33)
03-29 21:55:40.362: W/System.err(15118): at android.app.Activity.performCreate(Activity.java:4492)
03-29 21:55:40.362: W/System.err(15118): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-29 21:55:40.362: W/System.err(15118): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
03-29 21:55:40.362: W/System.err(15118): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
03-29 21:55:40.372: W/System.err(15118): at android.app.ActivityThread.access$600(ActivityThread.java:123)
03-29 21:55:40.372: W/System.err(15118): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
03-29 21:55:40.372: W/System.err(15118): at android.os.Handler.dispatchMessage(Handler.java:99)
03-29 21:55:40.372: W/System.err(15118): at android.os.Looper.loop(Looper.java:137)
03-29 21:55:40.372: W/System.err(15118): at android.app.ActivityThread.main(ActivityThread.java:4424)
03-29 21:55:40.372: W/System.err(15118): at java.lang.reflect.Method.invokeNative(Native Method)
03-29 21:55:40.372: W/System.err(15118): at java.lang.reflect.Method.invoke(Method.java:511)
03-29 21:55:40.382: W/System.err(15118): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-29 21:55:40.382: W/System.err(15118): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-29 21:55:40.382: W/System.err(15118): at dalvik.system.NativeStart.main(Native Method)
03-29 21:55:40.382: W/System.err(15118): Caused by: libcore.io.ErrnoException: connect failed: ENETUNREACH (Network is unreachable)
03-29 21:55:40.382: W/System.err(15118): at libcore.io.Posix.connect(Native Method)
03-29 21:55:40.382: W/System.err(15118): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
03-29 21:55:40.382: W/System.err(15118): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
03-29 21:55:40.382: W/System.err(15118): at libcore.io.IoBridge.connect(IoBridge.java:112)
03-29 21:55:40.382: W/System.err(15118): ... 21 more
03-29 21:55:40.392: W/System.err(15118): Couldn't get I/O for the connection to: wiFly.
我在android 4.0.4上运行它,并包含了Manifest文件中所需的所有必要权限。
答案 0 :(得分:0)
您的手机有哪些IP地址?
您需要将手机配置为具有与wifly模块相同范围的IP地址,或者让智能手机通过其dhcp服务器为您提供IP。
如果您尚未将固件升级到v4,那么您应该首先执行此操作,它可以解决一些问题,但与v2固件相比具有一个明显优势 - 它可以创建一个软AP,您的设备可以连接到该AP,默认情况下,给你的手机一个IP地址。然后,您就可以轻松连接到它。
作为在软ap模式下运行的旁注,wifly获得了1.2.3.4的ip地址 - 不知道为什么他们选择了:/
答案 1 :(得分:0)
您不能将1.2.3.4用于任何设备。 1.2.3.4是澳大利亚的真实IP地址。任何创建默认IP地址为1.2.3.4的设备的工程师都是白痴。您不能随便为IP地址选择一个号码;这不是它的工作原理。
我的WiFly RN-171XV文档告诉我,升级到v4.40固件并恢复出厂设置后,处于硬件AP模式的设备的默认IP地址为1.2.3.4,但它没有响应该地址,DHCP服务器不响应任何请求。
因此,我完全失去了与设备的联系。它也没有响应Tx / Rx。
在旧固件v2.30下,Ad Hoc模式默认IP地址为169.254.1.1,这是一个链接本地地址,在没有DHCP的情况下保留用于自我分配,但实际情况并非如此。在这种情况下,您不能使用链接本地地址作为默认地址。
前面清楚地表明,编写固件的所谓工程师不了解或不了解互联网协议。就硬件而言,它似乎是一个很棒的设备,但固件显然是由智障人士写的。