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使用xmlrpc实例讲解
Dec 17 Python
用Python进行基础的函数式编程的教程
Mar 31 Python
基于Python实现通过微信搜索功能查看谁把你删除了
Jan 27 Python
Python编程生成随机用户名及密码的方法示例
May 05 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
Jul 11 Python
python绘制多个子图的实例
Jul 07 Python
IronPython连接MySQL的方法步骤
Dec 27 Python
python分别打包出32位和64位应用程序
Feb 18 Python
使用darknet框架的imagenet数据分类预训练操作
Jul 07 Python
python+selenium爬取微博热搜存入Mysql的实现方法
Jan 27 Python
基于Python实现的购物商城管理系统
Apr 27 Python
Python中三种花式打印的示例详解
Mar 19 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
关于时间计算的结总
2006/12/06 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
PHP7 windows支持
2021/03/09 PHP
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
javascript实现一个简单的弹出窗
2016/02/22 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
URL中“#” “?” &amp;“”号的作用浅析
2017/02/04 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
jQuery实现王者荣耀手风琴效果
2020/01/17 jQuery
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
Python 调用DLL操作抄表机
2009/01/12 Python
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
Python Selenium实现无可视化界面过程解析
2020/08/25 Python
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
汽车检测与维修专业求职信
2013/10/30 职场文书
银行见习期自我鉴定
2014/01/29 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
企业安全生产责任书范本
2014/07/28 职场文书
2015年学生会工作总结范文
2015/03/31 职场文书
Win Server2016远程桌面如何允许多用户同时登录
2022/06/10 Servers