python3通過udp實現組播資料的傳送和接收

2021-09-23 20:45:54 字數 1833 閱讀 1896

本文主要通過對海康攝像頭進行抓包,模擬傳送了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"?>b2d5d4d2-808c-40f6-87cd-694c05c2b274

inquiry

'xml_str = b'<?xml version="1.0" encoding="utf-8"?>cb09f608-e016-4ee8-869a-ca186852f12e

inquiry

'# 建立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通過pymongo操作mongoDB

2,增刪改查 mongodb預設開啟的埠號是27017 import pymongo 連線本地mongo服務 client bendi pymongo.mongoclient db bendi client bendi db name col bendi db bendi col name impo...

python3通過json獲取天氣資訊

通過python,每天定時傳送今明倆天的天氣資訊 測試的時候可以傳送給自己,後面可以傳送給指定的人或 from future import unicode literals from threading import timer from wxpy import import requests im...

如何通過Python3和ssl實現加密通訊功能

一 說明 1.python標準庫ssl可實現加密通訊 2.ssl庫底層使用openssl,做了面向對像化改造和簡化,但還是可以明顯看出openssl的痕跡 3.本文先給出python實現的socket通訊,在此基礎上再給出ssl通訊以便讀者更方便地看到socket和ssl在python程式設計中的區...