专业的JAVA编程教程与资源

网站首页 > java教程 正文

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

temp10 2024-12-26 16:49:18 java教程 12 ℃ 0 评论

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

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

java下通过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中执行结果为


本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表