본문 바로가기
자바

[JAVA] JAVA 코드로 Wake On Lan 사용하기

12시간의 삽질 끝에 JAVA로 WOL 매직 패킷 보내기에 성공했다.

 

참고 글

 

 

자바 WOL 코드 참고

https://imaitman.tistory.com/203

 

wol 설정 참고

https://hackcatml.tistory.com/2

 

bios 설정 참고

https://202psj.tistory.com/1241

 

확인해야 할 설정

1. BIOS WOL 설정

 - BIOS가 WOL 지원 하는지 확인 필요

 - BIOS에서 WOL 설정 Enabled

 

2. 윈도우 WOL 설정

 - 네트워크 어댑터가 WOL 지원 하는지 확인 필요

 - 네트워크 어댑터에서 WOL 설정 Enabled

 - 이더넷 설정에서 IPv4 수동 설정으로 변경 확인 -> DHCP(자동) 사용시 ip가 변경될 가능성 있음

 - 전원 설정 -> 밑 이미지 확인 혹은 두 번째 참고 글 확인

 - 소켓 포트 확인

wol 설정 참고 홈페이지에서 확인 가능

 

작동확인된 테스트 코드

import org.junit.jupiter.api.Test;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class WakeOnLan {
    public static final int PORT = 9;    //  UDP 포트

    @Test
    public void WOL_기능_테스트() {
        // Mac Address는 대상이 되는 컴퓨터의 주소입니다.
        String macStr = "PC MAC 주소";
        // broadcast address(특별한 경우가 아니면 대부부의 환경에서는 아래 IP로 하면 됩니다.)
        // 내부망(공유기) broad cast 주소
        String ipStr = "192.168.0.255";
        try {
            byte[] macBytes = getMacBytes(macStr);
            byte[] bytes = new byte[6 + 16 * macBytes.length];
            for (int i = 0; i < 6; i++) {
                bytes[i] = (byte) 0xff;
            }
            for (int i = 6; i < bytes.length; i += macBytes.length) {
                System.arraycopy(macBytes, 0, bytes, i, macBytes.length);
            }
            InetAddress address = InetAddress.getByName(ipStr);
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, PORT);
            DatagramSocket socket = new DatagramSocket();
            socket.send(packet);
            socket.close();
            System.out.println("Wake-on-LAN packet sent.");
        } catch (Exception e) {
            System.out.println("Failed to send Wake-on-LAN packet: + e");
            System.exit(1);
        }
    }

    private static byte[] getMacBytes(String macStr) throws IllegalArgumentException {
        byte[] bytes = new byte[6];
        String[] hex = macStr.split("(\\:|\\-)");
        if (hex.length != 6) {
            throw new IllegalArgumentException("Invalid MAC address.");
        }
        try {
            for (int i = 0; i < 6; i++) {
                bytes[i] = (byte) Integer.parseInt(hex[i], 16);
            }
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("Invalid hex digit in MAC address.");
        }
        return bytes;
    }
}

 

'자바' 카테고리의 다른 글

[Tomcat] zip file is empty  (0) 2022.12.09
[JAVA] Stream의 Match 사용법  (0) 2022.07.11
[JPA] Change Column Name 유의  (0) 2022.05.23
RFID 리더기로 값 읽기 - 프롤로그  (0) 2021.07.14