私はいくつかの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
あなたはUDPが保証配送プロトコルではないことをご存じでしょうか? – EJP
はい私はそれを知っています。しかし、ハードウェアデバイス自体がアクセスポイントとして機能し、アンドロイドは非常に近い範囲(30cm以内)で接続しています。ハードウェアを開発した人がラップトップ上で動作するC++ベースのテストケースで損失がないと主張して以来、私のコードに何か問題があるのだろうかと思います。 – March3April4