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深入学习之内存管理
Aug 31 Python
Python中字典映射类型的学习教程
Aug 20 Python
Python中的字典与成员运算符初步探究
Oct 13 Python
Python将多个excel文件合并为一个文件
Jan 03 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
Jan 08 Python
Python3 实现随机生成一组不重复数并按行写入文件
Apr 09 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
jupyternotebook 撤销删除的操作方式
Apr 17 Python
python中常见错误及解决方法
Jun 21 Python
浅谈python 类方法/静态方法
Sep 18 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
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
微信小程序 label 组件详解及简单实例
2017/01/10 Javascript
Vue.js实现一个todo-list的上移下移删除功能
2017/06/26 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
[04:59]DOTA2-DPC中国联赛 正赛 Ehome vs iG 选手采访
2021/03/11 DOTA
Python简单读取json文件功能示例
2017/11/30 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
python如何让类支持比较运算
2018/03/20 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
下载官网python并安装的步骤详解
2019/10/12 Python
新西兰最大的在线设计师眼镜店:SmartBuyGlasses新西兰
2017/10/20 全球购物
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
业务经理的岗位职责
2013/11/16 职场文书
先进个人获奖感言
2014/01/24 职场文书
写好自荐信需做到的5要点
2014/03/07 职场文书
现金出纳岗位职责
2014/03/15 职场文书
责任胜于能力演讲稿
2014/05/20 职场文书
商务日语专业的自荐信
2014/05/23 职场文书
物流管理系毕业生求职信
2014/06/03 职场文书
演讲比赛的活动方案
2014/08/28 职场文书
党的群众路线领导班子整改方案
2014/09/27 职场文书
秋菊打官司观后感
2015/06/03 职场文书
董事长致辞
2015/07/29 职场文书
党员心得体会范文2016
2016/01/23 职场文书
深度学习详解之初试机器学习
2021/04/14 Python
基于Redis位图实现用户签到功能
2021/05/08 Redis