Android代码没有收到UDP数据包

时间:2013-08-16 03:39:33

标签: android udp

此Android代码未接收数据包。代码基于一些工作正常的java代码。有人可以提供意见,可能是什么问题。我们没有在模拟器上运行,因此它不是模拟器问题的人。发件人应用程序使用Android平板电脑wi-fi平板电脑地址以及发送器和接收器中的udp端口匹配。

应用程序是否正在丢弃数据包。

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class NetworkServer extends Thread
{

   DatagramSocket mSocket = null;   
   boolean isFinish = false;

   private SimplestPossibleActivity activity;

   public NetworkServer(SimplestPossibleActivity activity)
   {
    this.activity = activity;
   }

   public void run() 
   {

      try 
      {

        Log.d("UDP", "Listening");
        mSocket = new DatagramSocket( 2010); //4444
        mSocket.setBroadcast(true);

        while (!isFinish) 
        {

           Log.d("UDP", "C: socket create success");
           byte[] recvbuffer = new byte[12];
           DatagramPacket packet = new DatagramPacket(recvbuffer,recvbuffer.length);
           Log.d("UDP", "receiving...");
           mSocket.receive(packet);
           Log.d("UDP", "received packet");

           ByteBuffer bb = ByteBuffer.allocate(recvbuffer.length).
                                       order(ByteOrder.LITTLE_ENDIAN);
           bb.put(recvbuffer);
           bb.rewind();
           //System.out.println(bb.getFloat());
           //System.out.println(bb.getFloat());
           //System.out.println(bb.getFloat());

           // byte[] buffer = packet.getData();
           //  String msg = new String(buffer);

           // bundle data to send to message handler
           Bundle data = new Bundle();
           data.putFloat("latitude",  bb.getFloat());
           data.putFloat("longitude", bb.getFloat());
           data.putFloat("altitude",  bb.getFloat());

           Message msgHandle = new Message();
           msgHandle.setData(data);
           mhandler.sendMessage(msgHandle);

       } //end while
     } catch (Exception e) {
         Log.e("UDP", "C: Error", e);
     }

   }

   private Handler mhandler = new Handler() 
   {

        @Override
        public void handleMessage(Message msg) 
        {
           float lat;
           float lon;
           float alt;

           Bundle data = msg.getData();
           Log.d("NetworkServer","adding position" + "lat = " + data.getFloat("latitude") +
                                 "lon = " + data.getFloat("longitude") + 
                                 "alt = " + data.getFloat("altitude"));
           activity.addPosition(data.getFloat("latitude"), 
                               data.getFloat("longitude"), 
                               data.getFloat("altitude"));

    }

   };
}

1 个答案:

答案 0 :(得分:1)

好吧,我发现Android不接受绝对广播的UDP数据包。我还在努力确定这个问题。

包含的服务器代码应该没问题。 recvbuffer是预期数据的正确大小,我假设如果它实际上是在接收UDP数据包,你会解释任何有经验的错误。意思是,无论您的用例是什么,服务器都没有收到UDP数据包,因为它没有被发送,或者被中断了。

1)我相信你在PC上使用发送者应用程序,而不是Android设备。 (“发件人应用程序正在使用Android平板电脑wi-fi平板电脑地址以及发送器和接收器中的udp端口匹配。”)如果是这种情况,请安装Wireshark并侦听发送的UDP数据包。确认数据包确​​实正在发送。

2)我假设您没有在同一台PC上测试原始Java代码。例如接收者和发送者在同一台PC上。您是否在PC上测试发送者到Android接收器应用程序?

3)我还假设您在AndroidManifest.xml文件中拥有正确的最低Android权限。例如如果你正在组播UDP,你需要做的不仅仅是这个,但我不相信你。

声称丢弃数据包的唯一方法是确定它们实际上已发送到网络中。 (如果可能,请使用Wireshark)您的数据包大小非常小,以至于没有理由认为任何路由器会根据大小限制丢弃数据包。

尝试提交客户端代码并解释您的测试方案是如何正常工作的。