最近在搞樹莓派,自己利用遠程SSH寫了個遠程喚醒的工具,遠程SSH內網穿透用的是花生殼
用以下代碼生成class文件以後,寫到sh腳本里面,權限改成755即可,進入到shell裏面後
sudo java SendPackage
然後遠程的時候直接 ./s.sh 即可實現開機
以下是核心代碼,廣播地址我這邊是直接寫死了,可以實現根據實際情況獲取,mac地址寫可以添加成從命令行中讀取,利用魔術封包實現遠程開機的類,使用前請確認已配置好網卡中的魔包啓動,同時BIOS設置中設置成網卡喚醒允許
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class SendPackage {
public static void main(String args[]){
try{
//創建DatagramSocket類對象,此類表示用來發送和接收數據報包的套接字。
DatagramSocket ds=new DatagramSocket();
//創建要發送的數據,並將數據打包
// byte[] data="hello,我就是發送端要發送的數據".getBytes();
String magicPacket = "FFFFFFFFFFFF";//魔術封包頭
String mac = ""//這裏填入需要喚醒mac地址 格式"002000000000";
String Stringdata = magicPacket + mac + mac + mac + mac + mac + mac + mac + mac + mac + mac + mac + mac + mac + mac + mac + mac;//發送魔術封包頭之後發送十六次mac地址實現開機
byte[] data = hexStringToByte(Stringdata);//十六進制字符串轉換成byte數組,不可以直接用String中的toBytes方法
//DatagramPacket類表示數據報包,用來實現無連接包投遞服務。
//DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
//該構造方法表示 構造數據報包
//用來將長度爲 length 偏移量爲 offset 的包發送到指定主機上的指定端口號。
DatagramPacket dp=new DatagramPacket(data,0,data.length, InetAddress.getByName("192.168.199.255"),10000);
//socket對象通過send方法發送數據報包dp
ds.send(dp);
//關閉資源
ds.close();
//捕獲錯誤
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/** *//**
* 把16進制字符串轉換成字節數組
* @param hex
* @return
*/
public static byte[] hexStringToByte(String hex) {
int len = (hex.length() / 2);
byte[] result = new byte[len];
char[] achar = hex.toCharArray();
for (int i = 0; i < len; i++) {
int pos = i * 2;
result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));
}
return result;
}
private static byte toByte(char c) {
byte b = (byte) "0123456789ABCDEF".indexOf(c);
return b;
}
}