Python 实现局域网设备查找,获取设备的IP及MAC

为了工作中碰到的一些问题,也是为了好玩,做了一个在局域网中搜索设备(代码中可设定搜索IP的范围),并且获取设备的IP以及MAC地址。用以发送关机和网络唤醒的命令。

实现关机和网络唤醒的前提是:

1、目标主机关闭了防火墙。

 

2、网卡设置了允许网络唤醒,并且主板BIOS中也没有相应的设置限制

3、我是通过 ping IP地址,然后查看 arp缓存中的MAC实现的

    具体步骤上代码

#coding:GB2312
import socket
import struct
import os
import re
import time
from tkinter import *
root = Tk()
 
 
def outputCmd(cmd):
    r = os.popen(cmd)
    text = r.read()
    r.close()
    return text
 
def checkMAC(ipaddress):
    arp_cmd = "arp -a"
    arp_result = outputCmd(arp_cmd)
    # print(arp_result)
    # ip2 = "(?<=\.2 ).+(?=     +?)"
    # ip2 = "\.10 [ ]+([\w-]+)"
    ip2 =ipaddress+" [ ]+([\w-]+)"
    ip2MAC = re.findall(ip2, arp_result)
    if ip2MAC == []:
        return 0
    else:
        # print(" %s 的MAC是:%s" % (ipaddress, ip2MAC[0]))
        print(" 检测到MAC为:%s" % (ip2MAC[0]))
        return ip2MAC[0]
 
 
def checkDevice_and_writeInTxt():
    val = 0
    netport = 0
    print("稍等片刻,局域网设备搜索中......")
    print("************************************")
    f = open("IP_MAC.txt", "w+")
    for val in range(13, 18):
        dest_ip = "192.168.0." + val.__str__()
        cmd_pingAll = "ping " + dest_ip + " -n 2 "
        result = outputCmd(cmd_pingAll)
        find_TTL = result.find("TTL")
        if find_TTL != -1:
            netport += 1
            print("存在IP为%s 的设备" % dest_ip, end=' ')
            result = checkMAC(dest_ip)
            if result == 0:
                print(" 本机IP为: %s   MAC不会告诉你的啦......" % dest_ip)
            else:
                f.write(dest_ip+' >>> '"%s\n" %result) #写入 ip MAC 到文件中
    print("************************************")
    print("共有 %s 个设备" % netport)
    #f.write("***By LHT %s***"%time.asctime(time.localtime(time.time())))
    f.close()
 
 
"""发送魔包唤醒macaddress 的设备"""
def wake_on_lan(macaddress):
    """ Switches on remote computers using WOL. """
    # Check macaddress format and try to compensate.
    if len(macaddress) == 12:
        pass
    elif len(macaddress) == 12 + 5:
        sep = macaddress[2]
        macaddress = macaddress.replace(sep, '')
        # print(macaddress)
    else:
        raise ValueError('Incorrect MAC address format')
 
        # Pad the synchronization stream.
    data = ''.join(['FFFFFFFFFFFF', macaddress * 20])
    send_data = b''
 
    # Split up the hex values and pack.
    for i in range(0, len(data), 2):
        send_data = b''.join([send_data, struct.pack('B', int(data[i: i + 2], 16))])
    # print(send_data)
 
        # Broadcast it to the LAN.
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    sock.sendto(send_data, ('<broadcast>', 7))
    time.sleep(1)
    sock.sendto(send_data, ('<broadcast>', 7))
    time.sleep(1)
    sock.sendto(send_data, ('<broadcast>', 7))
 
"""关机命令"""
def power_off(IP_dest):
    print(IP_dest)
    os.system("net use ""\\\\" + IP_dest[0] + " \"admin\"/user:\"admin\"")
    poweroff_cmd = "shutdown -s -m " + "\\\\" + IP_dest[0] + " -t 0"
    # print(poweroff_cmd)
    os.system(poweroff_cmd)
 
 
"""读取txt中记录的 IP的MAC地址  执行开机"""
def readTxtMac_and_wakeOnLan():
    f = open("IP_MAC.txt", "r")
    fa = f.readlines()
    for a in range(0, len(fa)):
        fb = fa[a]
        findword = "[>>>]. ([\w-]+)"
        MAC_dest = re.findall(findword, fb)
        print("进行唤醒MAC为%s 的设备中。。。" %MAC_dest)
        wake_on_lan(MAC_dest[0])
 
 
"""读取txt中记录的 IP地址       执行关机"""
def readTxtMac_and_powerOff():
    f = open("IP_MAC.txt", "r")
    fa = f.readlines()
    for a in range(0, len(fa)):
        fb = fa[a]
        findword = "([\.\d]+) "
        IP_dest = re.findall(findword, fb)
        # print(IP_dest)
        print("进行关闭IP为%s 的设备中。。。" % IP_dest)
        power_off(IP_dest)
 
 
if __name__ == '__main__':
 
    def g():
        if b['text'] == '开机':
            b['text'] = '关机'
            readTxtMac_and_wakeOnLan()
            # print('开始')
        else:
            b['text'] = '开机'
            checkDevice_and_writeInTxt()
            readTxtMac_and_powerOff()
            # print('结束')
 
 
    b = Button(root, text='关机', font=('KaiTi', 36, 'bold'), bg='pink', fg='green', bd=2, width=10, command=g)
    b.pack()
    root.mainloop()
 
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种广泛使用的编程语言,主要用于数据处理、网络编程、机器学习等领域。语音唤醒是计算机交互的一种方式,通常用于智能手机、智能音箱等设备。在Python中,可以使用语音识别库来实现语音唤醒功能。 一种常用的Python语音唤醒库是SpeechRecognition库。该库提供了Python API,可以用于语音识别和处理语音输入。使用该库,您可以编写代码来识别用户的语音命令,并根据命令执行相应的操作。 要使用SpeechRecognition库实现语音唤醒,您需要以下步骤: 1. 安装SpeechRecognition库:您可以使用pip命令在终端中安装该库。 2. 准备语音数据:您需要收集或录制一些语音数据,并将其保存为音频文件。这些文件将被用作语音唤醒的输入。 3. 编写代码:使用SpeechRecognition库编写代码,以识别用户的语音命令。您可以使用麦克风或其他音频输入设备捕获音频数据,并将其传递给SpeechRecognition库进行处理。 4. 实现唤醒功能:根据您的需求,您可以编写代码来实现语音唤醒功能。例如,当用户说出特定的唤醒词时,您的代码可以触发相应的操作。 下面是一个简单的示例代码,演示如何使用SpeechRecognition库实现语音唤醒功能: ```python import speech_recognition as sr # 创建Recognizer对象 r = sr.Recognizer() # 从麦克风捕获音频数据 with sr.Microphone() as source: print("请说唤醒词...") audio = r.listen(source) # 使用Google语音识别引擎进行识别 try: print("识别结果:") print(r.recognize_google(audio, language='zh-CN')) except sr.UnknownValueError: print("无法识别音频") except sr.RequestError as e: print("Google Speech Recognition服务出错;{0}".format(e)) ``` 在这个示例中,我们使用麦克风捕获音频数据,并使用Google语音识别引擎进行识别。当用户说出特定的唤醒词时,代码将输出识别结果。您可以根据您的需求修改代码,以实现更复杂的语音唤醒功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值