using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using UnityEngine;
public class WakeUpComputer : MonoBehaviour
{
//通过正则表达式设定MAC地址筛选标准,关于正则表达式请自行百度
const string macCheckRegexString = @"^([0-9a-fA-F]{2})(([/\s:-][0-9a-fA-F]{2}){5})$";
private static readonly Regex MacCheckRegex = new Regex(macCheckRegexString);
//唤醒主要逻辑方法
public static bool WakeUp(string mac)
{
//查看该MAC地址是否匹配正则表达式定义,(mac,0)前一个参数是指mac地址,后一个是从指定位置开始查询,0即从头开始
if (MacCheckRegex.IsMatch(mac, 0))
{
byte[] macByte = FormatMac(mac);
WakeUpCore(macByte);
return true;
}
return false;
}
private static void WakeUpCore(byte[] mac)
{
//发送方法是通过UDP
UdpClient client = new UdpClient();
//Broadcast内容为:255,255,255,255.广播形式,所以不需要IP
client.Connect(IPAddress.Broadcast, 50000);
//下方为发送内容的编制,6遍“FF”+17遍mac的byte类型字节。
byte[] packet = new byte[17 * 6];
for (int i = 0; i < 6; i++)
packet[i] = 0xFF;
for (int i = 1; i <= 16; i++)
for (int j = 0; j < 6; j++)
packet[i * 6 + j] = mac[j];
//唤醒动作
client.Send(packet, packet.Length);
}
private static byte[] FormatMac(string macInput)
{
byte[] mac = new byte[6];
string str = macInput;
//消除MAC地址中的“-”符号
string[] sArray = str.Split('-');
//mac地址从string转换成byte
for (var i = 0; i < 6; i++)
{
var byteValue = Convert.ToByte(sArray[i], 16);
mac[i] = byteValue;
}
return mac;
}
public void Button_Click_WakeUp(string s)
{
WakeUp(s);
//print(WakeUp("4A-BB-6D-61-75-AE"));
//print(WakeUp("E4-3A-6E-36-38-AA"));
}
//通过IP关闭计算机
//关机命令: shutdown -s -m \\192.168.0.xx -t 0
//重启命令: shutdown -r -m \\192.168.0.xx -t 0
public void ShutDown(string ip)
{
string args = String.Format("/cshutdown -s -m \\\\{0} -t 0", ip);
System.Diagnostics.Process.Start("cmd.exe", args);
UnityEngine.Debug.Log(args);
}
}