zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    [root@py ~]# watch -n 1 ifconfig 求解释
    25 个常用的 Linux iptables 规则
    linux shell 字符串操作(长度,查找,替换)详解
    linux高级网络配置 ip别名,接口绑定
    初始版本控制工具-Git
    详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ”
    wireshark_users
    wireshark抓包基础步骤及PPPOE拨号抓包过程分析
    ARP原理与ARP攻击
    PPPOE 详解
  • 原文地址:https://www.cnblogs.com/tianciliangen/p/3988491.html
Copyright © 2011-2022 走看看