就是字面意思, 比如人在外面玩, 只需要手機(jī)一點(diǎn),即可將家里的電腦打開(kāi).這個(gè)東西其實(shí)也沒(méi)啥好解釋的. 不想在遇到群里的那種無(wú)腦杠的人, 我想用軟件實(shí)現(xiàn)這個(gè)功能, 非得說(shuō)讓我買個(gè)硬件放在家里.對(duì)不起,我沒(méi)錢...
遠(yuǎn)程喚醒功能需要主板支持, 理論上10年內(nèi)買的電腦, 主板上都有這個(gè)功能, 如果沒(méi)有,那就用不了這個(gè),只能自己買硬件去吧.首先說(shuō)一下整個(gè)流程的配置.
第一步 先檢查自己的主板bios里面有沒(méi)有wol的開(kāi)啟功能,具體的開(kāi)啟步驟,我不說(shuō),這個(gè)自行百度一下, 因?yàn)橹靼逍吞?hào)不同,開(kāi)啟的地方不一樣,所以用你的"主板型號(hào)+怎么開(kāi)啟wakeuponline功能" 當(dāng)關(guān)鍵詞去百度搜索,把wol功能打開(kāi). 至于說(shuō)什么要去windows系統(tǒng)的硬件管理中 允許網(wǎng)卡喚醒啟動(dòng)的設(shè)置呢, 可開(kāi)可不開(kāi), 我是沒(méi)設(shè)置系統(tǒng)的限制,都是默認(rèn), 也能從遠(yuǎn)程正常喚醒
第二步 設(shè)置路由器,路由器上做端口映射,有些路由叫虛擬服務(wù)器啥的,也有不同的叫法, 目的是將內(nèi)網(wǎng)機(jī)器的端口映射到wan口,在外網(wǎng)可以訪問(wèn)到這個(gè)端口. 端口號(hào)固定是9號(hào)端口,這里截圖你們自己對(duì)照看一下自己的路由器怎么設(shè)置.
端口映射出去之后, 一般家里的IP都是動(dòng)態(tài)IP, 經(jīng)常會(huì)變,這里我們?cè)僭O(shè)置一下DDNS(動(dòng)態(tài)域名), 域名呢, 可以自己找免費(fèi)的,也可以自己花個(gè)一二十塊錢買個(gè)垃圾點(diǎn)的域名. 常見(jiàn)的有什么花生殼啦, dnspod啦,都可以做DDNS服務(wù),這個(gè)一般路由器上也都有的, TPLINK 水星什么的也都有預(yù)設(shè)這個(gè)功能. 所以也不是什么難點(diǎn).
最后一步就是用autojs去喚醒了, 代碼也很簡(jiǎn)單, 此代碼是從google上隨便搜的, 然后改成autojs可用的. 但是貌似在局域網(wǎng)直接用IP來(lái)喚醒,好像無(wú)效, 然后我也沒(méi)怎么研究, 本來(lái)內(nèi)網(wǎng)喚醒,不是本次研究的重點(diǎn). 所以怎么遠(yuǎn)程喚醒,才是重點(diǎn)...
那么重點(diǎn)來(lái)了, 上代碼:
var domainName = "ddns.XXXX.online";
//mac地址是冒號(hào)為分隔符的格式,不要用其他格式
var macAddress = "00:8d:5c:88:94:b5";
var wol = new wakeUpOnline();
var res = wol.wakeUp(domainName, macAddress, 9);
log(res);
function wakeUpOnline() {
importClass(java.net.InetAddress);
importClass(java.net.DatagramPacket);
importClass(java.net.DatagramSocket);
importClass(java.lang.Integer);
importClass(java.lang.System);
/**
* 使用autojs在外網(wǎng)遠(yuǎn)程打開(kāi)局域網(wǎng)內(nèi)的電腦 本方法僅用于外網(wǎng). 不適用于無(wú)線網(wǎng)卡
* @param {string} host 路由器的wan口iP或者域名
* @param {string} mac 被遠(yuǎn)程開(kāi)機(jī)電腦的網(wǎng)卡mac地址
* @param {int} port 開(kāi)機(jī)端口號(hào), 內(nèi)網(wǎng)為9號(hào)端口. 這里填你映射出去的端口號(hào)
* @returns
*/
this.wakeUp = function(host, mac, port) {
try {
let macBytes = getMacBytes(mac);
let bytes = util.java.array('byte', 6 + 16 * macBytes.length);
for (let i = 0; i < 6; i++) {
bytes[i] = 0xff - 256;
}
for (let i = 6; i < bytes.length; i += macBytes.length) {
System.arraycopy(macBytes, 0, bytes, i, macBytes.length);
}
let address = InetAddress.getByName(host);
let packet = new DatagramPacket(bytes, bytes.length, address, port);
let socket = new DatagramSocket();
socket.send(packet);
socket.close();
return "wol_package_sent_success";
} catch (e) {
console.log("錯(cuò)誤信息: ", e.message);
console.log("錯(cuò)誤發(fā)生在第%s行", e.lineNumber);
console.log("錯(cuò)誤文件", e.fileName);
return "wol_package_sent_fail";
}
}
function getMacBytes(mac) {
let bytes = util.java.array('byte', 6);;
let hex = mac.split(":");
if (hex.length != 6) {
throw "Invalid MAC address.";
}
try {
for (let i = 0; i < 6; i++) {
int = Integer.parseInt(hex[i], 16);
if (int > 127) {
int = int - 256;
}
bytes[i] = int;
}
} catch (e) {
console.log("錯(cuò)誤信息: ", e.message);
console.log("錯(cuò)誤發(fā)生在第%s行", e.lineNumber);
console.log("錯(cuò)誤文件", e.fileName);
throw "Invalid hex digit in MAC address.";
}
return bytes;
}
}
實(shí)現(xiàn)遠(yuǎn)程開(kāi)機(jī)的功能就這么簡(jiǎn)單. 可以自己再寫個(gè)UI界面來(lái)包裝一下.好了,這次的分享就這么多.
-
IP
+關(guān)注
關(guān)注
5文章
1715瀏覽量
149718 -
域名
+關(guān)注
關(guān)注
0文章
74瀏覽量
11322 -
端口
+關(guān)注
關(guān)注
4文章
983瀏覽量
32125
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論