2016-11-21 8 views
0

私はいくつかのLinuxマシン(カメラ付きの非常に低い仕様のマシン)とのudp通信で構成されるアンドロイドアプリを書いています。Android UDPパケット損失:なぜですか?

このマシンは、rtspサーバーとudpパケットで特定のキーワードと応答に応答するudpサーバーで構成されています。

ハードウェアの開発者は、ノートパソコンでテストしたときに間違ったことはないと言いますが、私のアンドロイドデバイスでは損害が発生しています。

以下は私のソースです。

これは1つのコマンドを送信し、デバイスは長さ10の2つのパケットをそれぞれ返送します。

このソースが失われる可能性のあるフォルトが存在するかどうか検査できますか?

private DatagramSocket clientSocket; 

public void stopUdpSocket(){ 
    try { 
     if (clientSocket != null) { 
      clientSocket.close(); 
     } 
    }catch (Exception e){ 
     Log.e("test", "error", e); 
    } 
} 

public void sendUdp(final Context context, final String command, final Handler handler) { 
    new AsyncTask<Void, Void, List<String>>() { 

     @Override 
     protected List<String> doInBackground(Void... voids) { 
      Log.e("Test", "send $SNAPSHOT onLine"); 
      try { 
       clientSocket = new DatagramSocket(9999, InetAddress.getByName("0.0.0.0")); 
       byte[] sendData = new byte[1024]; 
       byte[] receivedata = new byte[1024]; 

       String sentence = command; 
       DatagramPacket receivePacket = new DatagramPacket(receivedata, receivedata.length); 

       sendData = sentence.getBytes(); 
       String receivedData = " "; 
       DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("192.168.5.1"), 9999); 
       clientSocket.send(sendPacket); 
       List<String> temp = new ArrayList<>(); 
       List<String> result = new ArrayList<>(); 

       int timeoutCounter = 0; 

       do { 
        if (timeoutCounter == 4) { 
         try { 
          Log.e("Test", "UDP TIMEOUT"); 
          clientSocket.close(); 
         } catch (Exception e) { 
          Log.e("test", "Execption", e); 
         } 
         return null; 
        } 

        clientSocket.receive(receivePacket); 
        receivedData = new String(receivePacket.getData(), 0, receivePacket.getLength()); 

        Log.e("Test", receivedData + ", IP CHECK Sender: : " + receivePacket.getAddress().toString() + ", port : " + receivePacket.getPort()); 

        if (!receivedData.equals("!HEARTBEAT")) { 
         Log.e("Test", "ADD : " + receivedData); 
         temp.add(receivedData); 
         timeoutCounter = 0; 
        } 

        if (temp.size() == 2) { 
         break; 
        } 
        receivePacket = new DatagramPacket(receivedata, receivedata.length); 
        timeoutCounter++; 
       } while (true); 

       clientSocket.close(); 
       Log.e("Test", "End of UDP TASK - client socket closed"); 

       for (String s : temp) { 
        result.add(s.substring(2, s.length() - 1)); 
       } 

       return result; 

      } catch (Exception e) { 
       Log.e("Test", "e", e); 
      }finally { 
       stopUdpSocket(); 
      } 
      return null; 
     }//end of doInBackground 
    }.execute(); 
}//end of sendUdp 
+1

あなたはUDPが保証配送プロトコルではないことをご存じでしょうか? – EJP

+0

はい私はそれを知っています。しかし、ハードウェアデバイス自体がアクセスポイントとして機能し、アンドロイドは非常に近い範囲(30cm以内)で接続しています。ハードウェアを開発した人がラップトップ上で動作するC++ベースのテストケースで損失がないと主張して以来、私のコードに何か問題があるのだろうかと思います。 – March3April4

答えて

0

UDPは、Communication Layerでのデータ配信を保証しないConnection Less Protocolです。データ配信を保証するには、アプリケーション層にプロトコルを実装する必要があります。 SEND XXX,ACK XXXACKが届かない場合は、データを再送信する必要があります。

または単にコネクション指向と配信保証のTCPを使用します。

+0

まあ、私はそれが信頼できるプロトコルではないことを知っています。しかし、ハードウェア開発者は、ラップトップで実行されたC++ベースのテストケースには損失がないと主張しています。同じネットワークアクセスポイントでは、ラップトップとスマートフォン間のネットワーク容量が異なる可能性がありますか? – March3April4

関連する問題