使用Python扫描局域网内设备的IP、MAC和设备名

随着物联网和智能家居的普及,局域网内的设备越来越多。我们经常会希望获取这些设备的信息,例如IP地址、MAC地址以及设备名。本文将介绍如何使用Python实现这个功能,并提供完整的代码示例。

环境准备

首先,确保你已经安装了Python环境。我们需要使用几个库,其中包括:

  • scapy: 用于网络包的处理与发送。
  • socket: 用于获取本机的网络信息。
  • platform: 用于获取操作系统信息。

你可以使用以下命令安装scapy

pip install scapy

网络扫描的基本原理

我们将使用ARP(地址解析协议)请求来扫描局域网设备。具体流程如下:

  1. 获取本机IP地址和网络掩码。
  2. 创建ARP请求包,并广播到局域网。
  3. 接收响应,提取设备的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的强大功能,并将其应用于更广泛的场景中。