JAVA版_SSDP设备发现应用

本文介绍了简单服务发现协议(SSDP)的基本原理及其实现过程。SSDP是构成UPnP技术的核心协议之一,通过客户端发送特定消息来发现网络中的设备。文章详细解释了客户端如何通过多播方式发送发现请求,并演示了服务器端如何解析并响应这些请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     SSDP-简单服务发现协议(SSDP,Simple Service Discovery Protocol)是一种应用层协议,是构成通用即插即用(UPnP)技术的核心协议之一。简单服务发现协议是在HTTPU和HTTPMU的基础上实现的协议。

    按照协议的规定,当一个控制点(客户端)接入网络的时候,它可以向一个特定的多播地址的SSDP端口使用M-SEARCH方法发送“ssdp:discover”消息。本例中客户端接入网络发送的消息如下:

M-SEARCH * HTTP/1.1
MX:3
MAN:"ssdp:discover"
ST:gyfk:fkdevice
HOST:239.255.255.250:1900
Content-Length:0

含义: 

M-SEARCH * HTTP/1.1  M-SEARCH 

ST  gyfk:fkdevice 仅搜索网络中的网元设备. 

MX  设臵设备响应最长等待时间,这里为10. 

MAN  设臵协议查询的类型,必须是"ssdp:discover” 

HOST  设臵为协议保留多播地址和端口,必须是239.255.255.250:1900 


  当设备监听到这个保留的多播地址上由控制点发送的消息的时候,设备会分析控制点请求的服务,如果自身提供了控制点请求的服务,设备将通过单播的方式直接响应控制点的请求。本例中服务器端接收的主要处理代码:

protected void SendAliveMessage() {
        SSDPAliveMsg aliveProduct = new SSDPAliveMsg(ipAndPort);//发送消息对象
        SSDPSocket socket_rev = null;
        SSDPSocket socket_send = null;
        try {
            socket_rev = new SSDPSocket(SSDP.PORT);//1900接收socket
            socket_send = new SSDPSocket();//发消息socket
        } catch (IOException e) {
            e.printStackTrace();
        }
          
        try {
            while (true) {
                DatagramPacket dp_rev = socket_rev.receive();//接收到的数据包
                InetAddress address = dp_rev.getAddress();//客户端IP
                String s = new String(dp_rev.getData(),"utf-8");
                if(s.contains("gyfk:fkdevice")){//匹配的终端设备才响应
                    DeviceSearchFrame.showMsg("发送数据到:"+address);
                    socket_send.send(aliveProduct.toString(), address);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

本例发送消息的内容为:

1
2
3
4
5
6
7
8
9
NOTIFY * HTTP/ 1.1
HOST:  239.255 . 255.250 : 1900
CACHE-CONTROL: max-age= 300
LOCATION: http: //192.168.196.64:8000/gyfk/
NT: gyfk:fkdevice
NTS: ssdp:alive
SERVER: Linux/ 2.6 . 23 .17_stm23_A25C-SDK7105_7105-STSDK, UPnP/ 1.0 , Portable SDK  for  UPnP devices/ 1.6 . 6
X-User-Agent: redsonic
USN: uuid:70a9a997-a9d0-43ed-91dc-492e776a26c0::gyfk:fkdevice

服务端回复消息含义:

HTTP/1.1 200 OK  HTTP版本信息以及响应代码 

CACHE-CONTROL  max-age指定通知消息存活时间,如果超过此时间间隔,控制点可以认

为设备不存在,这里为 300秒 

DATE  服务器的时间信息 

LOCATION  包含根设备描述得 URL地址 

SERVER  包含操作系统名,版本,产品名和产品版本信息 

ST  服务器设备类型为 gyfk:fkdevice 

USN  uuid: 通用唯一识别码 gyfk:fkdevice 设备类型


本例中设备发现的主要含义是终端接入网络后 通过设备发现将location:http://192.168.196.64:8000/gyfk/中的地址发给终端,便于终端后续数据的请求。

demo下载


利用jmdns发现局域网设备,在局域网内,你要通过一台主机和其他主机进行通信,你需要知道对方的ip地址,但是有些时候,你并不知道对方的ip地址,因为一般使用DHCP动态分配ip地址的局域网内,各个主机的IP地址是由DHCP服务器来帮你分配IP地址的。所以在很多情况下,你要知道对方的IP地址是比较麻烦的。 鉴于发现这篇文章最近的浏览量比较多,晚上也有不少转载,特别声明一下,文章水平可能不大够,只是我当时的一些理解,所以希望大家以批判的角度来看,然后又什么问题欢迎讨论。真心不希望误导大家^_^ mDNS就是来解决这个问题的。通过一个约定俗成的端口号,5353。(这个端口号应该是由IETF组织约定的。)每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁,和我的IP地址是多少。然后其他也有该服务的主机就会响应,也会告诉你,它是谁,它的IP地址是多少。当然,具体实现要比这个复杂点。 比如,A主机进入局域网,开启了mDNS服务,并向mDNS服务注册一下信息:我提供FTP服务,我的IP是192.168.1.101,端口是21。当B主机进入局域网,并向B主机的mDNS服务请求,我要找局域网内FTP服务器,B主机的mDNS就会去局域网内向其他的mDNS询问,并且最终告诉你,有一个IP地址为192.168.1.101,端口号是21的主机,也就是A主机提供FTP服务,所以B主机就知道了A主机的IP地址和端口号了。 大概的原理就是这样子,mDNS提供的服务要远远多于这个,当然服务多但并不复杂。 在Apple 的设备上(电脑,笔记本,iphone,ipad等设备)都提供了这个服务。很多Linux设备也提供这个服务。Windows的设备可能没有提供,但是如果安装了iTunes之类的软件的话,也提供了这个服务。 这样就可以利用这个服务开发一些局域网内的自动发现,然后提供一些局域网内交互的应用了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值