远程唤醒实现开机

远程唤醒实现开机packagecom.lh.openOS;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.net.SocketException;publicclassTestOpenOS{ privateintport=100

大家好,又见面了,我是你们的朋友全栈君。

package com.lh.openOS;

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

public class TestOpenOS
{
	private int port = 10000;
	private String mac = "8C-89-A5-19-82-9A";
	private String ipAddress = "255.255.255.255";

	public TestOpenOS()
	{
		// TODO Auto-generated constructor stub
	}
	
	private void setMac(String mac)
	{
		this.mac = mac;
	}
	
	public TestOpenOS(int port, String mac, String ipAddress)
	{
		this.port = port;
		this.mac = mac;
		this.ipAddress = ipAddress;
	}

	public void sendOpenOS()
	{
		InetAddress destHost = null;
		DatagramSocket ds = null;
		try
		{
			destHost = InetAddress.getByName(ipAddress);
			byte[] destMac = getMacBytes(mac);
			byte[] magicBytes = new byte[102];

			// 将数据包的前六位放入0xFF即“FF”的二进制
			// 发一个BroadCast包,包的内容包括以下数据就可以了。
			// FF FF FF FF FF FF,6个FF是数据的开始,
			// 紧跟着16次MAC地址就可以了。
			for (int i = 0; i < 16; i++)
			{
				for (int j = 0; j < destMac.length; j++)
				{
					magicBytes[6 + destMac.length * i + j] = destMac[j];
					magicBytes[j] = (byte) 0xFF;
				}
			}

			// --------------------查看数据报发出的数据---------------------
			for (int i = 1; i <= 102; i++)
			{
				if (((i - 1) % 6) == 0)
				{
					System.out.println();
				}
				System.out.print(magicBytes[i - 1] + "===");
			}

//			System.out.println("port =" + port + ", destHost=" + destHost + ",magicBytes.length = " + magicBytes.length);
			
			
			DatagramPacket dp = null;
			try
			{
				dp = new DatagramPacket(magicBytes, magicBytes.length, destHost, port);
				ds = new DatagramSocket();
				ds.send(dp);
			}
			catch (Exception e)
			{
				// TODO: handle exception
				e.printStackTrace();
			}
		}
		catch (Exception e)
		{
			// TODO: handle exception
			e.printStackTrace();
		}
		finally
		{
			if (null != ds)
			{
				//关闭数据报流
				ds.close();
			}
		}
	}

	// 远程关机
	public void sendCloseOS()
	{

	}
	
	/**
	 *  将16进制的mac地址转换为二进制 
	 * @param macStr
	 * @return 
	 * @throws IllegalArgumentException
	 */
	private static byte[] getMacBytes(String macStr) throws IllegalArgumentException
	{
		byte[] bytes = new byte[6];
		String[] hex = macStr.split("(\\:|\\-)");
		if (hex.length != 6)
		{
			throw new IllegalArgumentException("mac 地址有问题,你看看对不对?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)
	{
		TestOpenOS w = new TestOpenOS();
		w.sendOpenOS();
		
		w.setMac("8C-89-A5-19-80-3D");
		w.sendOpenOS();
	}
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137927.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • C语言中字符数组初始化的几种方法「建议收藏」

    C语言中字符数组初始化的几种方法「建议收藏」1.C语言中的字符数组初始化在C语言中,字符串是当做字符数组来处理的;所以字符串有两种声明方式,一种是字符数组,一种是字符指针。1.1直接逐个初始化字符数组:字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。charstrr[]={‘I’,”,’a’,’m’,”,’h’,’a’,’p’,’p’,’y’};注意:如果花括号中提供的字符个数大于数组长度…

    2022年7月18日
  • 通过sql调用procedure_oracle存储过程简单案例

    通过sql调用procedure_oracle存储过程简单案例文章目录1.存储过程和函数在实际项目中的使用2.存储过程与函数的比较2.1.共同点2.2.不同点3.存储过程StoredProcedure3.1.存储过程概述3.1.1.存储过程的优点3.1.2.存储过程的缺点3.2.创建存储过程createprocedure3.3.调用存储过程call3.4.查看存储过程的定义3.5.修改存储过程alterprocedure…

    2022年10月5日
  • 数据库分区分表和提升性能「建议收藏」

    数据库分区分表和提升性能「建议收藏」http://my.oschina.NET/tinyframework/blog/186583序言一直在做企业应用,目前要做一些互联网应用,当然只是应用是放在互联网的,数据量距离真正的互联网应用还是有相当大的差距的。但是不可避免的,在数据库出现瓶颈的情况还是有的,现在做互联网上的应用,当然也要未雨绸缪,要考虑数据量大的时候的解决方案。这个目前开源的商用的也都有不少解

    2022年5月18日
  • java 添加盲水印_OpenCV-图像处理-频域手段添加盲水印[通俗易懂]

    java 添加盲水印_OpenCV-图像处理-频域手段添加盲水印[通俗易懂][傅里叶变换算法及盲水印实现]盲水印,顾名思义就是看不见的水印。今天我们来说下频域加盲水印。相信大家做过图像处理的对频域、时域、空间域概念都有了一定的了解。空间域,我们日常所见的图像就是空域。空域添加数字水印的方法是在空间域直接对图像操作(之所以说的这么绕,是因为不仅仅原图是空域,原图的差分等等也是空域),比如将水印直接叠加在图像上。频域:描述信号在频率方面特性时用到的一种坐标系。在图像中就是图像…

    2022年10月26日
  • MOS管功率放大器电路图与原理图文及其解析[通俗易懂]

    MOS管功率放大器电路图与原理图文及其解析[通俗易懂]放大器电路的分类本文介绍MOS管功率放大器电路图,先来看看放大器电路的分类,按功率放大器电路中晶体管导通时间的不同可分:甲类功率放大器电路、乙类功率放大器电路和丙类功率放大器电路。甲类功率放大器电路,在信号全范围内均导通,非线性失真小,但输出功率和效率低,因此低频功率放大器电路中主要用乙类或甲乙类功率放大电路。功率放大器是根据信号的导通角分为A、B、AB、C和D类,我国亦称为甲、乙、甲乙、丙和丁类。功率放大器电路的特殊问题(1)放大器电路的功率功率放大器电路的任务是推动负载,因此功率放大电路的重

    2022年6月3日
  • Spring Boot Vue全栈开发实战_java web前端

    Spring Boot Vue全栈开发实战_java web前端构建SpringBoot项目并通过登录DEMO打通前后端的联系,为下一步开发打下基础。

    2022年10月12日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号