WOL封包遠程啓動封包JAVA代碼

最近在搞樹莓派,自己利用遠程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;
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章