孫 紅,俞衛(wèi)國
(1.上海理工大學,上海 200093;2.上?,F(xiàn)代光學系統(tǒng)重點實驗室,上海 200093)
隨著計算機網(wǎng)絡技術與通信技術的快速發(fā)展,人類已經(jīng)慢慢步入5G時代,移動設備和計算機網(wǎng)已經(jīng)成為日常生活中必不可少的工具。在此過程中,出現(xiàn)過大量基于安卓平臺的APP的開發(fā),為人類的便攜生活做出貢獻。5G通信屬于未來計算機通信和移動通信網(wǎng)絡發(fā)展的主要方向,具有十分廣闊的發(fā)展前景,目前已經(jīng)受到國內外的高度重視。主要發(fā)展表現(xiàn)為萬物互聯(lián),從4G時代發(fā)展開始,智能家居行業(yè)誕生,但是只停留于初級階段。因此4G技術與真正”萬物互聯(lián)”在技術上還存在較大的差距。但是5G到來以后,其極大的流量,符合萬物互聯(lián)的發(fā)展需求。在未來的發(fā)展中,會真正實現(xiàn)”萬物互聯(lián)”。5G通信網(wǎng)絡實際是在4G通信網(wǎng)絡基礎上發(fā)展而來的,是4G移動通信的進一步的發(fā)展與延伸[1]。
5G部署的時間是很漫長的,在部署的過程中,需要設計一款能夠獲取5G信號參數(shù)的安卓APP。流程如下:首先需要找一塊部署的場地,建立多個信號基站,信號基站用來發(fā)射5G信號[2],測試人員需要獲取這些無線參數(shù)并進行分析,從而分析信號的強弱,以及能否進行實際應用。測試人員會布置不同的點,將手機部署在這些點上,手機上安裝應用軟件,用來實際獲取信號參數(shù)。
上述說的應用軟件[3],所需要實現(xiàn)的功能如下:
(1)在無人值守的條件下,獲取基站的信號參數(shù)。
(2)在無人值守的條件下,每秒可以以數(shù)據(jù)的形式上報基站的信號參數(shù)。
(3)在無人值守的情況下,可以上報手機的狀態(tài),例如:當手機電量不足時,可以上報信息給測試人員。
(4)服務器可以下達一些簡單的指令,比如重啟指令,手機可以進行重啟。
(5)軟件可以以圖表的樣式來顯示各個參數(shù)的數(shù)值,特別是表格滑動的實現(xiàn),使測試人員能更加直觀地觀察參數(shù),提高用戶體驗。
(6)需要實現(xiàn)自動登錄,由于布置的點(手機)比較多,電腦下達重啟命令之后,再次進入軟件,需要自動連接,可人性化設計。
本系統(tǒng)獲取的參數(shù)是5G信號參數(shù),手機內部有5G(SIM)卡,當信號傳達手機時,要獲取的參數(shù)有IMSI、IP、PCI、RSRP、SINR、CQI等[3],在實際應用中,這幾個參數(shù)在3G/4G的時代就可以獲取到,參考SDK里面的SingnalStrength類,查看源碼,發(fā)現(xiàn)SingnalStrength類里面有需要的參數(shù),但是SingnalStrength類沒有需要的get方法??梢酝ㄟ^toString()方法將這些參數(shù)解析出來。
在實際開發(fā)中,使用反射的方式來獲取,核心代碼如下:
Method method2=signalStrength.getClass().getMethod("getLteLevel");
level=method2.invoke(signalStrength);
最終獲取到各個信號參數(shù)值。
首先了解傳輸層兩種協(xié)議:TCP協(xié)議與UDP協(xié)議[4]。
TCP協(xié)議是一種可靠傳輸協(xié)議,在TCP傳輸數(shù)據(jù)之前,會用三次握手來建立連接,而且在數(shù)據(jù)傳遞時,有確認、窗口、重傳、擁塞控制機制,在數(shù)據(jù)傳輸完之后,會斷開連接來節(jié)約資源,缺點是比較慢,耗時,容易被攻擊。
UDP協(xié)議是一種不可靠傳輸協(xié)議。沒有TCP的握手、確認、窗口、重傳、擁塞控制等機制,UDP是一個無狀態(tài)的傳輸協(xié)議,所以它在傳遞數(shù)據(jù)時非???。
在上報信號的過程中,選用的是UDP協(xié)議。因為上報只需要把收據(jù)上報過去就行了,程序不用關心服務器有沒有收到,要求數(shù)據(jù)傳輸快速。鏈路選擇的是內部傳輸網(wǎng)絡而不是5G移動傳輸網(wǎng)絡。也就是選擇WIFI鏈路傳輸。
要想傳輸數(shù)據(jù),假如使用藍牙協(xié)議傳輸,就要用到基于Bluetooth協(xié)議的Socket,這里使用的是基于TCP協(xié)議的Socket[5]。
Socket實際上是一種通信接口,基于不同的協(xié)議,有各種Socket,比如基于TCP和UDP協(xié)議的Socket,Android中使用是java的Socket模型。應用程序可以通過”套接字”向網(wǎng)絡發(fā)送請求或者應答網(wǎng)絡請求,這時把Socket分成了兩部分,一部分是服務器端Socket,這個Socket主要用來接收來自網(wǎng)絡的請求,它一直監(jiān)聽在某一個端口上。一部分是客戶端Socket,這個Socket向網(wǎng)絡發(fā)送請求。
通信流程如下:應用程序通過套接字也就是Socket可以選擇這兩種協(xié)議中的一種,可以選擇UDP發(fā)送數(shù)據(jù),也可以選擇TCP發(fā)送數(shù)據(jù)。數(shù)據(jù)發(fā)送出去通過“通信信道”也就是IP網(wǎng)絡的基礎網(wǎng)絡,來到服務器端(接收端),就可以接收到數(shù)據(jù)。發(fā)送數(shù)據(jù)的時候用UDP,接收數(shù)據(jù)的時候也要用UDP,發(fā)送數(shù)據(jù)的時候用TCP協(xié)議,接收的時候也要用TCP協(xié)議,在發(fā)送的時候指定接收端的IP地址和端口號就可以了,而數(shù)據(jù)包或者數(shù)據(jù)是如何發(fā)送的,框架已經(jīng)幫我們封裝好了[6]。流程如圖1所示。
圖1 Socket通信流程
下達指令首先也要選擇鏈路,這次需要做的是給某個手機下達一些指令,比如重啟,需要的是可靠傳輸鏈路,所以整個過程是建立在TCP鏈路。指令采用的是基于Linux指令,比如重啟:-rebot,因為安卓的底層是基于Linux的,將指令包裝在數(shù)據(jù)包里面,然后通過程序解析出指令,再通過Java語言進行執(zhí)行[7]。
Android ViewPager適配器PageAdapter的使用。PageAdapter是一個抽象類,直接繼承于Object,導入包android.support.v4.view.PageAdapter即可使用。要使用PageAdapter首先要繼承PageAdapter類,至少要實現(xiàn)以下方法:getcount(),isViewFromObject(),destroyItem()。然后把設計好的表格進行封裝,放到一個list里面,再進行傳送。
Android界面布局方式[8],包括框架布局、線性布局、表格布局、網(wǎng)格布局、相對布局和絕對布局??蚣懿季?FrameLayout)是最簡單的界面布局,是用來存放一個元素的空白空間,而且子元素的位置不能夠指定,只能放在空白空間的左上角,如果有多個子元素,后放置的子元素將遮擋前面放置的子元素,這種布局使用最少。線性布局(Linearyout)是一種重要的界面布局,也是經(jīng)常使用到的一種界面布局,在現(xiàn)行布局中,所有的子元素都按照垂直或者水平的順序在界面上排列。相對布局(lativeLayout)是一種非常靈活的布局方式,能夠通過指定界面元素與其他元素的相對位置關系,確定界面的相對位置關系,確定界面中所有元素的布局位置。特點是最大程度上保證各種屏幕尺寸的手機正確顯示界面布局。剩下的布局參考文獻[9]。
該文設計的布局系統(tǒng)有個res資源文件,用來存放一些布局文件,布局文件都是以XML文件的形式存放在代碼中。各個組件有著嚴格的層次關系,最后利用Fragement元素來控制布局文件的加載。
該文設計的Android無人值守信號參數(shù)上報軟件APP可以分為6個大模塊[10],如圖2所示。
圖2 系統(tǒng)模塊
各個模塊應用的場景[11]如下所述:
新用戶第一個安裝APP,打開APP后,會彈出一個詢問窗口是否選擇自動連接還是手動連接,一般都會選擇自動連接。自動連接會保存你上次輸入的IP以及端口,在無人的情況下會自動連接。
開啟后,APP就會通過5G移動鏈路獲取基站的參數(shù)信息,無線參數(shù)獲取模塊應用在此場景。在軟件實現(xiàn)的代碼中,會有一個定時器,每秒將獲取的參數(shù)以JSON格式上傳到數(shù)據(jù)庫,在執(zhí)行一段時間后,當手機電量過低時,會上報手機低電量的信息給工作人員。無線參數(shù)上報模塊就應用在此。在整個運行過程中,會顯示程序運行狀態(tài),當輸入的IP地址不對時,連不上服務器時,會在顯示框中輸出:”輸入的IP地址格式不對,請輸入正確的IP地址格式”,提醒輸入人員輸入正確的IP格式。程序運行狀態(tài)顯示模塊顯示應用在此。
當有需求需要手機重啟時,而每個手機點分布的地方不一樣,工作人員很難去尋找每個手機點,然后去重啟手機,此時指令模塊就可以應用在此情境中。通信鏈路選擇模塊,上傳信號參數(shù)鏈路和指令下達的鏈路是不同的鏈路,上傳鏈路選擇的是UDP鏈路[12],實行快速上傳,指令下達鏈路選擇的是TCP鏈路,需要用到點對點端到端安全鏈路。程序流程如圖3所示。
圖3 系統(tǒng)流程
當用戶第一次安裝此軟件時,會出現(xiàn)彈窗,是否自動連接,當用戶選擇自動連接時,進入此頁面,然后輸入HostIp、HostPort、UE ID、ProjectID這四個參數(shù),在XML布局文件中,這些是androidinput Type=“text”,根據(jù)屬性來設置輸入框的輸入限制。HostIp是服務器IP地址,port是端口號,這兩個參數(shù)需要封裝成UDP數(shù)據(jù)包,服務器端應用根據(jù)這兩個參數(shù)來獲取UDP數(shù)據(jù)包。IEID默認為1.1.1.1,用作以后預留的一個參數(shù),ProjectID也是預留的參數(shù),用作以后其他的項目預留的端口。這些參數(shù)都有自己的格式,用戶必須按照規(guī)定的格式進行輸入,如圖4所示。界面設置內容如上所述[13]。
圖4 上報模塊界面
數(shù)據(jù)參數(shù)上報后端設計,首先需要判斷網(wǎng)絡連接狀態(tài),默認是移動5G網(wǎng)絡,也就是默認UDP傳輸方式,軟件被打開時就可以直接上報數(shù)據(jù)至服務器端。第一步:先編寫一個定時器,導入安卓定時器包new timer();設置定時器的時間,以及執(zhí)行的UDP方法。這里的時間設計為1 s上報一次,上報的過程是單獨開啟一個線程,UDP線程專門用于UDP編程,UDP分為UDP服務器端(UdpClient)和UDP客戶端(UdpReceive),在服務器沒有發(fā)送指令時,UDP服務器端處于阻塞狀態(tài),只有UDP客戶端上報指令的功能在運作,在java中,實現(xiàn)UDP編程就是套接字(Socket)編程[14]。核心代碼如下:
DatagramSocket ds=new
DatagramSocket();//拿到套接字對象
byte[] bytes=str.getBytes();//定義一個空間用于接受字符
DatagramPacket dp=new
DatagramPacket(bytes,bytes.length,address,6666);//將數(shù)據(jù)封裝成數(shù)據(jù)包,傳遞5個固定參數(shù)。
接下來就是解決可能拋出的異常,以及怎么協(xié)調好前端的控件顯示。
信號參數(shù)顯示模塊的實現(xiàn)是為了更人性化,為了工作人員能夠很方便地看出信號參數(shù)強弱。最上面的是RSRP、SINR、DownThrough這三個參數(shù)動態(tài)的顯示,以折線圖的形態(tài)顯示。引入jar包hellocharts.jar,一個開源的jar包庫,用作Android圖表的編程。然后根據(jù)jar的源碼,動態(tài)編寫折線圖,利用圖片滑動的原理,引入ViewAdapter容器。將編好的折線圖xml文件放入容器中,最終實現(xiàn)滑動效果。如圖5所示,頂部的折線圖顯示的是RSRP和SINR兩個參數(shù)的情況。
圖5 顯示模塊
接下來的IMSI、IP、PCI等顯示使用了布局文件中的相對布局,將布局先設置好,再利用SDK里面的SingnalStrength()來獲取相關參數(shù),然后再來設置相應的數(shù)值到表格中,人性化地顯示再界面中,如圖5所示。
以搭建Android平臺為開發(fā)環(huán)境,使用了Android Studio為開發(fā)工具,運用計算機通信和計算機應用與技術,實現(xiàn)了5G信號參數(shù)獲取上報APP,完成了在無人監(jiān)聽的情況下,手機端能自動獲取5G信號參數(shù)、信號參數(shù)自動上報到計算機服務器端、動態(tài)顯示參數(shù)的任務。后續(xù)可以根據(jù)使用情況來進行改進,擴展更多的功能,服務于5G通信的部署[15]。