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 ZipFile模块详解
Nov 01 Python
Python开发常用的一些开源Package分享
Feb 14 Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 Python
Python实现矩阵转置的方法分析
Nov 24 Python
python的numpy模块安装不成功简单解决方法总结
Dec 23 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
python中pip的安装与使用教程
Aug 10 Python
Django csrf 两种方法设置form的实例
Feb 03 Python
Python实现截取PDF文件中的几页代码实例
Mar 11 Python
Python中的几种矩阵乘法(小结)
Jul 10 Python
在python中用url_for构造URL的方法
Jul 25 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 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
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
2019/01/10 PHP
使用JavaScript switch case 另类写法
2010/03/14 Javascript
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
python实用代码片段收集贴
2015/06/03 Python
用Python写冒泡排序代码
2016/04/12 Python
通过Python爬虫代理IP快速增加博客阅读量
2016/12/14 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
Python数据结构与算法(几种排序)小结
2019/06/22 Python
Python 面向对象之封装、继承、多态操作实例分析
2019/11/21 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
Python实现弹球小游戏
2020/08/01 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
《商鞅南门立木》教学反思
2014/02/16 职场文书
六查六看自查材料
2014/02/17 职场文书
岗位职责风险点
2014/03/12 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
《谁的本领大》教后反思
2014/04/25 职场文书
爱国主义影片观后感
2015/06/18 职场文书
导游词之张家界
2019/10/31 职场文书