Python 实现 SSDP 扫描:高级程序员指南
首先,我们需要了解什么是 SSDP(Simple Service Discovery Protocol)。SSDP 是一种基于 UPnP(Universal Plug and Play)协议的网络协议,用于设备之间的自动发现和通信。它允许设备在网络中广播自己的存在,并提供自己的服务和设备类型。其他设备可以通过监听 SSDP 广播来自动发现新设备并与之通信。
接下来,我们将讲解如何使用 Python 编写一个 SSDP 扫描工具。
首先,我们需要导入 socket 和 struct 模块,这些模块将帮助我们发送和接收 UDP 数据包。
import socket
import struct
然后,我们需要定义一些常量和变量。常量包括 SSDP 广播地址和端口号,变量包括搜索时间和搜索结果列表。
SSDP_ADDR = '239.255.255.250'
SSDP_PORT = 1900
SEARCH_TIME = 5
devices = []
接下来,我们需要创建一个 UDP 套接字并绑定到本地 IP 地址和端口。我们还需要设置套接字的超时时间,以便在搜索完成后自动关闭套接字。
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('', 0))
sock.settimeout(SEARCH_TIME)
然后,我们需要构造一个 SSDP 搜索请求消息。这个消息包含了搜索的目标(比如 'ssdp:all' 或特定的设备类型),以及一些其他的头部信息。
msg = 'M-SEARCH * HTTP/1.1\r\n'
msg += 'Host: {0}:{1}\r\n'.format(SSDP_ADDR, SSDP_PORT)
msg += 'ST: ssdp:all\r\n'
msg += 'Man: 'ssdp:discover'\r\n'
msg += 'MX: 1\r\n'
msg += '\r\n'
接下来,我们需要发送这个消息到 SSDP 广播地址和端口,并等待设备的响应。我们使用 while 循环来不断接收 UDP 数据包,直到超时或没有更多的数据包为止。
sock.sendto(msg.encode(), (SSDP_ADDR, SSDP_PORT))
try:
while True:
data, addr = sock.recvfrom(1024)
devices.append(data.decode())
except socket.timeout:
pass
最后,我们可以打印搜索结果列表,或将其保存到文件中。
for device in devices:
print(device)
with open('devices.txt', 'w') as f:
f.write('\n'.join(devices))
完整的 Python 代码如下:
import socket
import struct
SSDP_ADDR = '239.255.255.250'
SSDP_PORT = 1900
SEARCH_TIME = 5
devices = []
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('', 0))
sock.settimeout(SEARCH_TIME)
msg = 'M-SEARCH * HTTP/1.1\r\n'
msg += 'Host: {0}:{1}\r\n'.format(SSDP_ADDR, SSDP_PORT)
msg += 'ST: ssdp:all\r\n'
msg += 'Man: 'ssdp:discover'\r\n'
msg += 'MX: 1\r\n'
msg += '\r\n'
sock.sendto(msg.encode(), (SSDP_ADDR, SSDP_PORT))
try:
while True:
data, addr = sock.recvfrom(1024)
devices.append(data.decode())
except socket.timeout:
pass
for device in devices:
print(device)
with open('devices.txt', 'w') as f:
f.write('\n'.join(devices))
这个脚本将搜索网络中所有支持 SSDP 协议的设备,并将它们的响应信息打印出来或保存到文件中。你可以根据需要修改搜索目标、搜索时间、输出格式等参数。
原文地址: http://www.cveoy.top/t/topic/lZJL 著作权归作者所有。请勿转载和采集!