摘 要:通過移動運營商接入互聯(lián)網(wǎng)的嵌入式設(shè)備,往往不具備固定的公網(wǎng)IP地址,從而也就無法通過telnet等技術(shù)手段實現(xiàn)對嵌入式設(shè)備的簡便操控。為了對這些嵌入式設(shè)備實現(xiàn)類似telnet的簡便操控,本文提出了一種基于移動互聯(lián)網(wǎng)linux系統(tǒng)遠(yuǎn)程控制臺的技術(shù)方案。本方案的基本思想是,將本地PC作為服務(wù)器,監(jiān)聽遠(yuǎn)程linux終端的socket連接請求;遠(yuǎn)程linux終端作為客戶端,通過移動互聯(lián)網(wǎng)與本地PC建立socket連接,并將標(biāo)準(zhǔn)輸入輸出句柄重定向到這個socket連接;建立連接后,通過本地服務(wù)器的程序處理,實現(xiàn)對遠(yuǎn)程終端的指令下發(fā)和遠(yuǎn)程終端執(zhí)行結(jié)果的展示。
關(guān)鍵詞:移動互聯(lián)網(wǎng);遠(yuǎn)程控制臺;socket;描述符重定向
1 前言
在所有的類UNIX操作系統(tǒng)應(yīng)用中,控制臺(console)技術(shù)都是其最重要的技術(shù)之一,它為人機交互提供了最基本的渠道,通過這個渠道,用戶可以方便地運行系統(tǒng)中集成的各種系統(tǒng)程序和應(yīng)用程序,并實時監(jiān)控程序的運行狀態(tài)和輸出調(diào)試信息。當(dāng)然,作為類UNIX的Linux操作系統(tǒng)也不例外。
在基于嵌入式Linux操作系統(tǒng)的終端設(shè)備中,現(xiàn)有的控制臺展示方法主要有兩種:
⑴通過終端設(shè)備的一個RS-232串口與PC機的串口對接,借助PC機的上位機串口監(jiān)視軟件(如windows下的超級終端、ubuntu下的minicom等)實現(xiàn)與終端設(shè)備的交互;
⑵如果終端設(shè)備具備以太網(wǎng)接口,則PC機通過telnet等遠(yuǎn)程登錄的方法實現(xiàn)與終端設(shè)備的交互。
但上述方法,在基于移動互聯(lián)網(wǎng)的嵌入式linux終端設(shè)備中使用時,分別具有以下弊端:
⑴作為具備移動互聯(lián)功能的嵌入式終端在應(yīng)用中往往不在室內(nèi)場合,甚至要隨著被嵌入主體的移動而移動,這使得在某些情況下需要與終端實現(xiàn)交互時(比如運行一些特定的調(diào)試軟件等),如果采用上述方法⑴,工作人員需要帶著筆記本電腦和串口線到設(shè)備現(xiàn)場進(jìn)行對接,相當(dāng)不方便,也影響工作效率;甚至在某些特殊環(huán)境中,工作人員根本無法到達(dá)設(shè)備使用現(xiàn)場而無法與設(shè)備進(jìn)行交互;
⑵對于方法2,則要求終端設(shè)備具備固定IP地址,然后把終端設(shè)備當(dāng)作服務(wù)器通過telnet遠(yuǎn)程登錄。但這種對終端需具備固定IP地址的要求不現(xiàn)實:首先,如使用GPRS等移動互聯(lián)網(wǎng)的終端,由于移動運營商出于成本和IP資源的限制,分配給終端的IP一般都不是固定的公網(wǎng)IP地址,而是經(jīng)過NAT技術(shù)為終端提供移動運營商的內(nèi)網(wǎng)IP地址;其次,假設(shè)電信運營商同意為終端分配固定IP,其使用費必定很高,最終導(dǎo)致終端產(chǎn)品的使用成本提高。
基于以上分析,本文提出了一種新的基于移動互聯(lián)網(wǎng)linux設(shè)備的遠(yuǎn)程控制臺的技術(shù)方案,以規(guī)避前述的弊端和難點。本方案的基本思想是,將本地PC作為服務(wù)器,監(jiān)聽遠(yuǎn)程linux終端的socket連接請求;遠(yuǎn)程linux終端作為客戶端,通過移動互聯(lián)網(wǎng)與本地PC建立socket連接,并將標(biāo)準(zhǔn)輸入輸出句柄重定向到這個socket連接;建立連接后,經(jīng)過本地服務(wù)器的程序處理,實現(xiàn)對遠(yuǎn)程終端的指令下發(fā)和遠(yuǎn)程終端執(zhí)行結(jié)果的展示。
2 重要概念
⑴套接字:在linux中的網(wǎng)絡(luò)編程是通過套接字(即socket)接口來進(jìn)行的,它是linux世界中網(wǎng)絡(luò)通信的基本操作單元。套接字是一種特殊的I/O接口,它也是一種文件描述符。socket是一種常用的進(jìn)程之間通信機制,通過它不僅能實現(xiàn)本地機器上的進(jìn)程之間的通信,而且通過網(wǎng)絡(luò)能夠在不同機器上的進(jìn)程之間進(jìn)行通信。由于socket具備文件描述符的屬性,所以在應(yīng)用中它也適用linux文件描述符重定向技術(shù)。
⑵linux重定向:linux中的重定向通常是指在shell環(huán)境下的文件重定向,但本文主要涉及的是文件描述符的重定向,該技術(shù)主要通過dup和dup2兩個系統(tǒng)調(diào)用來實現(xiàn)(函數(shù)原型如下)。dup在調(diào)用時傳給該函數(shù)一個既有的描述符,它就會返回一個新的描述符,這個新的描述符是傳給它的描述符的拷貝,這個調(diào)用在本方案中主要用以對系統(tǒng)的標(biāo)準(zhǔn)文件描述符(標(biāo)準(zhǔn)輸入輸出、標(biāo)準(zhǔn)錯誤輸出)進(jìn)行備份。而dup2則是將一個新的文件描述符覆蓋到指定的文件描述符上,它在本方案中的主要作用是將標(biāo)準(zhǔn)文件描述符用socket連接的文件描述符來替代。
#include
int dup( int filedes );
int dup2( int filedes, int filedes2 );
3 具體實現(xiàn)
為便于理解,這里先對包含遠(yuǎn)程控制臺的整個系統(tǒng)環(huán)境及相關(guān)名詞做一個簡單闡述?;谝苿踊ヂ?lián)網(wǎng)的linux系統(tǒng)遠(yuǎn)程控制臺實現(xiàn)的方案中,整個系統(tǒng)在物理架構(gòu)上主要包含服務(wù)器、基于移動互聯(lián)網(wǎng)的linux終端設(shè)備和移動互聯(lián)網(wǎng)絡(luò)三部分,其中服務(wù)器主要包含實時運行的“業(yè)務(wù)服務(wù)器”和一個可操作的“socket工具”,前者通過網(wǎng)絡(luò)連接與終端設(shè)備交互,主要用于業(yè)務(wù)數(shù)據(jù)的交互和處理,后者可以是專門實現(xiàn)的程序工具,或者使用現(xiàn)有socket調(diào)試工具(本文在驗證時使用通用的socket_tool工具),該工具通過網(wǎng)絡(luò)接口實現(xiàn)與終端設(shè)備交互,而終端設(shè)備則包含實現(xiàn)業(yè)務(wù)功能的“終端業(yè)務(wù)程序”和實現(xiàn)遠(yuǎn)程控制臺功能的“遠(yuǎn)程控制臺組件”,“遠(yuǎn)程控制臺組件”通過移動互聯(lián)網(wǎng)絡(luò)接口與服務(wù)器端的“socket工具”實現(xiàn)交互。
以下是本方案的具體實現(xiàn)過程闡述:
⑴設(shè)備終端正常運行時,終端只運行其中的“終端業(yè)務(wù)程序”,通過這個程序,終端實現(xiàn)本地除遠(yuǎn)程控制臺功能之外的所有業(yè)務(wù)處理,同時與服務(wù)器端的“業(yè)務(wù)服務(wù)器”程序進(jìn)行業(yè)務(wù)交互;
⑵當(dāng)工作人員需要通過遠(yuǎn)程控制臺與終端交互時,則首先運行服務(wù)器端的“socket工具”并建立socket監(jiān)聽服務(wù)器,然后通過“業(yè)務(wù)服務(wù)器”下發(fā)“啟動終端遠(yuǎn)程控制臺組件”的指令;
⑶當(dāng)設(shè)備終端的“終端業(yè)務(wù)程序”接收到“啟動終端遠(yuǎn)程控制臺組件”的指令時,運行終端設(shè)備中的“遠(yuǎn)程控制臺組件”;
⑷對于終端的“遠(yuǎn)程控制臺組件”,這個組件是實現(xiàn)了以下功能的一個可執(zhí)行程序。
1)通過程序運行時帶入的參數(shù),接受“終端業(yè)務(wù)程序”發(fā)送過來的服務(wù)端“socket工具”的IP地址和端口信息;2)通過socket網(wǎng)絡(luò)編程技術(shù),將設(shè)備終端作為客戶端接入到服務(wù)器端的“socket工具”所建立的監(jiān)聽服務(wù)器上,建立連接,獲得連接句柄handle1;3)備份保存Linux系統(tǒng)的標(biāo)準(zhǔn)輸入stdin、標(biāo)準(zhǔn)輸出stdout和標(biāo)準(zhǔn)錯誤輸出stderr,分別為stdin_back、 stdout_back和stderr_back;4)通過linux重定向技術(shù),將stdin、stdout和stderr都重定向到handle1上;5)不斷讀取stdin輸入數(shù)據(jù),分析數(shù)據(jù),將數(shù)據(jù)中回車符之前的數(shù)據(jù)作為系統(tǒng)命令在Linux系統(tǒng)上執(zhí)行;由于已將stdout重定向到handle1上,此時執(zhí)行命令后的輸出信息將自動送到handle1,也就送到了服務(wù)器上的“socket工具”;6)如果接收數(shù)據(jù)為組件退出命令,則關(guān)閉handle1,將stdin,stdout和stderr分別重定向回stdin_back、stdout_back和stderr_back,然后退出程序。
⑸通過以上步驟,終端的“遠(yuǎn)程控制臺組件”啟動后,服務(wù)器端的“socket工具”的輸入、輸出界面即可作為一個控制臺的交互界面,實現(xiàn)了虛擬的遠(yuǎn)程控制臺功能。
通過本文所述的基于移動互聯(lián)網(wǎng)的linux系統(tǒng)遠(yuǎn)程控制臺的實現(xiàn),為基于linux嵌入式設(shè)備的遠(yuǎn)程控制和調(diào)試提供了一種相對較簡便的途徑。同時,本方案還具有以下優(yōu)點:
⑴規(guī)避了工作人員要到嵌入式終端的使用現(xiàn)場才能用控制臺的麻煩,提高了工作效率,降低了終端設(shè)備的維護(hù)成本;
⑵規(guī)避了移動終端無固定IP而無法telnet登錄的弊端;
⑶服務(wù)器隨時可與終端進(jìn)行交互,這樣當(dāng)終端運行出問題時,可直接使用真實的終端工作環(huán)境及時進(jìn)行調(diào)試;
⑷本文所述遠(yuǎn)程控制臺的實現(xiàn),不受終端設(shè)備的串口資源限制,在串口資源緊張的設(shè)備中特別適用;
⑸終端上遠(yuǎn)程控制臺組件是一個比較獨立的程序,不會因為終端的業(yè)務(wù)程序不同而區(qū)別,具有通用性,有利于在不同嵌入式產(chǎn)品之間的移植;
⑹運行遠(yuǎn)程控制臺,不影響終端設(shè)備本身的實際控制臺的使用,實現(xiàn)本地調(diào)試和遠(yuǎn)程調(diào)試同時進(jìn)行;
⑺通過修改服務(wù)器上對“socket工具”的服務(wù)器端IP設(shè)置,即可實現(xiàn)將服務(wù)器端的遠(yuǎn)程控制臺相關(guān)的處理分離到另一臺服務(wù)器PC上,這樣既保證了正常運轉(zhuǎn)的“業(yè)務(wù)服務(wù)器”安全,還能靈活轉(zhuǎn)移遠(yuǎn)程控制臺服務(wù)器端的工作環(huán)境;
[參考文獻(xiàn)]
[1]W.Richard Stevens,Stephen A.Rago,著.尤晉元,張亞英,戚正偉,譯. UNIX環(huán)境高級編程(第2版).人民郵電出版社.
[2]華清遠(yuǎn)見嵌入式學(xué)院,趙蒼明,穆煜,編著.嵌入式Linux應(yīng)用開發(fā)教程.人民郵電出版社.