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