wakeonlan.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. }