android ONVIF 组播探测在线摄像机

http://blog.csdn.net/ghostyu/article/details/8182516

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方法释放锁

1、创建组播用的udp socket,

2、绑定组播地址为239.255.255.250,端口为3702,因为ws-discovery的组播地址和端口就是为239.255.255.250和3702

 

直接上代码:

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();   

    }   

}

 

 

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;   

    }   

}  

 

上面代码供参考,但是没有测试在htc手机上成功

 

下面是本人修改过的代码:

public static String findServerIpAddress() throws IOException {

        

        String sinfo = "";

        byte[] sendData = sinfo.getBytes();

        String ip = "";

        try {

            MulticastSocket multicastSocket = new MulticastSocket(

                    MULTICAST_PORT);

            multicastSocket.setLoopbackMode(true);//修改添加代码部分不添加不能发送成功

            InetAddress group = InetAddress.getByName(GROUP_IP);

            multicastSocket.setLoopbackMode(true);

            multicastSocket.joinGroup(group);

            multicastSocket.setSoTimeout(10000);

            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) {

                    }

                }

            }

        } catch (Exception ee) {

            Log.d(TAG, ee.toString());

        }

        return ip;

    }

 

 

http://blog.csdn.net/lvron/article/details/6606755

你可能感兴趣的:(android)