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编写脚本获取手机当前应用apk的信息
Jul 21 Python
跟老齐学Python之集成开发环境(IDE)
Sep 12 Python
零基础写python爬虫之神器正则表达式
Nov 06 Python
Python获取运行目录与当前脚本目录的方法
Jun 01 Python
Python批量更改文件名的实现方法
Oct 29 Python
Python实现自动发送邮件功能
Mar 02 Python
Python实现替换文件中指定内容的方法
Mar 19 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
Jun 07 Python
Python实战购物车项目的实现参考
Feb 20 Python
python下载微信公众号相关文章
Feb 26 Python
Python Django Vue 项目创建过程详解
Jul 29 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 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删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
JS FormData上传文件的设置方法
2017/07/05 Javascript
vue.js2.0 实现better-scroll的滚动效果实例详解
2018/08/13 Javascript
ES10的13个新特性示例(小结)
2019/09/23 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
在Django中输出matplotlib生成的图片方法
2018/05/24 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
ActiveMQ:使用Python访问ActiveMQ的方法
2019/01/30 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
英语感恩演讲稿
2014/01/14 职场文书
学校通报表扬范文
2015/05/04 职场文书
地道战观后感
2015/06/04 职场文书
汶川大地震感悟
2015/08/10 职场文书
我的中国梦主题班会
2015/08/14 职场文书
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
Python爬虫中urllib3与urllib的区别是什么
2021/07/21 Python