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

 更新时间:2020年05月05日 20:14:33   作者:牛帅兵  
这篇文章主要介绍了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可以发送但不能接收消息的解决方法

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

相关文章

  • 基于Python实现图片浏览器的应用程序

    基于Python实现图片浏览器的应用程序

    图像浏览器应用程序是一种非常常见和实用的工具,这篇文章就来为大家介绍一下如何使用Python编程语言和wxPython库创建一个简单的图像浏览器应用程序,感兴趣的可以了解下
    2023-10-10
  • Python装饰器的执行过程实例分析

    Python装饰器的执行过程实例分析

    这篇文章主要介绍了Python装饰器的执行过程,结合实例形式分析了Python装饰器的原理、执行过程及相关操作注意事项,需要的朋友可以参考下
    2018-06-06
  • python-for x in range的用法(注意要点、细节)

    python-for x in range的用法(注意要点、细节)

    这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Python+PyQt5+MySQL实现天气管理系统

    Python+PyQt5+MySQL实现天气管理系统

    这篇文章主要为大家详细介绍了Python+PyQt5+MySQL实现天气管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • Python读取HTML中的canvas并且以图片形式存入Word文档

    Python读取HTML中的canvas并且以图片形式存入Word文档

    这篇文章主要介绍了Python读取HTML中的canvas并且以图片形式存入Word文档,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • python selenium参数详解和实现案例

    python selenium参数详解和实现案例

    这篇文章主要介绍了python selenium参数详解和实现案例,无头模式添加,可以让selenium模拟登录,进入到后台运行,本文以登录打开公司内网下载数据为例,给大家详细讲解,需要的朋友可以参考下
    2022-10-10
  • python 的赋值语句和基本输入输出详解

    python 的赋值语句和基本输入输出详解

    这篇文章主要为大家介绍了python 赋值语句和基本输入输出,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • Scrapy基于Python构建强大网络爬虫框架实例探究

    Scrapy基于Python构建强大网络爬虫框架实例探究

    这篇文章主要为大家介绍了Scrapy基于Python构建强大网络爬虫框架实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python格式化字符串f-string概览(小结)

    Python格式化字符串f-string概览(小结)

    这篇文章主要介绍了Python格式化字符串f-string概览(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Python详解复杂CSV文件处理方法

    Python详解复杂CSV文件处理方法

    这篇文章主要介绍了Python数据读写之Python读写CSV文件,CSV即逗号分隔值,一种以逗号分隔按行存储的文本文件,所有的值都表现为字符串类型,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-07-07

最新评论