【问题标题】:Send data through UDP from android to external sensor通过 UDP 从 android 向外部传感器发送数据
【发布时间】:2014-11-25 18:41:45
【问题描述】:

我正在尝试通过 wifi 连接将一些数据从我的 android 发送到外部传感器。虽然我能够通过 UDP 连接成功地将数据从传感器发送到 android,但我无法反其道而行之。发送数据的代码如下:

public void onClick(View v) {
            Thread t = new Thread(){
                @Override
                public void run(){
                    while(true){
                        int server_port = 12345;
                        byte[] message = "1".getBytes();
                        System.out.println(message.toString());
                        try {
                            InetAddress local = InetAddress.getByName("255.255.255.255");
                            DatagramPacket p = new DatagramPacket(message,message.length,local,server_port);
                            DatagramSocket s = new DatagramSocket();

                            s.send(p);
                            s.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            };
            t.start();
        }

正如你在上面看到的,一个按钮的 OnClick,我希望应用程序通过 UDP 发送数据。问题是当我尝试这样做时,会发生此错误:

11-24 16:10:13.335: W/System.err(8077): java.net.SocketException: sendto failed: ENETUNREACH    (Network is unreachable)
11-24 16:10:13.335: W/System.err(8077): at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506)
11-24 16:10:13.335: W/System.err(8077):at libcore.io.IoBridge.sendto(IoBridge.java:475)
11-24 16:10:13.335: W/System.err(8077):at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:182)
11-24 16:10:13.335: W/System.err(8077):     at java.net.DatagramSocket.send(DatagramSocket.java:284)
11-24 16:10:13.343: W/System.err(8077):     at com.example.waspmoteagriculture.MainActivity$3$1.run(MainActivity.java:97)
11-24 16:10:13.343: W/System.err(8077): Caused by: libcore.io.ErrnoException: sendto failed: ENETUNREACH (Network is unreachable)
11-24 16:10:13.343: W/System.err(8077):     at libcore.io.Posix.sendtoBytes(Native Method)
11-24 16:10:13.343: W/System.err(8077):     at libcore.io.Posix.sendto(Posix.java:151)
11-24 16:10:13.343: W/System.err(8077):     at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
11-24 16:10:13.343: W/System.err(8077):     at libcore.io.IoBridge.sendto(IoBridge.java:473)
11-24 16:10:13.343: W/System.err(8077):     ... 3 more

我已经包含了网络权限。另外我应该提到,传感器连接到 android 的 wifi 热点,以便将信息发送到手机。不知道这样接收数据有没有问题。

代码有什么问题还是这个错误与其他问题有关?提前谢谢你。

【问题讨论】:

    标签: java android sockets udp


    【解决方案1】:

    我以某种方式解决了这个问题。似乎广播地址 255.255.255.255 无效,因此找不到当前连接的网络(这也解释了网络不可达问题)。为了让它发送数据,我使用了传感器的 IP 地址(通过使用System.out.println(packet.getAddress().toString()); 的接收包找到它。所以,为了发送数据广播,我猜(尚未测试)应该使用当前网络的广播地址。

    【讨论】:

      【解决方案2】:

      您可能需要设置访问网络的权限。将以下行添加到 AndroidManifest.xml

      <uses-permission android:name="android.permission.INTERNET"/>
      

      如果它不起作用,那么您需要对代码进行一些更改。 在这里阅读更多: https://code.google.com/p/boxeeremote/wiki/AndroidUDP

      【讨论】:

      • 我已经包含了访问网络的权限。即使在使用链接中的代码后,我仍然得到同样的错误。传感器(客户端)如何接收数据包或连接是否正确建立是否存在问题?
      • 我还应该提到传感器已连接到 android 的 wifi 热点。不知道有没有问题...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多