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函数编程的一些特性
Apr 13 Python
使用Python读写及压缩和解压缩文件的示例
Jul 08 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
Oct 11 Python
Python实现遍历目录的方法【测试可用】
Mar 22 Python
python安装教程
Feb 28 Python
PyQt4实现下拉菜单可供选择并打印出来
Apr 20 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
Apr 26 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 Python
Python使用dict.fromkeys()快速生成一个字典示例
Apr 24 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
Tensorflow 多线程设置方式
Feb 06 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
Apr 23 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代码把全角数字转为半角数字
2007/12/10 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
javascript引导程序
2008/10/26 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
微信JS接口大全
2016/08/25 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
2019/02/26 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
python3使用smtplib实现发送邮件功能
2018/05/22 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
Html5之title吸顶功能
2018/06/04 HTML / CSS
捷克体育用品购物网站:D-sport
2017/12/28 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
什么是规则表达式
2012/05/03 面试题
职称自我鉴定
2013/10/15 职场文书
大学生旷课检讨书
2014/01/22 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
慈善晚会策划方案
2014/05/14 职场文书
我爱我校演讲稿
2014/05/21 职场文书
员工生日活动方案
2014/08/24 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
2015年大学辅导员工作总结
2015/05/12 职场文书
独生子女证明范本
2015/06/19 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python
oracle delete误删除表数据后如何恢复
2022/06/28 Oracle