モバイルデバイスから送信UDP Multicast
するコードを書いています。Wifi
ネットワーク内の他のデバイスで実行されているサーバー コードがあります。サーバーはマルチキャストをリッスンし、IP アドレスとシステムのタイプ (タイプ: コンピューター、モバイル デバイス、Raspberry Pi、Flyports など) で応答します。
を送信したモバイル デバイスで、に応答するデバイスのリストUDP Multicast
を取得する必要があります。UDP Multicast
このために、 の構造として機能するクラスを作成しましたdevice details
。
DeviceDetails.class
public class DeviceDetails
{
String DeviceType;
String IPAddr;
public DeviceDetails(String type, String IP)
{
this.DeviceType=type;
this.IPAddr=IP;
}
}
と で UDP マルチキャスト パケットを送信していgroup address of 225.4.5.6
ますPort Number 5432
。
thread
を送信するを呼び出すクラスを作成しましたUDP Packets
。一方、応答するデバイスのリストを返すCallablereceiver thread
Interface を実装する を作成しました。
コードは次のとおりです。
MulticastReceiver.java
public class MulticastReceiver implements Callable<DeviceDetails>
{
DatagramSocket socket = null;
DatagramPacket inPacket = null;
boolean check = true;
public MulticastReceiver()
{
try
{
socket = new DatagramSocket(5500);
}
catch(Exception ioe)
{
System.out.println(ioe);
}
}
@Override
public DeviceDetails call() throws Exception
{
// TODO Auto-generated method stub
try
{
byte[] inBuf = new byte[WifiConstants.DGRAM_LEN];
//System.out.println("Listening");
inPacket = new DatagramPacket(inBuf, inBuf.length);
if(check)
{
socket.receive(inPacket);
}
String msg = new String(inBuf, 0, inPacket.getLength());
Log.v("Received: ","From :" + inPacket.getAddress() + " Msg : " + msg);
DeviceDetails device = getDeviceFromString(msg);
Thread.sleep(100);
return device;
}
catch(Exception e)
{
Log.v("Receiving Error: ",e.toString());
return null;
}
}
public DeviceDetails getDeviceFromString(String str)
{
String type;
String IP;
type=str.substring(0,str.indexOf('`'));
str = str.substring(str.indexOf('`')+1);
IP=str;
DeviceDetails device = new DeviceDetails(type,IP);
return device;
}
}
次のコードは、 を呼び出すアクティビティのコードですReceiver Thread
。
public class DeviceManagerWindow extends Activity
{
public void searchDevice(View view)
{
sendMulticast = new Thread(new MultiCastThread());
sendMulticast.start();
ExecutorService executorService = Executors.newFixedThreadPool(1);
List<Future<DeviceDetails>> deviceList = new ArrayList<Future<DeviceDetails>>();
Callable<DeviceDetails> device = new MulticastReceiver();
Future<DeviceDetails> submit = executorService.submit(device);
deviceList.add(submit);
DeviceDetails[] devices = new DeviceDetails[deviceList.size()];
int i=0;
for(Future<DeviceDetails> future :deviceList)
{
try
{
devices[i] = future.get();
}
catch(Exception e)
{
Log.v("future Exception: ",e.toString());
}
}
}
}
現在、パケットを受信する標準的な方法はreceive method
、無限ループの下で を呼び出すことです。しかし、着信接続を最初の 30 秒間だけ受信してから、接続の検索を停止したいと考えています。
This is similar to that of a bluetooth searching. It stops after 1 minute of search.
問題は、カウンターを使用できることですが、問題 thread.stop
は現在廃止されていることです。 これだけでなく、無限ループの下に置くと、値が返されません。receive method
私は何をすべきか。?たとえば 30 秒間検索してから検索を停止し、応答しているデバイスのリストを返したいとします。