wakeonlan.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package wakeonlan
  2. import (
  3. "errors"
  4. "net"
  5. "time"
  6. )
  7. /*
  8. Wake On Lan
  9. Author: tobychui
  10. This module send wake on LAN signal to a given MAC address
  11. and do nothing else
  12. */
  13. type magicPacket [102]byte
  14. func WakeTarget(macAddr string) error {
  15. packet := magicPacket{}
  16. mac, err := net.ParseMAC(macAddr)
  17. if err != nil {
  18. return err
  19. }
  20. if len(mac) != 6 {
  21. return errors.New("invalid MAC address")
  22. }
  23. //Initialize the packet with all F
  24. copy(packet[0:], []byte{255, 255, 255, 255, 255, 255})
  25. offset := 6
  26. for i := 0; i < 16; i++ {
  27. copy(packet[offset:], mac)
  28. offset += 6
  29. }
  30. //Most devices listen to either port 7 or 9, send to both of them
  31. err = sendPacket("255.255.255.255:7", packet)
  32. if err != nil {
  33. return err
  34. }
  35. time.Sleep(30 * time.Millisecond)
  36. err = sendPacket("255.255.255.255:9", packet)
  37. if err != nil {
  38. return err
  39. }
  40. return nil
  41. }
  42. func sendPacket(addr string, packet magicPacket) error {
  43. conn, err := net.Dial("udp", addr)
  44. if err != nil {
  45. return err
  46. }
  47. defer conn.Close()
  48. _, err = conn.Write(packet[:])
  49. return err
  50. }
  51. func IsValidMacAddress(macaddr string) bool {
  52. _, err := net.ParseMAC(macaddr)
  53. return err == nil
  54. }