http://blog.csdn.net/ghostyu/article/details/8182516
Android的Wifi,默认情况下是不接受组播的,见:http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html
默认情况下,应用是不接收组播信息的,这样要接收处理的报文太多,很快就会把电池用尽。要知道移动设备(特指电话一类的,平板要好得多)目前最重要的因素是电量。
要想打开组播功能,有以下几个步骤:
- 在Manifest文件中加入:android.permission.CHANGE_WIFI_MULTICAST_STATE,这个权限
- 获取到MulticastLock对象,这个对象不能直接实例化,要通过WifiManager间接得到,工厂模式
- 调用MulticastLock对象的acquire方法,获取到组播锁
- 相应的,用完组播,为了不浪费电力,要调用MulticastLock的release方法释放锁
1、创建组播用的udp socket,
2、绑定组播地址为239.255.255.250,端口为3702,因为ws-discovery的组播地址和端口就是为239.255.255.250和3702
直接上代码:
public class MulticastDemoActivity extends Activity { MulticastLock multicastLock; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); allowMulticast(); try { NetUtil.findServerIpAddress(); } catch (IOException e) { throw new RuntimeException(e); } Log.d("multicast.demo", "find ip ok."); multicastLock.release(); } private void allowMulticast(){ WifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE); multicastLock=wifiManager.createMulticastLock("multicast.test"); multicastLock.acquire(); } }
public class NetUtil { private static final String TAG="Net.Utils"; private static final int MULTICAST_PORT=5111; private static final String GROUP_IP="224.5.0.7"; private static byte[] sendData; static{ sendData=new byte[4]; // 0xEE78F1FB sendData[3] = (byte) 0xEE; sendData[2] = (byte) 0×78; sendData[1] = (byte) 0xF1; sendData[0] = (byte) 0xFB; } public static String findServerIpAddress() throws IOException{ String ip=null; MulticastSocket multicastSocket=new MulticastSocket(MULTICAST_PORT); multicastSocket.setLoopbackMode(true); InetAddress group = InetAddress.getByName(GROUP_IP); multicastSocket.joinGroup(group); DatagramPacket packet=new DatagramPacket(sendData, sendData.length,group,MULTICAST_PORT); for(;;){ multicastSocket.send(packet); Log.d(TAG,">>>send packet ok"); byte[] receiveData=new byte[256]; packet=new DatagramPacket(receiveData, receiveData.length); multicastSocket.receive(packet); String packetIpAddress=packet.getAddress().toString(); packetIpAddress=packetIpAddress.substring(1, packetIpAddress.length()); Log.d(TAG,"packet ip address: "+packetIpAddress); StringBuilder packetContent=new StringBuilder(); for(int i=0;i<receiveData.length;i++){ if(receiveData[i]==0){ break; } packetContent.append((char)receiveData[i]); } ip=packetContent.toString(); Log.d(TAG,"packet content ip is: "+ip); if(ip.equals(packetIpAddress)){ Log.d(TAG,"find server ip address: "+ip); break; }else{ Log.d(TAG,"not find server ip address, continue …"); try { Thread.sleep(1000); } catch (InterruptedException e) { } } } return ip; } }
上面代码供参考,但是没有测试在htc手机上成功
下面是本人修改过的代码:
public static String findServerIpAddress() throws IOException { String sinfo = ""; byte[] sendData = sinfo.getBytes(); String ip = ""; try { MulticastSocket multicastSocket = new MulticastSocket( MULTICAST_PORT); multicastSocket.setLoopbackMode(true);//修改添加代码部分不添加不能发送成功 InetAddress group = InetAddress.getByName(GROUP_IP); multicastSocket.setLoopbackMode(true); multicastSocket.joinGroup(group); multicastSocket.setSoTimeout(10000); DatagramPacket packet = new DatagramPacket(sendData, sendData.length, group, MULTICAST_PORT); for (;;) { multicastSocket.send(packet); Log.d(TAG, ">>>send packet ok"); byte[] receiveData = new byte[256]; packet = new DatagramPacket(receiveData, receiveData.length); multicastSocket.receive(packet); String packetIpAddress = packet.getAddress().toString(); packetIpAddress = packetIpAddress.substring(1, packetIpAddress.length()); Log.d(TAG, "packet ip address: " + packetIpAddress); StringBuilder packetContent = new StringBuilder(); for (int i = 0; i < receiveData.length; i++) { if (receiveData[i] == 0) { break; } packetContent.append((char) receiveData[i]); } ip = packetContent.toString(); Log.d(TAG, "packet content ip is: " + ip); if (ip.equals(packetIpAddress)) { Log.d(TAG, "find server ip address: " + ip); break; } else { Log.d(TAG, "not find server ip address, continue …"); try { Thread.sleep(1000); } catch (InterruptedException e) { } } } } catch (Exception ee) { Log.d(TAG, ee.toString()); } return ip; }