以前PowerShellでも書きましたが、Pythonでマジックパケットを投げるにはsocketモジュールを使います。
ポート番号はネットで検索すると7番か9番、何でもいい、など情報が出てきますが、手元で試した限りはとりあえず下記の7番(DEFAULT_PORT
)で使えるようでした。socketオブジェクトは利用後にクローズする必要があるので、明示的にclose (socket.close()
)を呼ぶか、下記のようにwith文を使えば例外が発生してもクローズされます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # -*- coding: utf-8 -*- import socket import struct from traceback import print_exc DEFAULT_PORT = 7 def send_magic_packet(addr): # create socket with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # parse address mac_ = addr.upper().replace("-", "").replace(":", "") if len(mac_) != 12: raise Exception("invalid MAC address format: {}".format(addr)) buf_ = b'f' * 12 + (mac_ * 20).encode() # encode to magic packet payload magicp = b'' for i in range(0, len(buf_), 2): magicp += struct.pack('B', int(buf_[i:i + 2], 16)) # send magic packet print("sending magic packet for: {}".format(addr)) s.sendto(magicp, ('<broadcast>', DEFAULT_PORT)) if __name__ == "__main__": try: # mac_addr = [] mac_addr = "00:50:56:36:ED:D8" send_magic_packet(mac_addr) except BaseException: print_exc() |
おわり。