From: http://www.apkbus.com/forum.php?mod=viewthread&tid=16351 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方法释放锁
下面写了个简单示例,通过组播发现服务器。 Activity写的比较简单:
- 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();
- }
- }
复制代码
在Activity中打开和释放组播锁。使用组播发送报文和接收ip地址信息的工具类代码:
- 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;
- }
- }
|