使用Python扫描局域网内设备的IP、MAC和设备名
随着物联网和智能家居的普及,局域网内的设备越来越多。我们经常会希望获取这些设备的信息,例如IP地址、MAC地址以及设备名。本文将介绍如何使用Python实现这个功能,并提供完整的代码示例。
环境准备
首先,确保你已经安装了Python环境。我们需要使用几个库,其中包括:
scapy
: 用于网络包的处理与发送。socket
: 用于获取本机的网络信息。platform
: 用于获取操作系统信息。
你可以使用以下命令安装scapy
:
pip install scapy
网络扫描的基本原理
我们将使用ARP(地址解析协议)请求来扫描局域网设备。具体流程如下:
- 获取本机IP地址和网络掩码。
- 创建ARP请求包,并广播到局域网。
- 接收响应,提取设备的IP地址、MAC地址、以及设备名(如果可以识别)。
以下是网络扫描的代码实现:
from scapy.all import ARP, Ether, srp
import socket
import ipaddress
def scan_network(network):
# 创建ARP请求
arp = ARP(pdst=str(network))
ether = Ether(dst='ff:ff:ff:ff:ff:ff')
packet = ether / arp
# 发送请求并获取响应
result = srp(packet, timeout=3, verbose=0)[0]
devices = []
for sent, received in result:
devices.append({'ip': received.psrc, 'mac': received.hwsrc})
return devices
def get_local_network():
# 获取本地IP地址并计算网络地址
hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
network = ipaddress.ip_interface(local_ip).network
return network
if __name__ == "__main__":
local_network = get_local_network()
print(f"Scanning network: {local_network}")
devices = scan_network(local_network)
for device in devices:
print(f"Device IP: {device['ip']}, MAC: {device['mac']}")
类图
为了更好地理解代码结构,可以通过Mermaid语法绘制类图。以下是示例:
classDiagram
class NetworkScanner {
+scan_network(network)
+get_local_network()
}
class Device {
+ip
+mac
}
NetworkScanner --> Device
数据可视化
为了更清晰地展示局域网内设备的数量分布情况,我们可选用饼状图来直观展示设备类型的比例(此处假设我们能根据MAC地址推断出设备类型)。可使用以下代码进行示例:
import matplotlib.pyplot as plt
# 假定的设备类型统计
device_types = {
'PC': 10,
'手机': 14,
'打印机': 3,
'IoT设备': 5,
}
labels = device_types.keys()
sizes = device_types.values()
plt.figure(figsize=(8, 6))
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=140)
plt.axis('equal') # 让饼图为正圆形
plt.title("局域网设备类型分布")
plt.show()
总结
通过本文的介绍,我们学习了如何使用Python扫描局域网内的设备信息,包括IP、MAC地址和设备名。借助scapy
库,网络请求变得简单直观。同时,通过使用类图和饼状图,我们可以更好地理解代码结构和设备分布。希望这篇文章能为你在网络编程和设备管理的道路上提供帮助。
在未来的日子里,网络安全将变得愈发重要,因此了解局域网内的设备信息是提升网络安全意识的一项基础工作。希望你能继续探索Python的强大功能,并将其应用于更广泛的场景中。