課題として、複数の 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();
}