林 徐,張繼山
(安徽三聯(lián)學(xué)院,安徽 合肥 230601)
互聯(lián)網(wǎng)上遠(yuǎn)程終端喚醒技術(shù)與實(shí)現(xiàn)
林 徐,張繼山
(安徽三聯(lián)學(xué)院,安徽 合肥 230601)
本文介紹了遠(yuǎn)程喚醒的原理,并在局域網(wǎng)遠(yuǎn)程喚醒的基礎(chǔ)上,將遠(yuǎn)程喚醒延伸至互聯(lián)網(wǎng)環(huán)境下。通過對路由器和PC機(jī)的設(shè)置,實(shí)現(xiàn)包括手機(jī)在內(nèi)的終端遠(yuǎn)程喚醒PC。
遠(yuǎn)程喚醒;魔術(shù)包;MAC地址;動(dòng)態(tài)域名解析;路由
隨著信息化應(yīng)用的深入,個(gè)人往往需要將個(gè)人文件在互聯(lián)網(wǎng)上他所使用的相互處于異地的終端上互傳。因此,需要在互聯(lián)網(wǎng)環(huán)境下遠(yuǎn)程開啟冷機(jī)狀態(tài)下的遠(yuǎn)程終端。
遠(yuǎn)程開機(jī)首先需要網(wǎng)卡支持遠(yuǎn)程喚醒(Wake On Lan WOL),遠(yuǎn)程喚醒的原理是在計(jì)算機(jī)處于關(guān)閉狀態(tài)時(shí),處于激活狀態(tài)的網(wǎng)卡接收來自網(wǎng)絡(luò)的符合特定的格式的數(shù)據(jù)包,如果收到數(shù)據(jù)包,就啟動(dòng)機(jī)器。遠(yuǎn)程喚醒的數(shù)據(jù)包是具有特定格式的UDP數(shù)據(jù)包,被稱為“魔術(shù)包”(Magic Packet)。Magic Packet 是AMD公司的網(wǎng)絡(luò)喚醒技術(shù)。數(shù)據(jù)報(bào)文的載荷部分共有102個(gè)字節(jié),每六個(gè)字節(jié)為一組,共分成了17個(gè)組。其中,第1組為固定的“全F”即0xFFFFFFFFFFFF,第2-17組中的每個(gè)組都是遠(yuǎn)程機(jī)器網(wǎng)卡的MAC地址。
1.1 遠(yuǎn)程喚醒前的準(zhǔn)備
遠(yuǎn)程喚醒的前提是,需要被喚醒的PC機(jī)已經(jīng)作了以下的設(shè)置:
在CMOS中,設(shè)置“Wake On Lan”和“Wake On PCI Card”項(xiàng)的值為“Enable”;
(2)在網(wǎng)卡的屬性設(shè)置中,保證“魔術(shù)封包喚醒”的值是“開啟”;
(3)在電源管理里,勾選“只允許幻數(shù)據(jù)包喚醒計(jì)算機(jī)”。
1.2 使用UDP協(xié)議發(fā)送數(shù)據(jù)包
準(zhǔn)備完成后,就可以向終端發(fā)送“魔術(shù)包”了。發(fā)送“魔術(shù)包”的方案有多種,目前,使用較多的是利用現(xiàn)成的網(wǎng)絡(luò)喚醒軟件(例如,AMD公司的Magic Packet)來發(fā)送此網(wǎng)絡(luò)喚醒數(shù)據(jù)包。根據(jù)實(shí)際需要,也可以自己編程實(shí)現(xiàn)這一功能。本文采用C#實(shí)現(xiàn)這一功能,關(guān)鍵代碼如下:
/// <param name="mac">MAC地址字符數(shù)組</param>public static void Wake (byte[] mac){UdpClient clnt= new UdpClient();clnt.Connect(IPAddress.Broadcast, 7);
byte[] pkt = new byte[17 * 6];
for (int i = 0; i < 6; i++) pkt[i] = 0xFF;
for (int i = 1; i <= 16; i++)for (int j = 0; j < 6; j++)pkt[i * 6 + j] = mac[j];
int rslt = clnt.Send(pkt, pkt.Length);}
由以上代碼是在局域網(wǎng)同網(wǎng)段發(fā)送數(shù)據(jù)包,這個(gè)方法可以擴(kuò)展到廣域網(wǎng)。
在廣域網(wǎng)中,需要被喚醒的終端往往是一臺(tái)PC,這臺(tái)PC通常被放置在一個(gè)子網(wǎng)內(nèi),因此,“魔術(shù)包”需要跨越層層路由,才能最終到達(dá)這臺(tái)PC。然而,目前大多數(shù)的PC的IP地址都是動(dòng)態(tài)的,這就意味著在廣域網(wǎng)中無法用IP地址定位PC,因此需要在喚醒終端之前做一些準(zhǔn)備。
2.1 開啟DDNS客戶端
DDNS(動(dòng)態(tài)域名解析服務(wù)),被稱為動(dòng)態(tài)域名解析服務(wù),是將動(dòng)態(tài)IP地址映射到一個(gè)固定的域名解析服務(wù)上。每次連接網(wǎng)絡(luò)的時(shí)候,客戶端程序就會(huì)把該主機(jī)的動(dòng)態(tài)IP地址傳送給位于服務(wù)商主機(jī)上的服務(wù)器程序,服務(wù)器程序負(fù)責(zé)提供DNS服務(wù)并實(shí)現(xiàn)動(dòng)態(tài)域名解析。
利用DDNS的功能,可以在需要被喚醒的終端的網(wǎng)絡(luò)出口網(wǎng)關(guān)上,或者在其內(nèi)網(wǎng)的某個(gè)主機(jī)上開啟DDNS客戶端,這樣可以保證在廣域網(wǎng)中使用域名定位到需要喚醒的終端。
2.2 設(shè)置路由器的端口映射
端口映射就是將連通外網(wǎng)主機(jī)的一個(gè)網(wǎng)絡(luò)端口映射到內(nèi)網(wǎng)中一臺(tái)提供相應(yīng)服務(wù)的機(jī)器。通過在路由器上設(shè)置相應(yīng)的端口映射,可以保證發(fā)送的的“魔術(shù)包”經(jīng)過路由器后直達(dá)要被喚醒的終端。本文以思科路由器為例實(shí)現(xiàn)端口映射,關(guān)鍵配置命令如下:
ip nat inside source static tcp 192.168.0.100 7 202.99.111.2 7 extendable
如果使用的ADSL或動(dòng)態(tài)IP,可以將上述的公網(wǎng)IP用WAN口名代替,例如:
ip nat inside source static tcp 192.168.0.100 7 interface Dialer100 7 extendable
2.3 設(shè)置路由器ARP協(xié)議綁定
ARP協(xié)議(Address Resolve Protocol),被稱為地址解析協(xié)議,工作在第二層,即數(shù)據(jù)鏈路層,用于將IP地址轉(zhuǎn)換為網(wǎng)絡(luò)接口的硬件地址,即MAC地址。設(shè)置路由器的ARP綁定,可以在路由器動(dòng)態(tài)分配IP地址的時(shí)候,將一個(gè)固定的IP地址分配給已經(jīng)對應(yīng)了的MAC地址。這樣保證了從廣域網(wǎng)接收的“魔術(shù)包”能夠明確所要轉(zhuǎn)發(fā)的目的地。以思科路由器為例,設(shè)置ARP綁定的關(guān)鍵配置命令如下:
router(config)# arp 202.99.111.2 0014.2ac3.d4bb arpa
2.4 廣域網(wǎng)發(fā)送UDP包
由于發(fā)送端是處于廣域網(wǎng),所以在通過廣域網(wǎng),使用UDP協(xié)議發(fā)送“魔術(shù)包”之前,先用nslookup命令查詢到需要喚醒的終端所在網(wǎng)關(guān)此時(shí)的動(dòng)態(tài)域名所對應(yīng)的IP地址,然后可以利用現(xiàn)成的第三方軟件(例如,AMD公司的Magic Packet)來發(fā)送“魔術(shù)包”,也可以對上文代碼稍加修改,實(shí)現(xiàn)廣域網(wǎng)的遠(yuǎn)程喚醒,關(guān)鍵代碼如下:
IPHostEntry host = Dns.GetHostByName(web); //web是動(dòng)態(tài)域名字符串
UdpClient clnt = new UdpClient();
clnt.Connect(host.AddressList[0];, 7);//此處改廣播發(fā)送為定向發(fā)送
上述代碼完成的是先通過動(dòng)態(tài)域名獲取到IP地址,然后定向發(fā)送“魔術(shù)包”。
通過手機(jī)遠(yuǎn)程喚醒終端,實(shí)際是借助手機(jī)向需要喚醒的終端發(fā)送“魔術(shù)包”。發(fā)送“魔術(shù)包”之前的準(zhǔn)備工作以及網(wǎng)絡(luò)設(shè)置與上文所述相同??梢越柚谌降腁PP完成遠(yuǎn)程喚醒的任務(wù),目前使用較多的有PC-Auto-Waker以及Wake-On-LAN Android版。也可以自己編程實(shí)現(xiàn)這一功能,關(guān)鍵代碼如下:
byte[] mac = getMacBytes(Str_mac);
byte[] Bytes = new byte[6 + 16 * mac.length];
f
or (int i = 0; i < 6; i++) Bytes[i] = (byte) 0xff;
for (int i = 6; i < bytes.length; i += mac.length) System.arraycopy(mac, 0, bytes, i,mac.length);
InetAddress add = InetAddress.getByName(ipStr);
DatagramPacket pkt = new DatagramPacket(bytes, bytes.length, add, 7);
DatagramSocket skt = new DatagramSocket();
skt.send(pkt);
skt.close();
目前絕大多數(shù)的網(wǎng)卡都支持網(wǎng)絡(luò)喚醒功能,只要在網(wǎng)絡(luò)環(huán)境下,選擇合適的發(fā)送端向需要喚醒的終端發(fā)送“魔術(shù)包”,就可以激活網(wǎng)卡的這一功能,進(jìn)而達(dá)到遠(yuǎn)程開機(jī)的目的。
[1]張立成. 基于IP單播的遠(yuǎn)程喚醒研究及實(shí)現(xiàn)[J].軟件導(dǎo)刊,2010(3):108-109.
[2]彭建業(yè).基于NET的計(jì)算機(jī)遠(yuǎn)程喚醒技術(shù)及其實(shí)現(xiàn)[J].電腦編程技巧與維護(hù),2012(14):86-87.
[3]王鵬沖.網(wǎng)絡(luò)喚醒原理及其實(shí)現(xiàn)[J].茂名學(xué)院學(xué)報(bào),2009,19(3):59-61.
Research and implementation of Internet remote wake-up
Lin Xu ZHANG Ji-shan
(Anhui Institute of Computer Engineering,Hefei Anhui 230601)
This paper introduces the principle of Remote Wake-Up, and based on remote wake on LAN, extends the remote wakeup to the Internet environment.
Remote Wake-Up; Magic Packets; MAC address; DDNS;Route
TP334.1
A
10.3969/j.issn.1672-7304.2016.05.025
1672–7304(2016)05–0051–02
2014年安徽省高等教育振興計(jì)劃教學(xué)改革與質(zhì)量提升計(jì)劃重大教學(xué)改革研究項(xiàng)目“基于校企合作的網(wǎng)絡(luò)工程專業(yè)人才培養(yǎng)模式探索與實(shí)踐”(項(xiàng)目編號:2014zdjy144)。
(責(zé)任編輯:廖建勇)
林徐(1972-),男,安徽合肥人,講師,工程師,研究方向:軟件工程。