概述
本文主要通过对海康摄像头进行抓包,模拟发送了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实现组播数据的发送和接收所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复