孫仲揚
摘要:越來越多的設備使用linux作為操作系統,為了實現對設備的遠程監控與診斷,一般都將設備接入互聯網(或者局域網),再由一臺電腦接入該網絡進行遠程登錄,達到數據交換,傳輸的目的。
如今,安卓手機已經相當普及,由于操作手機的便捷性,人們操作電腦的時間越來越少,使用手機越來越多,本設計基于安卓系統平臺,實現對linux系統設備進行遠程監控,及時發現設備問題,便于設備使用人員及管理人員使用,并且對數據進行存儲,并且有利于之后對數據進行進一步分析挖掘。
關鍵詞:遠程登錄;遠程監控;linux系統設備
中圖分類號:TP277?? 文獻標識碼:A?? 文章編號:1672-9129(2020)16-0038-02
方案設計與實現:
1 ssh 遠程登錄
1.1 ssh簡介。SSH[1] (Secure Shell,安全協議外殼)是由 IETF ( Internet Engineering Task Force,國際 互聯網工程任務組)制定的一族協議,提供安全遠程登錄、安全文件傳輸等網絡服務功 能,還可以為其它應用層協議提供安全“通道”。SSH 對服務端和客戶端提供相互的 身份驗證功能,并且保證傳輸數據的加密性和完整性。使用 SSH 還有一個額外的優點:它會壓縮傳輸的數據,縮短傳輸所需的時間。SSH 協議的軟件程序由客戶端和服務器兩部分組成,以網絡應用層和傳輸層為基礎 [2]。
1.2 ssh驗證。從客戶端來看,SSH提供兩種級別的安全驗證。
第一種級別(基于口令的安全驗證)
只要你知道自己帳號和口令,就可以登錄到遠程主機。所有傳輸的數據都會被加密,但是不能保證你正在連接的服務器就是你想連接的服務器[3]??赡軙袆e的服務器在冒充真正的服務器,也就是受到“中間人”這種方式的攻擊。
第二種級別(基于密匙的安全驗證)
需要依靠密匙,也就是你必須為自己創建一對密匙,并把公用密匙放在需要訪問的服務器上。如果你要連接到SSH服務器上,客戶端軟件就會向服務器發出請求,請求用你的密匙進行安全驗證。服務器收到請求之后,先在該服務器上你的主目錄下尋找你的公用密匙,然后把它和你發送過來的公用密匙進行比較。如果兩個密匙一致,服務器就用公用密匙加密“質詢”(challenge)并把它發送給客戶端軟件??蛻舳塑浖盏健百|詢”之后就可以用你的私人密匙解密再把它發送給服務器。
用這種方式,你必須知道自己密匙的口令。但是,與第一種級別相比,第二種級別不需要在網絡上傳送口令。
綜上所述,選用安全的ssh協議來登錄linux設備。驗證方式由于驗證的數控機床只支持賬號和口令的方式,所以選用第一種方式。
1.3 ssh庫選用。在本項目中引入jsch庫,jsch 是一個基于ssh的java庫,可以支持安卓設備用于ssh登錄以及文件傳輸,shell腳本操作,由于android基于java語言進行開發,所以可以以導入jar包的方式導入jsch庫。
1.4異步任務庫選用。
此外,還有一個很重要的庫。Rx(ReactiveX,響應式編程)是一種事件驅動的基于異步數據流的編程模式,整個數據流就像一條河流,它可以被觀測(監聽),過濾,操控或者與其他數據流合并為一條新的數據流。而RxJava是.Net Rx在JVM上的實現。RxJava可以應用于大部分基于JVM的語言,如Scala,Groovy等。
Rxjava引入,用于異步任務操作,并且可以在主線程子線程中切換,因為連接,傳輸文件屬于耗時操作,不能夠在主線程中進行,rxjava還帶有錯誤處理機制,在連接錯誤的時候可以進行處理。
RxJava特點
·函數響應式編程
·異步
·事件驅動的
·基于觀察者模式
·專門的出錯處理,當使用RxJava出現錯誤時,它不會直接拋出異常,而是會執行OnError()方法;
·并發,可以很容易實現多線程
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,檢測對方ip是否能聯通
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;
//根據返回值判斷是否連接成功
if (!res) {
callbackContext.error("connectfalse");
} else {
subscriber.onNext("Device connected");
//建立連接完成,可讀取數據
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) {
//連接成功,接下來的工作在這里進行
}
});
}
2 scp讀取文件
scp是secure copy的縮寫,是用來進行遠程文件拷貝的。數據傳輸使用 ssh,并且和ssh 使用相同的認證方式,提供相同的安全保證。
scp命令是 SSH 中最方便有用的命令了,試想,在兩臺服務器之間直接傳送文件,僅僅用 scp 一個命令就完全解決了。你可以在一臺服務器上以 root 身份運行 #scp servername:/home/ftp/pub/file1 ./ 這樣就把另一臺服務器上的文件 /home/ftp/pub/file1 直接傳到本機器的當前目錄下,當然你也可以用 #scp /tmp/file2 servername:/boot 把本機上的文件 /tmp/file2 送到另一臺機器的 /boot 目錄下。而且整個傳送過程仍然是用 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 安卓設備讀取xml文件并解析
可擴展標記語言,標準通用標記語言的子集,是一種用于標記電子文件使其具有結構性的標記語言。
在電子計算機中,標記指計算機所能理解的信息符號,通過此種標記,計算機之間可以處理包含各種的信息比如文章等。它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。它非常適合萬維網傳輸,提供統一的方法來描述和交換獨立于應用程序或供應商的結構化數據。是Internet環境中跨平臺的、依賴于內容的技術,也是當今處理分布式結構信息的有效工具。早在1998年,W3C就發布了XML1.0規范,使用它來簡化Internet的文檔信息傳輸。
Pull解析XML:
Xml pull提供了開始元素和結束元素,當某個元素開始時,我們可以調用parser.nextText從XML文檔中提取所有字符數據。當解釋到一個文檔結束時,自動生成EndDocument
常用接口類:XmlPullParser, XmlSreializer, XmlPullParserFactory
特點是代碼實現較為簡單,非常適合移動設備,安卓系統內置pull解析器,而且安卓系統內部默認使用pull來解析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 將解析出來的信息存入安卓本地sqlite數據庫
SQLite是一款輕型的數據庫,是遵守ACID的關系型數據庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域項目。它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源的世界著名數據庫管理系統來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生于2000年5月。
安卓系統中使用的就是sqlite數據庫。在本系統中應用對sqlite進行封裝后的Ormlite框架。
OrmLite是一個數據庫操作輔助的開源框架,底層還是Sqlite。O-R-M是Object relational mapping(對象關系映射)的縮寫,即業務實體對象與關系型數據庫之間的映射。對象中的屬性與數據庫表中的字段一一對應。OrmLite直接操作業務對象,隱藏了數據庫操作的細節,使我們不用通過sql語句與數據庫打交道。OrmLite通過Java注解的方式與數據庫建立映射關系。
建立javabean文件,用來映射數據表中數據,建立ormlitedatabasehelper建立java與sqlite數據庫之間的關系,將解析出來的xml數據存入數據庫中。
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 讀取數據庫信息并顯示在手機屏幕上屏幕
通過Ormlitedatabasehelper讀取數據庫中數據,寫入手機屏幕相應的布局當中。
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 驗證
將一臺數控機床(Linux操作系統)接入局域網,設置好登錄名,密碼,以及ip地址。將手機連入該網絡,打開app進行連接,讀取機床參數,并顯示在界面上
7 總結優缺點
優點,可以在任何安卓端獲取設備狀態信息,對設備進行監控,當設備故障報警時,可以及時進行處理,大大提高了設備運行效率。
缺點,實時性有待提高,只能在用戶想要讀取數據的時候去讀取數據,如果要持續對數據進行讀取要建立更長時間的連接,可以應用安卓系統的service組件進行后臺活動,持續讀取設備信息。
在網絡條件不好的情況下會讀取失敗,應該建立更完善的容錯機制。
參考文獻:
[1]BARRETT D J, SILVERMANN R E. SSH, The Secure Shell[M]. Sebastopol, CA:O'Reilly, 2001.
[2]史倩竹. SSH 協議分析與研究.第 15 屆全國計算機新科技與計算機繼續教育學術會議,秦皇 島,2004.
[3]Petersen R Linux技術大全I-M].北京:機械工業出版 社,2002:155~156