wake on lan wol 技术资料 远程开启家里机器技术思路 ubuntu

本文介绍了使用开源项目WakeOnLan在Java中发送WOL(Wake-on-LAN)广播包的方法,以及如何利用树莓派、Todesk等技术实现远程控制家用设备的开机。还提及了其他远程桌面解决方案如VNC。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开源项目

https://github.com/Florianisme/WakeOnLan/

发送按钮时间

public void onClick() {

try {

WolSender.sendWolPacket(device);

Toast.makeText(this, getString(R.string.wol_toast_sending_packet, device.name), Toast.LENGTH_LONG).show();

} catch (Exception e) {

Log.e(this.getClass().getName(), "Error while sending WOL Packet", e);

}

}

public class WolSender {

public static final Executor EXECUTOR = Executors.newSingleThreadExecutor();

public static void sendWolPacket(Device device) {

Runnable sendWolRunnable = new Runnable() {

@Override

public void run() {

sendPacket(device.broadcastAddress);

new BroadcastHelper().getBroadcastAddress().ifPresent(inetAddress -> sendPacket(inetAddress.getHostAddress()));

}

private void sendPacket(String broadcastAddress) {

if (Strings.isNullOrEmpty(broadcastAddress)) {

return;

}

WolSender封装

public class WolSender {

public static final Executor EXECUTOR = Executors.newSingleThreadExecutor();

public static void sendWolPacket(Device device) {

Runnable sendWolRunnable = new Runnable() {

@Override

public void run() {

sendPacket(device.broadcastAddress);

new BroadcastHelper().getBroadcastAddress().ifPresent(inetAddress -> sendPacket(inetAddress.getHostAddress()));

}

private void sendPacket(String broadcastAddress) {

if (Strings.isNullOrEmpty(broadcastAddress)) {

return;

}

try {

DatagramPacket packet = PacketBuilder.buildMagicPacket(broadcastAddress, device.macAddress, device.port, device.secureOnPassword);

DatagramSocket socket = new DatagramSocket();

socket.send(packet);

socket.close();

} catch (Exception e) {

Log.e(this.getClass().getName(), "Error while sending magic packet: ", e);

}

}

};

EXECUTOR.execute(sendWolRunnable);

}

}

核心代码PacketBuilder.java中,数据包封装机udp发送广播

static DatagramPacket buildMagicPacket(String broadcastAddress, String macAddress, int port, @Nullable String secureOnPassword) throws UnknownHostException {

byte[] macBytes = getMacBytes(macAddress);

byte[] secureOnPasswordBytes = getSecureOnPasswordBytes(secureOnPassword);

// Packet is 6 times 0xff, 16 times MAC Address of target and 0, 4 or 6 character password

byte[] bytes = new byte[6 + (16 * macBytes.length) + secureOnPasswordBytes.length];

// Append 6 times 0xff

for (int i = 0; i < 6; i++) {

bytes[i] = (byte) 0xff;

}

// Append MAC address 16 times

for (int i = 0; i < 16; i++) {

appendMacAddress(macBytes, bytes, i);

}

// Append Password

System.arraycopy(secureOnPasswordBytes, 0, bytes, bytes.length - secureOnPasswordBytes.length, secureOnPasswordBytes.length);

InetAddress address = InetAddress.getByName(broadcastAddress);

return new DatagramPacket(bytes, bytes.length, address, port);

}

远程开启家里机器思路

需解决需要的时候再开机,不需要的时候机器处于关机状态

1. 申请公网带宽

2. 内网挂一个低功耗设备,树莓派?手机?

        2.1 内部部署一个ip更新通知服务,检测到自己的公网ip发生变动,发个邮件给自己的邮箱

        2.2 光猫及路由器作端口映射,把低功耗设备上的开机服务暴露出来,ssl+一些认证技术

3. PC机打开BIOS "Power ON By PCI-E"开关

4. PC机接上局域网网线

直接花钱的方案

购买成品支持wol的开机棒

todesk似乎有个手机app,原理估计类似

远程桌面技术

1. todesk

2. 向日葵

3. 自己搭建vnc,暴露端口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值