Nexus 7を買ったらもう俺PCに接続しまくりなのでWOLが必須なので色々と遊んでみました、という話の続き。
電源投入とかスリープ復帰とかはすげー手軽なんですよ。クリック一発で。
スリープさせるのも同じような感じで出来ないものか、と思うじゃん。思いませんか。俺は思った。
何たらマネージメントインターフェース、みたいなので出来るのかもしれないけど調べるのめんどくせーから、WOLと同じような方法でやっちまえ、と思って、やってみた。
まず、Windows PC側ではこんなの(パケット届いたらスリープするだけ)を走らせておいて、ファイアウォールもこのポートの受信を開けておいて、
import ctypes
import socket
HOST = '0.0.0.0'
PORT = 9 # 適当なUDPポート番号を入れる
MAGIC_PHRASE = 'Random String' # ランダムな文字列とか適当に入れる
def suspend_self():
ctypes.windll.PowrProf.SetSuspendState(0, 0, 0)
def server():
sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sck.bind((HOST, PORT))
while True:
s = sck.recv(65536)
if s == MAGIC_PHRASE:
suspend_self()
sck.close()
if __name__ == '__main__':
server()
WOLの時と同じWeb鯖にこんなの(パケット投げるだけ)をCGIとして入れて、
#!/usr/bin/python
import socket
HOST = 'hostaddress' # WindowsマシンのIPV4アドレス
PORT = 9 # もう一つのスクリプトの設定に合わせる
MAGIC_PHRASE = 'Random String' # 同上
def send_sol_packet():
sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sck.sendto(MAGIC_PHRASE, (HOST, PORT))
sck.close()
def app():
send_sol_packet()
print 'Content-Type: text/plain\n\nDone.'
if __name__ == '__main__':
app()
あとは叩けばスリープしてくれるだろうか。してくれた。よしよし。
なお、よくソース貼り付けてるのは「ソースはどんどん公開しようぜ」主義なので。別にみんなでこれ使ってねとかは全く無いというか、こんな怪しい物を拾って食ったら腹壊すんじゃねーかなと俺も思ってるので。
もちろんアレなところがあったらコメント欲しいけど(じゃなきゃ公開する意味が無いし)、あまりにも全面的にアレだとコメント入れる気もしないだろうしなーとか。うむ。
つーかWOLより遥かに簡単なんだから、アプリがあったら結構喜ばれるんじゃねーかな。中継サーバ置いたらNAT越えも簡単そうだし、鯖使うなら有料ですよーとかでもいいよな。誰かやってないのかな。