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中用于返回绝对值的abs()方法
May 14 Python
Python2中的raw_input() 与 input()
Jun 12 Python
Python实现扩展内置类型的方法分析
Oct 16 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
python:动态路由的Flask程序代码
Nov 22 Python
python小项目之五子棋游戏
Dec 26 Python
Pytorch提取模型特征向量保存至csv的例子
Jan 03 Python
解决django中form表单设置action后无法回到原页面的问题
Mar 13 Python
如何通过命令行进入python
Jul 06 Python
Pytho爬虫中Requests设置请求头Headers的方法
Sep 22 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 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/05/26 PHP
解析argc argv在php中的应用
2013/06/24 PHP
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
php实现文件预览功能
2017/05/23 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
jquery pagination插件实现无刷新分页代码
2009/10/13 Javascript
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
DOM 高级编程
2015/05/06 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
如何在vue里添加好看的lottie动画
2018/08/02 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
[06:07]DOTA2-DPC中国联赛 正赛 Ehome vs VG 选手采访
2021/03/11 DOTA
详解Django中Request对象的相关用法
2015/07/17 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
PyTorch基本数据类型(一)
2019/05/22 Python
python中的itertools的使用详解
2020/01/13 Python
Python如何通过Flask-Mail发送电子邮件
2020/01/29 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
阿玛尼美妆俄罗斯官网:Giorgio Armani Beauty RU
2020/07/19 全球购物
办公室前台岗位职责范本
2013/12/10 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
基层党员对照检查材料
2014/09/24 职场文书
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python