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 相关文章推荐
用C++封装MySQL的API的教程
May 06 Python
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
python web框架学习笔记
May 03 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
Oct 20 Python
Python collections中的双向队列deque简单介绍详解
Nov 04 Python
Python如何实现强制数据类型转换
Nov 22 Python
Python中如何将一个类方法变为多个方法
Dec 30 Python
Python 解码Base64 得到码流格式文本实例
Jan 09 Python
python十进制转二进制的详解
Feb 07 Python
python正则过滤字母、中文、数字及特殊字符方法详解
Feb 11 Python
Selenium 滚动页面至元素可见的方法
Mar 18 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 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中防止SQL注入实现代码
2011/02/19 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
php返回当前日期或者指定日期是周几
2015/05/21 PHP
php面向对象值单例模式
2016/05/03 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
2017/10/19 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
javascript两段代码,两个小技巧
2010/02/04 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
JavaScript SetInterval与setTimeout使用方法详解
2013/11/15 Javascript
原生js实现图片层叠轮播切换效果
2016/02/02 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
vue如何判断dom的class
2018/04/26 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
原生js实现文件上传、下载、封装等实例方法
2020/01/05 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
2014/01/19 Python
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
Python时间的精准正则匹配方法分析
2017/08/17 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
2020/05/11 Python
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
护士专业推荐信
2013/11/02 职场文书
集体生日活动方案
2014/08/18 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
解决vue $http的get和post请求跨域问题
2021/06/07 Vue.js
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫