0
回答
Android Wifi 获取组播
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

原文转自:http://marshal.easymorse.com/archives/4461

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

举报
无鸯
发帖于6年前 0回/2K+阅
顶部