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 でテストしています。