歡迎您光臨本站 註冊首頁

python3通過udp實現組播數據的發送和接收操作

←手機掃碼閱讀     lousu-xi @ 2020-05-06 , reply:0

本文主要通過對攝像頭進行抓包,模擬發送了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'

B2D5D4D2-808C-40F6-87CD-694C05C2B274inquiry

' xml_str = b'

CB09F608-E016-4EE8-869A-CA186852F12Einquiry

' # 創建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"

(.*?)

", re.S), str(data))[1] MAC = re.search(re.compile(r"

(.*?)

", 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上正常接收了!!!


[lousu-xi ] python3通過udp實現組播數據的發送和接收操作已經有381次圍觀

http://coctec.com/docs/python/shhow-post-233052.html