与wiFly通信时出现连接错误

时间:2013-03-29 15:42:13

标签: java android sockets

我正在设置我的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文件中所需的所有必要权限。

2 个答案:

答案 0 :(得分:0)

您的手机有哪些IP地址?

您需要将手机配置为具有与wifly模块相同范围的IP地址,或者让智能手机通过其dhcp服务器为您提供IP。

如果您尚未将固件升级到v4,那么您应该首先执行此操作,它可以解决一些问题,但与v2固件相比具有一个明显优势 - 它可以创建一个软AP,您的设备可以连接到该AP,默认情况下,给你的手机一个IP地址。然后,您就可以轻松连接到它。

Roving networks upgrade info

作为在软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的情况下保留用于自我分配,但实际情况并非如此。在这种情况下,您不能使用链接本地地址作为默认地址。

前面清楚地表明,编写固件的所谓工程师不了解或不了解互联网协议。就硬件而言,它似乎是一个很棒的设备,但固件显然是由智障人士写的。