我目前正在开发一个使用SDK> = 16的Android应用程序,它应该能够使用WiFi无线电在局域网中发现不同的Android设备(后来也是iOS设备)。
我的第一个猜测是使用在我的三星Galaxy S2上无效的多播:仅在从同一设备发送时才接收数据包。
我的第二个猜测是使用有限的IP地址范围主动扫描网络并等待正确的响应。不幸的是,这意味着网络使用DHCP来寻址IP地址。
上述解决方案似乎都不是完美的解决方案。
我目前的解决方案是我的第一个猜测:
public class MulticastReceiver extends AsyncTask<Activity, Integer, String> {
private static final String host = "224.1.1.1";
private static final int port = 5007;
private static final String TAG = "MulticastReceiver";
protected String doInBackground(Activity... activities) {
WifiManager wm = (WifiManager)activities[0].getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo");
multicastLock.acquire();
String message = "Nothing";
if (multicastLock.isHeld()) {
Log.i(TAG, "held multicast lock");
}
try {
InetAddress addr = InetAddress.getByName(host);
MulticastSocket socket = new MulticastSocket(port);
socket.setTimeToLive(4);
socket.setReuseAddress(true);
socket.joinGroup(addr);
byte[] buf = new byte[5];
DatagramPacket recv = new DatagramPacket(buf, buf.length, addr, port);
socket.receive(recv);
message = new String(recv.getData());
socket.leaveGroup(addr);
socket.close();
} catch (Exception e) {
message = "ERROR " + e.toString();
}
multicastLock.release();
return message;
}
}
此代码导致阻塞行socket.receive(recv);如果我指定超时,则会出现超时异常。
答案 0 :(得分:2)
查看http://developer.android.com/training/connect-devices-wirelessly/index.html它提到了两种寻找本地服务的方式 - NSD和wifi直接。
答案 1 :(得分:2)
在非常相似的问题Android Network Discovery Service (ish) before API 14
中查看我的答案我不相信多播不能在Galaxy S2上运行,前段时间我编写了一些网络应用程序,我在很多设备上进行了多次测试,有些像G1一样老,但也有S2,S3和Galaxy Tab 10。
但是为了能够使用多播,您必须以编程方式启用它。
您是否使用过这段代码?
WifiManager wifi = (WifiManager)getSystemService( Context.WIFI_SERVICE );
if(wifi != null){
WifiManager.MulticastLock lock = wifi.createMulticastLock("Log_Tag");
lock.acquire();
}