孫仲揚(yáng)
摘要:越來(lái)越多的設(shè)備使用linux作為操作系統(tǒng),為了實(shí)現(xiàn)對(duì)設(shè)備的遠(yuǎn)程監(jiān)控與診斷,一般都將設(shè)備接入互聯(lián)網(wǎng)(或者局域網(wǎng)),再由一臺(tái)電腦接入該網(wǎng)絡(luò)進(jìn)行遠(yuǎn)程登錄,達(dá)到數(shù)據(jù)交換,傳輸?shù)哪康摹?/p>
如今,安卓手機(jī)已經(jīng)相當(dāng)普及,由于操作手機(jī)的便捷性,人們操作電腦的時(shí)間越來(lái)越少,使用手機(jī)越來(lái)越多,本設(shè)計(jì)基于安卓系統(tǒng)平臺(tái),實(shí)現(xiàn)對(duì)linux系統(tǒng)設(shè)備進(jìn)行遠(yuǎn)程監(jiān)控,及時(shí)發(fā)現(xiàn)設(shè)備問(wèn)題,便于設(shè)備使用人員及管理人員使用,并且對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ),并且有利于之后對(duì)數(shù)據(jù)進(jìn)行進(jìn)一步分析挖掘。
關(guān)鍵詞:遠(yuǎn)程登錄;遠(yuǎn)程監(jiān)控;linux系統(tǒng)設(shè)備
中圖分類號(hào):TP277?? 文獻(xiàn)標(biāo)識(shí)碼:A?? 文章編號(hào):1672-9129(2020)16-0038-02
方案設(shè)計(jì)與實(shí)現(xiàn):
1 ssh 遠(yuǎn)程登錄
1.1 ssh簡(jiǎn)介。SSH[1] (Secure Shell,安全協(xié)議外殼)是由 IETF ( Internet Engineering Task Force,國(guó)際 互聯(lián)網(wǎng)工程任務(wù)組)制定的一族協(xié)議,提供安全遠(yuǎn)程登錄、安全文件傳輸?shù)染W(wǎng)絡(luò)服務(wù)功 能,還可以為其它應(yīng)用層協(xié)議提供安全“通道”。SSH 對(duì)服務(wù)端和客戶端提供相互的 身份驗(yàn)證功能,并且保證傳輸數(shù)據(jù)的加密性和完整性。使用 SSH 還有一個(gè)額外的優(yōu)點(diǎn):它會(huì)壓縮傳輸?shù)臄?shù)據(jù),縮短傳輸所需的時(shí)間。SSH 協(xié)議的軟件程序由客戶端和服務(wù)器兩部分組成,以網(wǎng)絡(luò)應(yīng)用層和傳輸層為基礎(chǔ) [2]。
1.2 ssh驗(yàn)證。從客戶端來(lái)看,SSH提供兩種級(jí)別的安全驗(yàn)證。
第一種級(jí)別(基于口令的安全驗(yàn)證)
只要你知道自己帳號(hào)和口令,就可以登錄到遠(yuǎn)程主機(jī)。所有傳輸?shù)臄?shù)據(jù)都會(huì)被加密,但是不能保證你正在連接的服務(wù)器就是你想連接的服務(wù)器[3]。可能會(huì)有別的服務(wù)器在冒充真正的服務(wù)器,也就是受到“中間人”這種方式的攻擊。
第二種級(jí)別(基于密匙的安全驗(yàn)證)
需要依靠密匙,也就是你必須為自己創(chuàng)建一對(duì)密匙,并把公用密匙放在需要訪問(wèn)的服務(wù)器上。如果你要連接到SSH服務(wù)器上,客戶端軟件就會(huì)向服務(wù)器發(fā)出請(qǐng)求,請(qǐng)求用你的密匙進(jìn)行安全驗(yàn)證。服務(wù)器收到請(qǐng)求之后,先在該服務(wù)器上你的主目錄下尋找你的公用密匙,然后把它和你發(fā)送過(guò)來(lái)的公用密匙進(jìn)行比較。如果兩個(gè)密匙一致,服務(wù)器就用公用密匙加密“質(zhì)詢”(challenge)并把它發(fā)送給客戶端軟件??蛻舳塑浖盏健百|(zhì)詢”之后就可以用你的私人密匙解密再把它發(fā)送給服務(wù)器。
用這種方式,你必須知道自己密匙的口令。但是,與第一種級(jí)別相比,第二種級(jí)別不需要在網(wǎng)絡(luò)上傳送口令。
綜上所述,選用安全的ssh協(xié)議來(lái)登錄linux設(shè)備。驗(yàn)證方式由于驗(yàn)證的數(shù)控機(jī)床只支持賬號(hào)和口令的方式,所以選用第一種方式。
1.3 ssh庫(kù)選用。在本項(xiàng)目中引入jsch庫(kù),jsch 是一個(gè)基于ssh的java庫(kù),可以支持安卓設(shè)備用于ssh登錄以及文件傳輸,shell腳本操作,由于android基于java語(yǔ)言進(jìn)行開(kāi)發(fā),所以可以以導(dǎo)入jar包的方式導(dǎo)入jsch庫(kù)。
1.4異步任務(wù)庫(kù)選用。
此外,還有一個(gè)很重要的庫(kù)。Rx(ReactiveX,響應(yīng)式編程)是一種事件驅(qū)動(dòng)的基于異步數(shù)據(jù)流的編程模式,整個(gè)數(shù)據(jù)流就像一條河流,它可以被觀測(cè)(監(jiān)聽(tīng)),過(guò)濾,操控或者與其他數(shù)據(jù)流合并為一條新的數(shù)據(jù)流。而RxJava是.Net Rx在JVM上的實(shí)現(xiàn)。RxJava可以應(yīng)用于大部分基于JVM的語(yǔ)言,如Scala,Groovy等。
Rxjava引入,用于異步任務(wù)操作,并且可以在主線程子線程中切換,因?yàn)檫B接,傳輸文件屬于耗時(shí)操作,不能夠在主線程中進(jìn)行,rxjava還帶有錯(cuò)誤處理機(jī)制,在連接錯(cuò)誤的時(shí)候可以進(jìn)行處理。
RxJava特點(diǎn)
·函數(shù)響應(yīng)式編程
·異步
·事件驅(qū)動(dòng)的
·基于觀察者模式
·專門(mén)的出錯(cuò)處理,當(dāng)使用RxJava出現(xiàn)錯(cuò)誤時(shí),它不會(huì)直接拋出異常,而是會(huì)執(zhí)行OnError()方法;
·并發(fā),可以很容易實(shí)現(xiàn)多線程
1.5建立連接。
private void initPingCNCData(final String ip, final String password, final CallbackContext callbackContext){
Observable.create(new Observable.OnSubscribe
@Override
public void call(Subscriber<? super String> subscriber) {
//1.ping device,檢測(cè)對(duì)方ip是否能聯(lián)通
boolean res = AllUitls.ping(ip, 3);
//2.建立session連接
JSch jsch = new JSch();
try {
session = jsch.getSession(HOST, ip, 22);
session.setPassword(password);
session.connect();
int result = 0;
//根據(jù)返回值判斷是否連接成功
if (!res) {
callbackContext.error("connectfalse");
} else {
subscriber.onNext("Device connected");
//建立連接完成,可讀取數(shù)據(jù)
getFilesInfo (session);
subscriber.onCompleted();
}
} catch (JSchException e) {
e.printStackTrace();
}
}
}
}).subscribeOn(Schedulers.io())
.timeout(20, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber
@Override
public void onError(Throwable throwable) {
callbackContext.error("connectfalse");
}
@Override
public void onNext(String str) {
//連接成功,接下來(lái)的工作在這里進(jìn)行
}
});
}
2 scp讀取文件
scp是secure copy的縮寫(xiě),是用來(lái)進(jìn)行遠(yuǎn)程文件拷貝的。數(shù)據(jù)傳輸使用 ssh,并且和ssh 使用相同的認(rèn)證方式,提供相同的安全保證。
scp命令是 SSH 中最方便有用的命令了,試想,在兩臺(tái)服務(wù)器之間直接傳送文件,僅僅用 scp 一個(gè)命令就完全解決了。你可以在一臺(tái)服務(wù)器上以 root 身份運(yùn)行 #scp servername:/home/ftp/pub/file1 ./ 這樣就把另一臺(tái)服務(wù)器上的文件 /home/ftp/pub/file1 直接傳到本機(jī)器的當(dāng)前目錄下,當(dāng)然你也可以用 #scp /tmp/file2 servername:/boot 把本機(jī)上的文件 /tmp/file2 送到另一臺(tái)機(jī)器的 /boot 目錄下。而且整個(gè)傳送過(guò)程仍然是用 SSH 加密的
private int getFilesInfo(String fileFullPath, Session session) {
int res = -1;
String[] arg = new String[2];
arg[0] = fileFullPath;
arg[1] = cordova.getActivity().getFilesDir() + File.separator + temp;
int count = 3;
do {
res = ScpFrom.scpFrom(arg, session);
count--;
} while (res != 0 && count != 0);
return res;
}
3 安卓設(shè)備讀取xml文件并解析
可擴(kuò)展標(biāo)記語(yǔ)言,標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的子集,是一種用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語(yǔ)言。
在電子計(jì)算機(jī)中,標(biāo)記指計(jì)算機(jī)所能理解的信息符號(hào),通過(guò)此種標(biāo)記,計(jì)算機(jī)之間可以處理包含各種的信息比如文章等。它可以用來(lái)標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對(duì)自己的標(biāo)記語(yǔ)言進(jìn)行定義的源語(yǔ)言。它非常適合萬(wàn)維網(wǎng)傳輸,提供統(tǒng)一的方法來(lái)描述和交換獨(dú)立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)。是Internet環(huán)境中跨平臺(tái)的、依賴于內(nèi)容的技術(shù),也是當(dāng)今處理分布式結(jié)構(gòu)信息的有效工具。早在1998年,W3C就發(fā)布了XML1.0規(guī)范,使用它來(lái)簡(jiǎn)化Internet的文檔信息傳輸。
Pull解析XML:
Xml pull提供了開(kāi)始元素和結(jié)束元素,當(dāng)某個(gè)元素開(kāi)始時(shí),我們可以調(diào)用parser.nextText從XML文檔中提取所有字符數(shù)據(jù)。當(dāng)解釋到一個(gè)文檔結(jié)束時(shí),自動(dòng)生成EndDocument
常用接口類:XmlPullParser, XmlSreializer, XmlPullParserFactory
特點(diǎn)是代碼實(shí)現(xiàn)較為簡(jiǎn)單,非常適合移動(dòng)設(shè)備,安卓系統(tǒng)內(nèi)置pull解析器,而且安卓系統(tǒng)內(nèi)部默認(rèn)使用pull來(lái)解析xml文件
case XmlPullParser.START_TAG:
if (parser.getName().equals("Name")) {
String temp = parser.nextText();
if (temp.contains("SINUMERIK")) {
res += "{\\\\"name\\\\":\\\\"" + temp + "\\\\",";
}
} else if (parser.getName().equals("MLFB")) {
res += "\\\\"mlfb\\\\":\\\\"" + parser.nextText()+ "\\\\",";
}
else if (parser.getName().equals("SerialNo")) {
res += "\\\\"serialno\\\\":\\\\"" + parser.nextText()+ "\\\\",";
}
else if (parser.getName().equals("HW-ID")) {
res += "\\\\"hwid\\\\":\\\\"" + parser.nextText()+ "\\\\",";
finishFlag = false;
}
break;
case XmlPullParser.END_TAG:
break;
4 將解析出來(lái)的信息存入安卓本地sqlite數(shù)據(jù)庫(kù)
SQLite是一款輕型的數(shù)據(jù)庫(kù),是遵守ACID的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它包含在一個(gè)相對(duì)小的C庫(kù)中。它是D.RichardHipp建立的公有領(lǐng)域項(xiàng)目。它的設(shè)計(jì)目標(biāo)是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用資源非常的低,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時(shí)能夠跟很多程序語(yǔ)言相結(jié)合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開(kāi)源的世界著名數(shù)據(jù)庫(kù)管理系統(tǒng)來(lái)講,它的處理速度比他們都快。SQLite第一個(gè)Alpha版本誕生于2000年5月。
安卓系統(tǒng)中使用的就是sqlite數(shù)據(jù)庫(kù)。在本系統(tǒng)中應(yīng)用對(duì)sqlite進(jìn)行封裝后的Ormlite框架。
OrmLite是一個(gè)數(shù)據(jù)庫(kù)操作輔助的開(kāi)源框架,底層還是Sqlite。O-R-M是Object relational mapping(對(duì)象關(guān)系映射)的縮寫(xiě),即業(yè)務(wù)實(shí)體對(duì)象與關(guān)系型數(shù)據(jù)庫(kù)之間的映射。對(duì)象中的屬性與數(shù)據(jù)庫(kù)表中的字段一一對(duì)應(yīng)。OrmLite直接操作業(yè)務(wù)對(duì)象,隱藏了數(shù)據(jù)庫(kù)操作的細(xì)節(jié),使我們不用通過(guò)sql語(yǔ)句與數(shù)據(jù)庫(kù)打交道。OrmLite通過(guò)Java注解的方式與數(shù)據(jù)庫(kù)建立映射關(guān)系。
建立javabean文件,用來(lái)映射數(shù)據(jù)表中數(shù)據(jù),建立ormlitedatabasehelper建立java與sqlite數(shù)據(jù)庫(kù)之間的關(guān)系,將解析出來(lái)的xml數(shù)據(jù)存入數(shù)據(jù)庫(kù)中。
public void upDateParam(String key, String value, String type, String user_name, String project_name, int paramnum) throws SQLException {
ParamAll paramAll = getParamEach(type, key, user_name, project_name, paramnum).get(0);
paramAll.setValue(value);
Dao dao = getDao(ParamAll.class);
dao.update(paramAll);
}
5 讀取數(shù)據(jù)庫(kù)信息并顯示在手機(jī)屏幕上屏幕
通過(guò)Ormlitedatabasehelper讀取數(shù)據(jù)庫(kù)中數(shù)據(jù),寫(xiě)入手機(jī)屏幕相應(yīng)的布局當(dāng)中。
textView1.setText(listview.get(0));
textView2.setText(listview.get(1));
textView3.setText(listview.get(2));
textView4.setText(listview.get(3));
textView5.setText(listview.get(4));
6 驗(yàn)證
將一臺(tái)數(shù)控機(jī)床(Linux操作系統(tǒng))接入局域網(wǎng),設(shè)置好登錄名,密碼,以及ip地址。將手機(jī)連入該網(wǎng)絡(luò),打開(kāi)app進(jìn)行連接,讀取機(jī)床參數(shù),并顯示在界面上
7 總結(jié)優(yōu)缺點(diǎn)
優(yōu)點(diǎn),可以在任何安卓端獲取設(shè)備狀態(tài)信息,對(duì)設(shè)備進(jìn)行監(jiān)控,當(dāng)設(shè)備故障報(bào)警時(shí),可以及時(shí)進(jìn)行處理,大大提高了設(shè)備運(yùn)行效率。
缺點(diǎn),實(shí)時(shí)性有待提高,只能在用戶想要讀取數(shù)據(jù)的時(shí)候去讀取數(shù)據(jù),如果要持續(xù)對(duì)數(shù)據(jù)進(jìn)行讀取要建立更長(zhǎng)時(shí)間的連接,可以應(yīng)用安卓系統(tǒng)的service組件進(jìn)行后臺(tái)活動(dòng),持續(xù)讀取設(shè)備信息。
在網(wǎng)絡(luò)條件不好的情況下會(huì)讀取失敗,應(yīng)該建立更完善的容錯(cuò)機(jī)制。
參考文獻(xiàn):
[1]BARRETT D J, SILVERMANN R E. SSH, The Secure Shell[M]. Sebastopol, CA:O'Reilly, 2001.
[2]史倩竹. SSH 協(xié)議分析與研究.第 15 屆全國(guó)計(jì)算機(jī)新科技與計(jì)算機(jī)繼續(xù)教育學(xué)術(shù)會(huì)議,秦皇 島,2004.
[3]Petersen R Linux技術(shù)大全I(xiàn)-M].北京:機(jī)械工業(yè)出版 社,2002:155~156