远程唤醒

硬件要求:

 

1、硬件连接

  网卡安装完毕后将远程唤醒电缆的一端插入到网卡的WOL接口上,另外一端与主板的3针WOL远程唤醒接口相连(该接口旁通常标有WOL_CON的字样,当然如果主板和网卡都支持PCI2.2标准则无须做这一步)。

      需要说明的是,某些主板上已经集成了具有网络唤醒功能的网卡,只要开启“Wake on PCI Card”功能就可以了,没有什么三脚插座,更不需要专用的三芯连线。

 

2、CMOS设置

  打开CMOS远程唤醒功能很简单,只要将CMOS设置中的“Power Management Setup”的“Wake Up On LAN”或“Resume by LAN”项设置为“Enable”或“On”即可。

  ATX电源

  必须要使用ATX电源,而且其+5V Standby电流必须比较大,根据Intel的建议,它需要在600mA以上。该电流的大小可以从电源外部标识中的+5VSB(或+5AUX,5VSB)栏里查到。(绝大部分的网卡在0.7A以下都可唤醒)

  如果远程计算机最后一次关机的时候是属于非正常关机(突然断电或者关机时死机等),唤醒就有可能会失败。在Windows 2000/XP系统中如果在关闭计算机时使用休眠 ,也可能会造成唤醒失败。这是因为一些网卡需要复位一个标记,这只有在操作系统正常关闭的时候才会发生。

 

 代码实现:

 

<!-- 分页 -->

package com.cbf.web.util;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class WOLOperate {

 private int port=10000;
 private String mac="00:1c:c0:bf:97:f0";
 private String ipAdd="255.255.255.255";
 
 public WOLOperate(){}
 
 public WOLOperate(int port,String mac,String ipAdd){
  this.port=port;
  this.mac = mac;
  this.ipAdd = ipAdd;
 }
 
 public void sendOpenOperate() {
  InetAddress destHost = null;
  DatagramSocket ds = null;
  try {
   destHost = InetAddress.getByName(ipAdd);

   byte[] destMac = getMacBytes(mac);
   byte[] magicBytes = new byte[102];

   // 将数据包的前6位放入0xFF即 "FF"的二进制
   for (int i = 0; i < 6; i++)
    magicBytes[i] = (byte) 0xFF;
   // 从第7个位置开始把mac地址放入16次
   for (int i = 0; i < 16; i++) {
    for (int j = 0; j < destMac.length; j++) {
     magicBytes[6 + destMac.length * i + j] = destMac[j];
    }
   }
   
   DatagramPacket dp = null;
   dp = new DatagramPacket(magicBytes, magicBytes.length, destHost,
     port);
   ds = new DatagramSocket();
   ds.send(dp);
  } catch (SocketException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (ds != null) {
    ds.close();
   }
  }
 }

 public void sendCloseOperate(){
  
 }
 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;
 }
 
 public static void main(String[] args){
  WOLOperate w = new WOLOperate();
  w.sendOpenOperate();
 }
}

你可能感兴趣的:(.net,windows,Web,XP,J#)