0

我正在尝试在我的 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;
}
}

很抱歉使用严格模式。一旦运行,将切换到 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 文件中包含了所有必要的权限。

4

2 回答 2

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

上述情况清楚地表明,编写固件的所谓工程师对 Internet 协议一无所知。就硬件而言,这似乎是一个很棒的设备,但固件显然是由智障人士编写的。

于 2014-02-28T22:07:29.810 回答
0

你的手机有什么IP地址?

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

如果您尚未将固件升级到 v4,那么您可能应该首先这样做,它修复了一些问题,但与 v2 固件相比有一个明显的优势 - 它创建了一个您的设备可以连接的软 AP,并且默认情况下,它会为您提供打电话给一个IP地址。然后,您将能够连接到它而几乎没有问题。

流动网络升级信息

作为在软 ap 模式下运行的旁注,wifly 的 IP 地址为 1.2.3.4 - 不知道他们为什么选择它:/

于 2013-06-29T23:19:19.467 回答