python3通过udp实现组播数据的发送和接收操作
作者:牛帅兵 发布时间:2023-01-14 02:27:42
本文主要通过对海康摄像头进行抓包,模拟发送了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可以发送但不能接收消息的解决方法
现在有两个系统,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防火墙关闭后发现是可以正常接收的,但是想在不关闭防火墙的情况下仍然能够接收,百度也没有找到想要的答案。。
正当要放弃的时候看到如下设置:
于是勾选上了红色箭头所指的复选框。
再次运行程序,win10弹出对话框如下:
点击允许访问后,在xp网络调试助手上发送消息就可以在python3上正常接收了!!!
来源:https://blog.csdn.net/qq_36574108/article/details/90645156


猜你喜欢
- 网上存在这么一个例子 obj = pd.Series([7,-5,7,4,2,0,4])obj.rank()输出为:0 6.51
- 1.文件的读取操作文件的第一步就是得打开要操作的文件,然后进行读取文件,最后关闭文件。在python中我们可以使用open函数来打开一个文件
- 1. 引言在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工;这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取;单个
- PDOStatement::executePDOStatement::execute — 执行一条预处理语句(PHP 5 >= 5.1
- 为了UED前端团队更好的协作开发同时提高项目编码质量,我们需要将Web前端使用工程化方式构建;目前需要一些简单的功能:  
- 它在Lynx里也会运行得很好:<%@ Language=VBScript %><HTML><
- 生成6位随机验证码的3种实现方式如下:1. 简单粗暴型:所有数字和字母都放入字符串;2. 利用ascii编码的规律,遍历获取字符串和数字的字
- 前置条件确保mysql的版本是5.7+一、新建mysql表增加json字段二、pojo类package com.cxstar.domain;
- 1983年1月19日,苹果公司发布乔布斯领导研制的新一代电脑Lisa,当时Lisa电脑的设计人员就认为,必须将立即执行的命令和需要用户附加输
- 如下所示:# -*- coding:utf-8 -*-import xlrdimport sysimport reimport jsondi
- server application error--IIS故障故障现象:Server Application Error The serve
- HMAC 算法可用于验证在应用程序之间传递或存储在潜在易受攻击位置的信息的完整性。基本思想是生成与共享密钥组合的实际数据的加密散列。然后,可
- sae中安装有python环境,想让sae导入自己下载的django或者其他模块,可以在svn中新建一个文件目录,比如site-packag
- 上周接到个需求,需求是这样的:用户扫一扫二维码会产生一个链接,该链接会向后端发送个请求,返回一个 apk 的下载地址,用户点击下载按钮可以下
- 在学MVC过程中,我们一般都是利用layui插件里的layui数据表格加载数据库中的数据,而layui表格里有许多的事件监听,比如监听行的单
- 本文实例为大家分享了python实现转盘效果的具体代码,供大家参考,具体内容如下#抽奖 面向对象版本import tkinterimport
- 本文实例为大家分享了python实现网络五子棋的具体代码,供大家参考,具体内容如下服务器端:import osimport socketim
- 在浏览器 IE6 、IE7、Firefox2+、Firefpx3+、Opera9.6+、Safari3.1+中测试以下代码:<!DOC
- 我自己的一个项目,需要同时对65536个文件进行多次写操作。如果先全部打开所有的文件,然后重复写,最后关闭所有的文件。那么第一次写操作全部完
- 1.首先肯定是要安装Node.JSwindows cmd依次输入如下命令:cd C:\Program Files\nodejs\npm in