0

この 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"));

    }

   };
}
4

1 に答える 1

1

確かにブロードキャストされたUDPパケットをAndroidが受け入れないのを見てきました。私はまだ問題を特定しようとしています。

含まれているサーバーコードは問題ありません。recvbuffer は予想されるデータに適したサイズであり、実際に UDP パケットを受信して​​いた場合に経験したエラーについて説明したと思います。つまり、ユースケースが何であれ、UDP パケットは送信されなかったか、中断されたため、サーバーによって受信されていません。

1) Android デバイスではなく、PC で送信アプリを使用していると思われます。(「送信側アプリは、送信側と受信側の両方で udp ポートが一致するだけでなく、android タブレットの wi-fi タブレット アドレスも使用しています。」) この場合は、Wireshark をインストールして、送信された UDP パケットをリッスンします。パケットが実際に送信されていることを確認します。

2) 同じ PC から元の Java コードをテストしていないと思います。たとえば、受信者と送信者は同じ PC 上にあります。PC 上の送信機を Android 受信機アプリに対してテストしていますか?

3) また、AndroidManifest.xml ファイルに適切な最小限の Android 権限があることも前提としています。たとえば、UDP をマルチキャストしている場合は、これ以上のことを行う必要がありますが、そうではないと思います。

パケットがドロップされたと主張する唯一の方法は、パケットが実際にネットワークに送信されたことを確認することです。(可能な場合は Wireshark してください) パケット サイズが非常に小さいため、サイズ制限に基づいてルーターがパケットをドロップすると考える理由はありません。

クライアント コードを送信してみて、テスト シナリオが正確にどのように機能するかを説明してください。

于 2013-09-24T18:19:16.060 に答える