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脚本将Bing的每日图片作为桌面的教程
May 04 Python
Python计算已经过去多少个周末的方法
Jul 25 Python
Python实现截屏的函数
Jul 26 Python
python selenium UI自动化解决验证码的4种方法
Jan 05 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 Python
pandas DataFrame实现几列数据合并成为新的一列方法
Jun 08 Python
Python实现高斯函数的三维显示方法
Dec 29 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
Feb 08 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
Python scrapy爬取小说代码案例详解
Jul 09 Python
简单且有用的Python数据分析和机器学习代码
Jul 02 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
计算2000年01月01日起到指定日的天数
2006/10/09 PHP
php 生成唯一id的几种解决方法
2013/03/08 PHP
php遍历CSV类实例
2015/04/14 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
php经典趣味算法实例代码
2020/01/21 PHP
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
用console.table()调试javascript
2014/09/04 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
微信小程序使用wxParse解析html的实现示例
2018/08/30 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
[02:44]DOTA2英雄基础教程 钢背兽
2013/12/19 DOTA
Python socket实现的简单通信功能示例
2018/08/21 Python
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
澳洲健康食品网上商店:Aussie Health Products
2018/06/15 全球购物
GWT都有什么特性
2016/12/02 面试题
八年级美术教学反思
2014/02/02 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
党支部活动策划方案
2014/08/18 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
会议室管理制度范本
2015/08/06 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书
前端JavaScript大管家 package.json
2021/11/02 Javascript
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android