python socket发送组播数据_python3通过udp实现组播数据的发送和接收操作

本文介绍如何使用Python3模拟海康摄像头的UDP组播数据发送和接收,解析返回的IPv4和MAC地址。通过设置socket选项加入多播组,利用Wireshark抓包辅助调试。在遇到无法接收UDP消息的问题时,发现关闭防火墙或开启特定防火墙设置可解决问题。
摘要由CSDN通过智能技术生成

本文主要通过对海康摄像头进行抓包,模拟发送了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"?>B2D5D4D2-808C-40F6-87CD-694C05C2B274inquiry '

xml_str = b'<?xml version="1.0" encoding="utf-8"?>CB09F608-E016-4EE8-869A-CA186852F12Einquiry '

# 创建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"(.*?)", re.S), str(data))[1]

MAC = re.search(re.compile(r"(.*?)", 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可以发送但不能接收消息的解决方法

现在有两个系统,win10和虚拟机中的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实现组播数据的发送和接收操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

本文标题: python3通过udp实现组播数据的发送和接收操作

本文地址: http://www.cppcns.com/jiaoben/python/311861.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值