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批量生成本地ip地址的方法
Mar 23 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
May 30 Python
python 在指定范围内随机生成不重复的n个数实例
Jan 28 Python
Python SELENIUM上传文件或图片实现过程
Oct 28 Python
pycharm不能运行.py文件的解决方法
Feb 12 Python
pyqt5中动画的使用详解
Apr 01 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
Apr 27 Python
Python多线程thread及模块使用实例
Apr 28 Python
一篇文章搞懂python的转义字符及用法
Sep 03 Python
pycharm 的Structure界面设置操作
Feb 05 Python
Python3 使用pip安装git并获取Yahoo金融数据的操作
Apr 08 Python
Python实现批量自动整理文件
Mar 16 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获取一个变量的名字的方法
2014/09/05 PHP
php经典趣味算法实例代码
2020/01/21 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
浅谈AngularJS中$http服务的简单用法
2018/05/15 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
解决vue项目获取dom元素宽高总是不准确问题
2020/07/29 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
Python中生成器和yield语句的用法详解
2015/04/17 Python
python访问系统环境变量的方法
2015/04/29 Python
Python入门教程之运算符与控制流
2016/08/17 Python
Python实现excel转sqlite的方法
2017/07/17 Python
深入理解Django-Signals信号量
2019/02/19 Python
wxPython实现绘图小例子
2019/11/19 Python
新年福利来一波之Python轻松集齐五福(demo)
2020/01/20 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
决定成败的关键——创业计划书
2014/01/24 职场文书
甜点店创业计划书
2014/01/27 职场文书
俄语专业毕业生求职信
2014/07/12 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
Django中session进行权限管理的使用
2021/07/09 Python
部分武汉产收音机展览
2022/04/07 无线电