Android中怎么打开Wifi的组播功能

发布网友 发布时间:2022-04-25 01:06

我来回答

1个回答

热心网友 时间:2023-10-18 21:57

打开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;
  }
  }

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com