1

Android 3.1 タブレット アプリケーションを開発しています。

このアプリを使用して、5 秒ごとに 255.255.255.255:8001 に UDP パケットを送信しているデバイスから送信された UDP パケットをリッスンします。

デスクトップ プログラムDocklight スクリプト v1.9を使用すると、このデバイスが 5 秒ごとに 11 バイトのパケットを送信することがわかります。アプリがすべてのパケットを受信するわけではありません。

これは私の活動です:

public class UDPSocketActivity extends Activity
{
    private UDPServerThread myThread;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        int ipAddress = wifiInfo.getIpAddress();

        TextView txt = (TextView)findViewById(R.id.deviceIP);
        txt.setText(Integer.toString(ipAddress));
    }

    public void onStartClick(View view)
    {
        Log.v("UDPSocketActivity", "onClick");

        try
        {
            myThread = new UDPServerThread("X", 8001);
            myThread.start();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

これは UDP ソケット スレッドです。

public class UDPServerThread extends Thread
{
    private static final int MESSAGE_SIZE = 11;
    protected DatagramSocket socket = null;
    protected boolean end = false;

    public UDPServerThread(String serverName, int port) throws IOException
    {
        super(serverName);

        Log.v("UDPServerThread", "constructor");

        socket = new DatagramSocket(port);
        socket.setBroadcast(true);
    }

    public void run()
    {
        while (!end)
        {
            try
            {
                byte[] buf = new byte[MESSAGE_SIZE];

                // Wait an incoming message.
                DatagramPacket packet = new DatagramPacket(buf, buf.length);

                Log.v("UDServerThread", "Listenning...");

                socket.receive(packet);

                Log.v("UDServerThread", "Mensaje recibido.");
            }
            catch (IOException e)
            {
                if (!socket.isClosed())
                    e.printStackTrace();
            }
        }
    }

    public void stopServer()
    {
        Log.v("UDPServerThread", "stopServer");
        if (socket != null)
            socket.close();
        end = true;
    }
}

これは AndroidManifest.xml のアクセス許可です。

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

更新:
UDP パケットをタブレットの IP、たとえば UDP:192.168.1.135:8001 に送信すると、パケットが受信されることがあります。また、同時に 3 つまたは 4 つ受信することもあります。

しかし、直接 UDP パケットをHTC Desire 2.2.2に送信すると、それらはすべて受信されますが、私の HTC はブロードキャスト パケットを受信しません。そして、私は同じコードを使用しています。

これは、UDPブロードキャストパケットを受信する方法です(時間を見てください):

07-06 12:08:56.580: V/UDServerThread(6449): Mensaje recibido.
07-06 12:08:59.655: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:02.410: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:03.230: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:03.435: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:03.745: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:03.945: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:04.460: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:04.770: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:04.975: V/UDServerThread(6449): Mensaje recibido.
07-06 12:09:46.855: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:06.005: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:06.310: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:06.515: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:06.825: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:07.335: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:07.640: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:07.845: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:10.415: V/UDServerThread(6449): Mensaje recibido.
07-06 12:10:17.065: V/UDServerThread(6449): Mensaje recibido.

私は何を間違っていますか?たぶん、カスタム構成が必要です。

ちなみに、私は Android 3.1 を搭載した Samsung Galaxy Tab 7.7 でテストしています。

4

3 に答える 3

0

ルーターに問題がありました。

注:同じ問題を抱えている他の人にとって役立つと思うので、私は自分の質問に答えます(私は4日で対処していました)。

于 2012-07-08T13:35:13.830 に答える
0

HTC でブロードキャストを受信するには、Wifi マルチキャスト ロックを取得する必要があります。基本的に一部のメーカーはデフォルトでマルチキャストの受信を無効にしています。タブレットで何が起こっているのか、まだわかりません。おそらく、何らかのバッファリングや遅いネットワーク機器が途中にありますか?

WifiManager wifi;
wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
MulticastLock ml = wifi.createMulticastLock("just some tag text");
ml.acquire();

When the asynctask stops I do a 
ml.release();

Android Issues Tracker からのコード

于 2012-07-06T11:14:32.370 に答える
0

すべての送信パケットを確実に受信したい場合は、UDP の代わりに TCP プロトコルを使用する必要があります。

于 2012-07-06T08:35:00.627 に答える