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实现组播数据的发送和接收操作

写在后面

本程序不仅可以作为设备发现来使用,在更换设备时也能第一时间发现设备是否被更换。

补充知识: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上正常接收了!!!

来源:https://blog.csdn.net/qq_36574108/article/details/90645156

标签:python3,udp,数据,发送,接收
0
投稿

猜你喜欢

  • python实现的重启关机程序实例

    2023-08-09 22:54:20
  • Pycharm修改python路径过程图解

    2022-10-27 15:57:26
  • 详解基于Transformer实现电影评论星级分类任务

    2022-01-08 20:31:23
  • 在tensorflow中实现屏蔽输出的log信息

    2023-02-27 17:41:21
  • W3C网页内容无障碍指南2.0(WCAG)

    2008-11-20 13:40:00
  • python面向对象编程设计原则之单一职责原则详解

    2022-02-13 20:51:25
  • Codeigniter发送邮件的方法

    2023-11-15 05:08:25
  • linux中数据库的定时备份

    2024-01-25 17:43:25
  • 浏览器用户体验:Firefox初体验 VS The world

    2008-08-02 11:58:00
  • 解决python3 pika之连接断开的问题

    2021-09-28 18:40:09
  • Flask框架运用WTForms实现用户注册的示例详解

    2021-07-31 06:50:12
  • python小例子-缩进式编码+算术运算符+定义与赋值

    2022-09-15 06:03:45
  • python利用tkinter实现屏保

    2022-01-26 05:39:51
  • Go 在 MongoDB 中常用查询与修改的操作

    2024-04-26 17:18:04
  • 史上最全Python文件类型读写库大盘点

    2021-01-28 22:08:26
  • Python企业编码生成系统总体系统设计概述

    2021-03-31 09:12:19
  • BootStrop前端框架入门教程详解

    2024-04-29 13:46:10
  • MySQL修改root账号密码的方法

    2024-01-28 07:25:46
  • asp.net连接数据库 增加,修改,删除,查询代码

    2024-01-20 15:52:31
  • 原生JS与jQuery编写简单选项卡

    2024-04-30 09:52:52
  • asp之家 网络编程 m.aspxhome.com