package com.hxl.utils.blackTechnology.socke;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 通过网卡 唤醒电脑
*
*/
public class MacUtil {
/**
* 把mac 地址转成 二进制
*
* @param macStr
* mac地址
* @return 数据
*/
public static byte[] getMacBytes(String macStr) {
byte[] bytes = new byte[6];
String[] hex = macStr.split("(\\:|\\-)");
if (hex.length != 6) {
return null;
}
try {
for (int i = 0; i < 6; i++) {
bytes[i] = (byte) Integer.parseInt(hex[i], 16);
}
} catch (NumberFormatException e) {
return null;
}
return bytes;
}
/**
* 得到开机指令
*
* @param macStr
* mac地址
* @return 开机指令
*/
public static byte[] getDestBytes(String macStr) {
byte[] destMac = getMacBytes(macStr);
if (destMac == null) {
return null;
}
// construct packet data
byte[] magicBytes = new byte[102];
// 将数据包的前6位放入0xFF即 "FF"的二进制
for (int i = 0; i < 6; i++)
magicBytes[i] = (byte) 0xFF;
// 从第7个位置开始把mac地址放入16次
for (int i = 0; i < 16; i++) {
for (int j = 0; j < destMac.length; j++) {
magicBytes[6 + destMac.length * i + j] = destMac[j];
}
}
return magicBytes;
}
/**
* 发送UDP请求
*
* @param bytes
* 发送信息
* @param host
* ip地址
* @param port
* 端口
* @return 返回数据
*/
public static String send(byte[] bytes, String host, int port) {
try {
DatagramSocket client = new DatagramSocket();
InetAddress addr = InetAddress.getByName(host);
DatagramPacket sendPacket = new DatagramPacket(bytes, bytes.length, addr, port);
client.send(sendPacket);
byte[] recvBuf = new byte[1024];
DatagramPacket recvPacket = new DatagramPacket(recvBuf, recvBuf.length);
client.receive(recvPacket);
String recvStr = new String(recvPacket.getData(), 0, recvPacket.getLength());
client.close();
return recvStr;
} catch (Exception e) {
return null;
}
}
public static void main(String[] args) {
send(MacUtil.getDestBytes("00-30-18-50-25-D5"), "192.168.0.255", 10000);
}
}