onvif在android上实现局域网搜索得到当前编码配置

关于onvif在Android上实现,与IPC之间的通讯
实现局域网下搜索IPC,显示修改编码配置,显示修改网络配置
直接上代码
首先,要写一个server,并在放listview的页面监听
写server所需一下几步
创建CamCameraDevice.java


interface OnSoapDoneListener {
    void onSoapDone(CameraDevice device, boolean success);
}

public class CameraDevice implements IPCam {
   
    public UUID uuid;
    public String serviceURL;
    private int id;
    private String name;
    private String ipAddr;
    private boolean isOnline = false;
    private String rtspUri = "";
    private FFmpegFrameGrabber mGrabber;
    private SurfaceView mSurfaceView;
    private OnSoapDoneListener mListener;

    public int width;
    public int height;
    public int rate;

    public String username;
    public String password;

    public CameraDevice(UUID uuid, String serviceURL) {
        this.uuid = uuid;
        this.serviceURL = serviceURL;
    }

    public void setSecurity(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public void setProperties(int width, int height, int rate) {
        this.width = width;
        this.height = height;
        this.rate = rate;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setIpAddr(String ipAddr) {
        this.ipAddr = ipAddr;
    }

    public void setOnline(boolean isOnline) {
        this.isOnline = isOnline;
    }

    @Override
    public void IPCamInit() {
        if (this.isOnline) {
            HttpSoap soap = new HttpSoap(this);
            soap.setOnHttpSoapListener(listener);
            soap.start();
        }
    }

    public void setOnSoapDoneListener(OnSoapDoneListener listener) {
        mListener = listener;
    }

    private OnHttpSoapListener listener = new OnHttpSoapListener() {
        @Override
        public void OnHttpSoapDone(CameraDevice camera, String uri, boolean success) {
            if (success) {
                rtspUri = uri.substring(0, uri.indexOf("//") + 2) + camera.username
                        + ":" + camera.password + "@"
                        + uri.substring(uri.indexOf("//") + 2);
                mGrabber = new FFmpegFrameGrabber(rtspUri);
                mGrabber.setImageWidth(width);
                mGrabber.setImageHeight(height);
                try {
                    mGrabber.start();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (mListener != null) {
                mListener.onSoapDone(CameraDevice.this, success);
            }
        }
    };

    @Override
    public int getId() {
        return this.id;
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public String getIpAddress() {
        return this.ipAddr;
    }

    @Override
    public boolean isOnline() {
        return this.isOnline;
    }

    @Override
    public void setSurfaceView(SurfaceView surfaceView) {
        // TODO what to do ?
        mSurfaceView = surfaceView;
    }

    @Override
    public IplImage grab() {
        if (mGrabber != null) {
            try {
                return mGrabber.grab();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        } else {
            return null;
        }
    }

    @Override
    public void IPCamRelease() {
        try {
            mGrabber.stop();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

创建CameraFinder.java


interface OnCameraFinderListener {
    public void OnCameraListUpdated();
}

public class CameraFinder{
   
    public static final String DISCOVERY_PROBE_TDS = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Envelope xmlns:tds=\"http://www.onvif.org/ver10/device/wsdl\" xmlns=\"http://www.w3.org/2003/05/soap-envelope\"><Header><wsa:MessageID xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">uuid:5101931c-dd3e-4f14-a8aa-c46144af3433</wsa:MessageID><wsa:To xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To><wsa:Action xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action></Header><Body><Probe xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://schemas.xmlsoap.org/ws/2005/04/discovery\"><Types>dn:NetworkVideoTransmitter</Types><Scopes /></Probe></Body></Envelope>";
    public static final int BROADCAST_SERVER_PORT = 3702;
    public static final String TAG = "CameraFinder";
    private DatagramSocket mSocket;
    private DatagramPacket mPacket;
    private Context mContext;
    private boolean mIsSearching = false;
    private OnCameraFinderListener mListener;
    private List<CameraDevice> mCameraList;

    public CameraFinder(Context context) {
        mContext = context;
        mCameraList = new ArrayList<CameraDevice>();
        new Thread(mSearchingRunnable).start();
    }

    public List<CameraDevice> getCameraList() {
        return mCameraList;
    }

    public void setOnCameraFinderListener(OnCameraFinderListener onCameraFinderListener) {
        mListener = onCameraFinderListener;
    }


    private Runnable mSearchingRunnable = new Runnable() {
        @Override
        public void run() {
            initSocket();
            sendProbe();
            mIsSearching = true;
            byte[] Buff = new byte[4096];
            DatagramPacket packet = new DatagramPacket(Buff,
                    Buff.length);
            while (mIsSearching) {
                try {
                    mSocket.receive(packet);
                    if (packet.getLength() > 0) {
                        String strPacket = new String(packet.getData(), 0,
                                packet.getLength());
                        Log.v("ws-discovery", " receive packets:" + strPacket );
                        processReceivedPacket(strPacket);
                    }
                } catch (InterruptedIOException e) {
                    Log.d(TAG, "receive timeout!!");
                } catch (IOException e) {
                    e.printStackTrace();
                    break;
                }
            }
            mSocket.close();

        }
    };


    private String getMid(String src, String head, String foot) {
        int headIndex = src.indexOf(head);
        if (headIndex == -1) {
            return null;
        }
        String tmp = src.substring(headIndex + head.length());
        int footIndex = tmp.indexOf(foot);
        if (footIndex == -1) {
            return null;
        }
        return tmp.substring(0, footIndex);
    }

    private void processReceivedPacket(String packet) {
        try {
            String uuid = getMid(packet, "Address>", "<").split(":")[2];
            String url = getMid(packet, "XAddrs>", "<").split(" ")[0];
            if (uuid != null && url != null) {
                UUID myUUID = UUID.fromString(uuid);
                if (!isUuidExistInCameraList(myUUID)) {
                    CameraDevice cd = new CameraDevice(
                            UUID.fromString(uuid), url);
                    cd.setOnline(true);
                    mCameraList.add(cd);
                    if (mListener != null) {
                        mListener.OnCameraListUpdated();
                    }
                }
            }
        } catch (Exception e) {
        }

    }

    private boolean isUuidExistInCameraList(UUID uuid) {
        boolean result = false;
        for (CameraDevice device : mCameraList) {
            if (device.uuid.equals(uuid)) {
                result = true;
            }
        }
        return result;
    }

    public String getLocalIpAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface
                    .getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf
                        .getInetAddresses(); enumIpAddr.hasMoreElements();) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress()) {
                        return inetAddress.getHostAddress().toString();
                    }
                }
            }
        } catch (SocketException ex) {
        }
        return null;
    }

    public static String getBroadcast() throws SocketException {
        System.setProperty("java.net.preferIPv4Stack", "true");
        for (Enumeration<NetworkInterface> niEnum = NetworkInterface
                .getNetworkInterfaces(); niEnum.hasMoreElements();) {
            NetworkInterface ni = niEnum.nextElement();
            if (!ni.isLoopback()) {
                for (InterfaceAddress interfaceAddress : ni
                        .getInterfaceAddresses()) {
                    if (interfaceAddress.getBroadcast() != null) {
                        return interfaceAddress.getBroadcast().toString()
                                .substring(1);
                    }
                }
            }
        }
        return null;
    }

    private void initSocket() {
        try {
            mSocket = new DatagramSocket();
            mSocket.setBroadcast(true);
            mSocket.setSoTimeout(10000);
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void sendProbe() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                mCameraList.clear();
                if (mListener != null) {
                    mListener.OnCameraListUpdated();
                }
                byte[] buf = DISCOVERY_PROBE_TDS.getBytes();
                try {
                    String strBroadcast = getBroadcast();
                    if (strBroadcast == null) {
                        t
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值