Python3实现海康威视摄像头UDP组播发现与通信详解

小林子
小林子
发布时间:2026-10-14| 3人浏览过
原创

本文介绍利用Python3通过UDP协议实现海康威视摄像头的组播数据发送与接收。通过Wiresh抓包分析,模拟客户端发送XML探测包以获取设备IPv4和MAC地址。文章提供了完整的Python代码示例,并解决了Windows 10环境下Python接收UDP消息被防火墙拦截的问题,指导用户通过系统设置允许访问,实现稳定的设备发现与状态监控。

Python3实现海康威视摄像头UDP组播发现与通信详解

本文主要介绍如何通过抓包分析海康威视摄像头的通信协议,模拟发送UDP数据包,并抓取摄像头返回的数据包,解析并提取其中的关键信息。

通过抓包分析发现,海康威视摄像头在发送和接收数据时使用UDP协议。经过对比,使用Python进行模拟相对简单。由于摄像头内部已内置了UDP协议的Server端程序,本文主要使用Python模拟客户端来发送UDP数据包。

客户端代码实现

客户端代码实现


import socket
import re

ANY = "0.0.0.0"
DES_IP = "239.255.255.250"
PORT = 37020
# xml_str = b'<?xml version="1.0" encoding="utf-8"?><Probe><Uuid>B2D5D4D2-808C-40F6-87CD-694C05C2B274</Uuid><Types>inquiry</Types></Probe> '
xml_str = b'<?xml version="1.0" encoding="utf-8"?><Probe><Uuid>CB09F608-E016-4EE8-869A-CA186852F12E</Uuid><Types>inquiry</Types></Probe> '

# 创建UDP socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
# 允许端口复用
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定监听多播数据包的端口
s.bind((ANY, PORT))
# 声明该socket为多播类型
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)
# 加入多播组,组地址由第三个参数制定
s.setsockopt(
  socket.IPPROTO_IP,
  socket.IP_ADD_MEMBERSHIP,
  socket.inet_aton(DES_IP) + socket.inet_aton(ANY)
)
s.setblocking(False)
s.sendto(xml_str, (DES_IP, PORT))
while True:
  try:
    data, address = s.recvfrom(2048)
  except Exception as e:
    # print(e)
    pass
  else:
    print(address)
    # print(data)
    try:
      IPv4 = re.search(re.compile(r"<IPv4Address>(.*?)</IPv4Address>", re.S), str(data))[1]
      MAC = re.search(re.compile(r"<MAC>(.*?)</MAC>", re.S), str(data))[1]
    except TypeError:
      pass
    else:
      # print(data)
      print("IPv4: {}".format(IPv4))
      print("MAC: {}".format(MAC))

代码主要使用了socket模块发送数据,并使用re模块来处理和提取返回数据中的特定信息。

通过使用Wireshark抓包分析发现,客户端首先需要发送一个XML类型的数据。Server端接收到数据后,会返回摄像头的各种信息,包括本文中将要获取的摄像头IPv4地址和MAC地址。

程序运行结果如图所示:

总结与扩展

总结与扩展

本程序不仅可以作为设备发现工具使用,在更换设备时也能第一时间发现设备是否被更换,从而确保系统安全。

补充知识:Python3 UDP可以发送但不能接收消息的解决方法

补充知识:Python3 UDP可以发送但不能接收消息的解决方法

测试环境涉及两个系统:Windows 10和虚拟机中的XP系统。其中,Win10中运行Python3,XP中运行网络调试助手。

Python3通过UDP方式发送的消息可以在网络调试助手中接收,但是在网络调试助手上发送的消息在Python3上却接收不到。首先Python3接收写的代码如下:


import socket

def receive_message():
  udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #创建一个套接字
  udp_socket.bind(('', 63630)) #绑定本地信息,自己电脑的ip和程序的端口。ip一般不用写,表示本机的任意一个ip,端口大于常用的1023就可以
  while True:
    udp_data = udp_socket.recvfrom(1024) #接收数据,1024表示本次接收的最大字节数
    if udp_data[0].decode(encoding='gbk') != 'end':
      print('{}:{}'.format(str(udp_data[1]), udp_data[0].decode(encoding='gbk')))
    else:
      break
  udp_socket.close() #关闭套接字

if __name__ == '__main__':
  receive_message()

本以为是程序的问题或者是网络调试助手的问题,但是检查多遍后再次尝试仍然无法接收。暂时放下该问题。

今天把Win10防火墙关闭后发现是可以正常接收的,但是想在不关闭防火墙的情况下仍然能够接收,百度也没有找到想要的答案。

正当要放弃的时候看到如下设置:

于是勾选上了红色箭头所指的复选框。

再次运行程序,Win10弹出对话框如下:

点击允许访问后,在XP网络调试助手上发送消息就可以在Python3上正常接收了。

以上这篇Python3通过UDP实现组播数据的发送和接收操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。