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