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


Posted in Python onMay 05, 2020

本文主要通过对海康摄像头进行抓包,模拟发送了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可以发送但不能接收消息的解决方法

现在有两个系统,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防火墙关闭后发现是可以正常接收的,但是想在不关闭防火墙的情况下仍然能够接收,百度也没有找到想要的答案。。

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

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

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

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

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

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

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

Python 相关文章推荐
剖析Python的Tornado框架中session支持的实现代码
Aug 21 Python
python学习之编写查询ip程序
Feb 27 Python
python文件的md5加密方法
Apr 06 Python
Python做文本按行去重的实现方法
Oct 19 Python
Python 登录网站详解及实例
Apr 11 Python
tensorflow 中对数组元素的操作方法
Jul 27 Python
Python rstrip()方法实例详解
Nov 11 Python
numpy创建单位矩阵和对角矩阵的实例
Nov 29 Python
python 实现turtle画图并导出图片格式的文件
Dec 07 Python
python中with用法讲解
Feb 07 Python
python 获取当前目录下的文件目录和文件名实例代码详解
Mar 10 Python
读取nii或nii.gz文件中的信息即输出图像操作
Jul 01 Python
解决python使用list()时总是报错的问题
May 05 #Python
python requests.get带header
May 05 #Python
python中urllib.request和requests的使用及区别详解
May 05 #Python
python requests包的request()函数中的参数-params和data的区别介绍
May 05 #Python
关于Python解包知识点总结
May 05 #Python
python 使用事件对象asyncio.Event来同步协程的操作
May 04 #Python
在python里使用await关键字来等另外一个协程的实例
May 04 #Python
You might like
php中的观察者模式
2010/03/24 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
JavaScript中的关键字&quot;VAR&quot;使用详解 分享
2013/07/31 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
Bootstrap Table使用心得总结
2016/11/29 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
Three.js中矩阵和向量的使用教程
2019/03/19 Javascript
JS数组Reduce方法功能与用法实例详解
2020/04/29 Javascript
Vue发布订阅模式实现过程图解
2020/04/30 Javascript
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
PIL对上传到Django的图片进行处理并保存的实例
2019/08/07 Python
详解Python self 参数
2019/08/30 Python
django admin 添加自定义链接方式
2020/03/11 Python
Python常用编译器原理及特点解析
2020/03/23 Python
5 分钟读懂Python 中的 Hook 钩子函数
2020/12/09 Python
python中pyqtgraph知识点总结
2021/01/26 Python
html5 div布局与table布局详解
2016/11/16 HTML / CSS
美国体育用品商店:Paragon Sports
2017/10/08 全球购物
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
机电专业个人自荐信格式模板
2013/09/23 职场文书
毕业生自荐信格式
2014/03/07 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
世博会口号
2014/06/20 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
大学学雷锋活动总结
2014/06/26 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python