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删除指定目录下过期文件的2个脚本分享
Apr 10 Python
Python实现从URL地址提取文件名的方法
May 15 Python
python 网络编程常用代码段
Aug 28 Python
Python通过调用mysql存储过程实现更新数据功能示例
Apr 03 Python
python3实现点餐系统
Jan 24 Python
Python3实现的简单工资管理系统示例
Mar 12 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 Python
用pycharm开发django项目示例代码
Jun 13 Python
python命名空间(namespace)简单介绍
Aug 10 Python
Python 找出出现次数超过数组长度一半的元素实例
May 11 Python
Python Django form 组件动态从数据库取choices数据实例
May 19 Python
Python实现老照片修复之上色小技巧
Oct 16 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数组
2006/10/09 PHP
PHP 选项及相关信息函数库
2006/12/04 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
js实现拖拽功能
2017/03/01 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
vue与django集成打包的实现方法
2019/11/11 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
在Python中使用next()方法操作文件的教程
2015/05/24 Python
bpython 功能强大的Python shell
2016/02/16 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
机械绘图员岗位职责
2013/11/19 职场文书
自我评价个人范文
2013/12/16 职场文书
毕业自我评价
2014/02/05 职场文书
《窗前的气球》教学反思
2014/04/07 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
初二英语教学反思
2016/02/15 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
单身狗福利?Python爬取某婚恋网征婚数据
2021/06/03 Python
python cv2图像质量压缩的算法示例
2021/06/04 Python
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫