设为首页收藏本站

移动叔叔

搜索
查看: 703|回复: 0

[其它] Android中怎么打开Wifi的组播功能

[复制链接]
发表于 2013-8-29 15:03:33 | 显示全部楼层 |阅读模式
了解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==0){
  break;
  }
  packetContent.append((char)receiveData);
  }
  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;
  }
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /1 下一条

© 2008-2024 移动叔叔. 版权所有,专业的网络售后平台 ( 闽ICP备18006692号-3 )

商务合作点击这里给我发消息|Email:service@mobileuncle.com|手机版|Archiver|移动叔叔     

GMT+8, 2024-4-18 15:49 , Processed in 0.134527 second(s), 12 queries , Gzip On, Memcache On.

返回顶部