龙空技术网

java下通过SSDP协议实现扫描海康相机

sinosun 84

前言:

当前兄弟们对“java 海康威视”大概比较看重,咱们都想要知道一些“java 海康威视”的相关文章。那么小编也在网摘上搜集了一些对于“java 海康威视””的相关文章,希望你们能喜欢,同学们一起来学习一下吧!

SADP工具很容易扫描到海康的IP相机,如下图所示

那么Java该怎么实现了,用wireshark抓包,发现是SSDP协议

1. 引言

在现代网络中,设备之间的自动发现和通信是至关重要的。SSDP(Simple Service Discovery Protocol)是一种用于在本地网络中发现和公布设备及服务的协议。本文将详细介绍SSDP的概念、工作原理、协议解析以及其在客户端和服务端的伪代码实现。同时,还将讨论相关的计算机网络概念,如组播和单播。

2. SSDP介绍、应用与优缺点及单播组播概念

2.1 SSDP概念

SSDP是UPnP(Universal Plug and Play)协议栈的一部分,旨在使网络设备和服务能够自动发现和互操作。它利用HTTPU(HTTP over UDP)进行通信,允许设备在本地网络中相互发现并交换信息。

2.2 SSDP的应用

智能家居设备:如智能电视、灯光控制、安防系统等。

网络打印机:自动发现并连接到网络打印机。

媒体服务器:发现和连接到家庭媒体服务器进行内容流传输。

2.3 SSDP的优缺点

优点

自动化:设备可以自动发现和配置,无需人工干预。

简单性:协议简单,易于实现和使用。

缺点

安全性:由于使用UDP广播,可能会导致未经授权的设备发现和连接。

网络负载:大量设备同时发送SSDP消息可能会增加网络负载。

2.4 单播和组播概念

单播

单播(Unicast)是一种一对一的通信方式,数据包从单个发送者传输到单个接收者。单播是最常见的网络通信方式,用于大多数的互联网应用,如网页浏览、电子邮件等。

单播的优点

简单性:实现和管理相对简单,网络设备普遍支持。

可靠性:点对点传输,易于控制和监视。

单播的缺点

效率低:在需要同时传输给多个接收者时,效率较低,因为每个接收者都需要单独传输。

组播

组播(Multicast)是一种网络通信方式,允许信息被同时发送到一组指定的接收者,而不是单个接收者或广播给所有接收者。组播在IP网络中通过组播地址进行标识,典型应用包括视频会议、网络电视和在线游戏。

组播的优点

高效性:数据包只在需要的网络路径上传输,节省带宽。

可扩展性:适用于大规模的多点传输,如视频流。

组播的缺点

复杂性:组播路由的实现和管理较为复杂。

设备支持:需要网络设备支持组播协议,如IGMP(Internet Group Management Protocol)。

那么我们可以通过UDP发送组播消息即可

package org.example;import java.net.*;import java.util.UUID;//TIP 要<b>运行</b>代码,请按 <shortcut actionId="Run"/> 或// 点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。public class Main{    public static void main(String[] args) throws Exception    {        String host = "239.255.255.250";//广播地址        int port = 37020;//广播的目的端口        String uuid = UUID.randomUUID().toString().replace("-", "");        String uUIdMessage= String.format("<?xml version=\"1.0\" encoding=\"utf-8\"?><Probe><Uuid>%s</Uuid><Types>inquiry</Types></Probe>", uuid);//        String message = "M-SEARCH * HTTP/1.1\n" +//                "HOST: 239.255.255.250:1900\n" +//                "MAN: \"ssdp:discover\"\n" +//                "MX: 1\n" +//                "ST: urn:dial-multiscreen-org:service:dial:1\n" +//                "USER-AGENT: Microsoft Edge/128.0.2739.42 Windows\n";//用于发送的字符串        try{            InetAddress adds = InetAddress.getByName(host);            DatagramSocket socket = new DatagramSocket();            DatagramPacket dp = new DatagramPacket(uUIdMessage.getBytes(), uUIdMessage.length(), adds, port);            socket.send(dp);//            DatagramPacket dp = new DatagramPacket(message.getBytes(), message.length(), adds, port);//            socket.send(dp);//            ds.close();            // 1.创建一个接受端对象,注册端口            MulticastSocket multicastSocket = new MulticastSocket(37020);            multicastSocket.joinGroup(new InetSocketAddress(InetAddress.getByName(host),37020), NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));            while (true)            {                //把当前接收端加入到一个组播中,绑定对应的组播消息IP//        socket.joinGroup(InetAddress.getByName("224.0.1.1"));                //新绑定方法                // 2.创建一个数据包对象,封装接受的数据                byte[] buffer=new byte[1024*64];                DatagramPacket packet=new DatagramPacket(buffer,buffer.length);                //3.等待接收消息                socket.receive(packet);                //4.打印接收的内容                int len=packet.getLength();                String rs=new String(buffer,0,len);                System.out.println("收到了IP为:"+packet.getAddress()+"\n端口为:"+packet.getPort()+" 的消息");                System.out.println("消息内容:"+rs);            }        }        catch (Exception e) {            e.printStackTrace();        }        // 确定要监听的广播组和端口    }}

wireshark已经获取到了海康相机返回的包

idea中执行结果为

标签: #java 海康威视