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标准库之随机数 (math包、random包)介绍
Nov 25 Python
python实现红包裂变算法
Feb 16 Python
python 文件操作api(文件操作函数)
Aug 28 Python
Python设计模式之中介模式简单示例
Jan 09 Python
Pycharm设置界面全黑的方法
May 23 Python
python和shell监控linux服务器的详细代码
Jun 22 Python
pygame游戏之旅 添加键盘按键的方法
Nov 20 Python
python调用虹软2.0第三版的具体使用
Feb 22 Python
Python split() 函数拆分字符串将字符串转化为列的方法
Jul 16 Python
Pandas分组与排序的实现
Jul 23 Python
python判断链表是否有环的实例代码
Jan 31 Python
python Matplotlib数据可视化(1):简单入门
Sep 30 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
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
2016/04/26 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
限制复选框的最大可选数
2006/07/01 Javascript
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
javascript:以前写的xmlhttp池,代码
2008/05/18 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
vue写一个组件
2018/04/09 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
2018/06/24 Javascript
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
Python数据类型详解(二)列表
2016/05/08 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
Python几种常见算法汇总
2020/06/02 Python
Python Opencv图像处理基本操作代码详解
2020/08/31 Python
Python 实现PS滤镜中的径向模糊特效
2020/12/03 Python
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
施华洛世奇波兰官网:SWAROVSKI波兰
2019/06/18 全球购物
前台接待的工作职责
2013/11/21 职场文书
优秀企业获奖感言
2014/02/01 职场文书
婚礼主持结束词
2014/03/13 职场文书
煤矿班组长竞聘书
2014/03/31 职场文书
教师个人总结范文
2015/02/11 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
大学副班长竞选稿
2015/11/21 职场文书
CSS极坐标的实例代码
2021/06/03 HTML / CSS
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle