android关于组播的问题

来源:互联网 发布:人工智能孵化器 编辑:程序博客网 时间:2024/06/06 16:49
        了解Android的都知道Android的wifi在默认的情况下是不接收组播的,默认情况下,应用是不接收组播信息的,这样要接收处理的报文太多,很快就会把电池用尽。要知道移动设备(特指电话一类的,平板要好得多)目前最重要的因素是电量。下面就看看怎么样打开Android中Wifi的组播功能。主要有以下几个步骤:

  在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;  }  }


0 0