python3通過udp實現(xiàn)組播數(shù)據(jù)的發(fā)送和接收操作
本文主要通過對??禂z像頭進行抓包,模擬發(fā)送了udp包,并抓取攝像頭返回的數(shù)據(jù)包,解析并提取相關信息。
通過抓包發(fā)現(xiàn),海康攝像頭發(fā)送、接收數(shù)據(jù)使用udp協(xié)議,后來比較發(fā)現(xiàn),使用python模擬起來比較簡單。由于攝像頭內(nèi)置了udp協(xié)議的server端程序,本文主要使用python模擬客戶端發(fā)送udp數(shù)據(jù)包。
客戶端代碼
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> '
# 創(chuàng)建UDP socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
# 允許端口復用
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 綁定監(jiān)聽多播數(shù)據(jù)包的端口
s.bind((ANY, PORT))
# 聲明該socket為多播類型
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)
# 加入多播組,組地址由第三個參數(shù)制定
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發(fā)送數(shù)據(jù),使用re模塊來處理和提取數(shù)據(jù)。
通過使用wireshark抓包發(fā)現(xiàn),首先需要客戶端發(fā)送一個xml類型的數(shù)據(jù),server端接收到數(shù)據(jù)后,會返回攝像頭的各種信息,包括本文中將要獲取的攝像頭IPv4和MAC地址。
程序運行結果如圖所示:

寫在后面
本程序不僅可以作為設備發(fā)現(xiàn)來使用,在更換設備時也能第一時間發(fā)現(xiàn)設備是否被更換。
補充知識:python3 udp可以發(fā)送但不能接收消息的解決方法
現(xiàn)在有兩個系統(tǒng),win10和虛擬機中的xp,win10中有python3,xp中有網(wǎng)絡調(diào)試助手。
python3通過udp方式發(fā)送的消息可以在網(wǎng)絡調(diào)試助手接收,但是在網(wǎng)絡調(diào)試助手上發(fā)送的消息在python3上卻接收不到。首先python3接收寫的代碼如下:
import socket
def receive_message():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #創(chuàng)建一個套接字
udp_socket.bind(('', 63630)) #綁定本地信息,自己電腦的ip和程序的端口。ip一般不用寫,表示本機的任意一個ip,端口大于常用的1023就可以
while True:
udp_data = udp_socket.recvfrom(1024) #接收數(shù)據(jù),1024表示本次接收的最大字節(jié)數(shù)
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()
本以為是程序的問題或者是網(wǎng)絡調(diào)試助手的問題,但是檢查多遍后再次嘗試仍然無法接收。。暫時放下。。
今天把win10防火墻關閉后發(fā)現(xiàn)是可以正常接收的,但是想在不關閉防火墻的情況下仍然能夠接收,百度也沒有找到想要的答案。。
正當要放棄的時候看到如下設置:

于是勾選上了紅色箭頭所指的復選框。
再次運行程序,win10彈出對話框如下:

點擊允許訪問后,在xp網(wǎng)絡調(diào)試助手上發(fā)送消息就可以在python3上正常接收了!!!
以上這篇python3通過udp實現(xiàn)組播數(shù)據(jù)的發(fā)送和接收操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python使用openpyxl打開及讀取excel表格過程
openpyxl是一個Python庫,用于讀寫Excel?2010?xlsx/xlsm文件,它允許你輕松工作與Excel表格,進行數(shù)據(jù)處理和分析,支持讀取、創(chuàng)建和修改Excel文件,甚至可以在Excel中插入圖表等,安裝非常簡單,只需要使用pip命令即可2024-09-09
詳解Python如何利用Pandas與NumPy進行數(shù)據(jù)清洗
許多數(shù)據(jù)科學家認為獲取和清理數(shù)據(jù)的初始步驟占工作的 80%,花費大量時間來清理數(shù)據(jù)集并將它們歸結為可以使用的形式。本文將利用 Python 的 Pandas和 NumPy 庫來清理數(shù)據(jù),需要的可以參考一下2022-04-04
使用Python手工計算x的算數(shù)平方根,來自中國古人的數(shù)學智慧
本篇采用的計算方法既非二分法也非牛頓迭代法,而是把中國古代的手工計算平方根的方法轉成代碼來完成。代碼有點煩雜,算是拋磚引玉吧,期待高手們寫出更好的代碼來2021-09-09
python通過百度地圖API獲取某地址的經(jīng)緯度詳解
這篇文章主要給大家介紹了關于python通過百度地圖API獲取某地址的經(jīng)緯度的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-01-01

