oscserver

import socket
import binascii
import pprint

from pythonosc.udp_client import SimpleUDPClient    # 导入客户端
from pythonosc.dispatcher import Dispatcher  # 导入包中的文件dispatcher中的Dispatcher类
from pythonosc.osc_server import BlockingOSCUDPServer   # 导入包中的osc_server中的BlockingOSCUDPServer类

WakeOnLan = '/wakeonlan'        # 定义收到的OSC是'/wakeonlan' 
# 定义端口
ip_localhost = '127.0.0.1'
port_localhost = 5005           # 本机接收端口

ip_remote = '192.168.0.195'     # 被发送到的ip
port_remote = 7008              # 远程端口

welcome = f'OSC 服务器运行在本机的 [ {port_localhost} ] 端口......'
print(welcome)
# 收到'/wakeonlan'
def print_handler(address,*args):
    print(f'收到唤醒魔包:{address}: {args}')
    # 发送魔包
    '''
    格式化mac地址,生成魔包,然后发送
    mac.txt 中的地址必须格式化为每行一个mac地址.如下形式都可以:
    44850004F4EE
    00-FF-AC-C0-BB-CA
    44-85-00-04-F4-EE
    44:87:01:04:F4:EE
    '''
    f = lambda x:x.strip() if len(x.strip()) == 12 else x.strip().replace(x.strip()[2],'')
    mac = [f(r) for r in open('mac.txt')]
    print('-' * 24,'目标MAC地址列表','-' * 25) # mac.txt中的mac地址会被处理成FFFFFFFFFFFF无分隔符紧揍形式
    pprint.pprint(mac)
    print('-' * 66)
    ip = '127.0.0.1'  # 0网段广播
    port = 9999               # 魔包发送端口
    pswd = 'tocentek'   # password 
    pswd = pswd.encode()

    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
    def sendto(r):
        s.sendto(r,(ip,port))

    #python利用or在列表解析中调用多个函数 http://www.cnblogs.com/gayhub/p/5277919.html
    # 带密码
    [print('向MAC地址:',r,'发送唤醒魔术包...') or sendto(binascii.unhexlify('FF'*6+r*16) + pswd ) for r in mac]
    # 不带密码
    # [print('向MAC地址:',r,'发送唤醒魔术包...') or sendto(binascii.unhexlify('FF'*6+r*16)) for r in mac]
    s.close()
    print('-' * 15,'结束唤醒进程,如未开机,尝试再发一次','-' * 15)
    print(welcome)
# ########################################

def default_handler(address,*args):
    client = SimpleUDPClient(ip_remote , port_remote)   # 创建转发客户端
    client.send_message(address,*args) 
    print('->' * 10 ,f'向 {ip_remote}:{port_remote} 转发: {address}: {args}','->' * 10 )
    print(welcome)


dispatcher = Dispatcher()
dispatcher.map(WakeOnLan,print_handler)     # 收到唤醒魔包,调用print_handler函数
dispatcher.set_default_handler(default_handler) # 否则直接转发

server = BlockingOSCUDPServer((ip_localhost , port_localhost) , dispatcher) # 创建服务器
server.serve_forever()      # 一直跑

需要定义的参数:

  1. 本地接收端口:

port_localhost = 5005           # 本机接收端口

  2. 远程 ip 和端口:

ip_remote = '192.168.0.195'     # 被发送到的ip
port_remote = 7008              # 远程端口

  3. 魔包地址:

WakeOnLan = '/wakeonlan'        # 定义收到的OSC是'/wakeonlan' 

  4. mac.txt 地址簿(程序目录下):

44850004F4EE
00-FF-AC-C0-BB-CA
55-85-00-04-E5-AB
66:87:01:02:F4:0D

本程序魔包发送部分引用自codegay,感谢大佬!

猜你喜欢

转载自www.cnblogs.com/ToCenTek/p/11333788.html