4

課題として、複数の Android デバイスをセットアップして、ラップトップからローカル WiFi ネットワーク経由で UDP ブロードキャストを受信しようとしています。

機能するもの:

  • 2 台のラップトップの Python ターミナルは、相互に UDP ブロードキャストまたはユニキャストを送受信できます。
  • Android デバイスは、IP に直接送信された UDP メッセージを受信できます

機能しないもの:

  • Android デバイス (LG/Google Nexus 4) が UDP ブロードキャスト メッセージを受信しない (Python を実行している他のラップトップは受信する)

何かアドバイス?各コンポーネントのソースは次のとおりです (恥知らずにインターネットから借りてきました)。

Python 受信ブロードキャスト

import select, socket

port = 50000
bufferSize = 1024

ip = '0.0.0.0'

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((ip, port))

while True:
    msg, result = s.recvfrom(bufferSize)
    pr

int "Received message: ", msg

Python 送信ブロードキャスト

# Send UDP broadcast packets

port = 50000

import sys, time
from socket import *

s = socket(AF_INET, SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)

data = repr(time.time()) + '\n'
s.sendto(data, ('192.168.1.255', port))

アンドロイド

private void receiveUDP() {
    final String[] text = new String[1];
    final int server_port = 50000;
    // create buffer
    final byte[] message = new byte[1500];
    final DatagramPacket p = new DatagramPacket(message, message.length);

    // listen for message, put in buffer
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                while (true) {
                    Log.d(Main.class.getName(), "Created socket");
                    DatagramSocket s = new DatagramSocket(server_port);
                    s.receive(p);
                    text[0] = new String(message, 0, p.getLength());
                    Log.d(Main.class.getName(), "message:" + text[0]);
                    s.close();
                }
            } catch (IOException e) {
                Log.e(this.getClass().getName(), "An unexpected error occurred", e);
            }
        }
    }).start();
}

繰り返しますが、唯一うまくいかないのは Android で UDP ブロードキャストを受信することです。Android はその IP への個々の UDP メッセージを受信でき、Python ターミナルは他のラップトップから UDP ブロードキャストを受信します....

何かアドバイス?

アップデート

MulticastLock を使用することになっていることがわかりました。これを試してみましたが、まだ機能しません。これは新しい Android コードです。

private void receiveUDP() {
    final String[] text = new String[1];
    final int server_port = 50001;
    // create buffer
    final byte[] message = new byte[1500];
    final DatagramPacket p = new DatagramPacket(message, message.length);

    // listen for message, put in buffer
    new Thread(new Runnable() {
        @Override
        public void run() {
            DatagramSocket s = null;
                while (true) {
                    try{
                        WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
                        WifiManager.MulticastLock lock = wifi.createMulticastLock("Main");
                        lock.acquire();
                        s = new DatagramSocket(server_port, InetAddress.getByName("192.168.1.13"));
                        Log.d(Main.class.getName(), "Created socket");
                            s.receive(p);
                        lock.release();
                        text[0] = new String(message, 0, p.getLength());
                        Log.d(Main.class.getName(), "message:" + text[0]);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(context, "Received message: "+text[0], Toast.LENGTH_SHORT).show();
                            }
                        });
                    } catch (SocketException e) {
                        Log.e(Main.class.getName(), "An unexpected error occurred", e);
                    } catch (IOException e) {
                        Log.e(Main.class.getName(), "An unexpected error occurred", e);
                    } finally {
                        if (s != null) s.close();
                        Log.d(Main.class.getName(), "Closing socket");
                    }
                }
        }
    }).start();
}
4

1 に答える 1

1

Nexus 4 を含む一部の電話では、UDP 受信ブロードキャスト機能がロックダウンされているようです。解決策は、別の電話を使用することです。たとえば、安価なHuawei G300で動作します

于 2014-01-28T01:17:14.607 に答える