孙 红,俞卫国
(1.上海理工大学,上海 200093;2.上海现代光学系统重点实验室,上海 200093)
随着计算机网络技术与通信技术的快速发展,人类已经慢慢步入5G时代,移动设备和计算机网已经成为日常生活中必不可少的工具。在此过程中,出现过大量基于安卓平台的APP的开发,为人类的便携生活做出贡献。5G通信属于未来计算机通信和移动通信网络发展的主要方向,具有十分广阔的发展前景,目前已经受到国内外的高度重视。主要发展表现为万物互联,从4G时代发展开始,智能家居行业诞生,但是只停留于初级阶段。因此4G技术与真正”万物互联”在技术上还存在较大的差距。但是5G到来以后,其极大的流量,符合万物互联的发展需求。在未来的发展中,会真正实现”万物互联”。5G通信网络实际是在4G通信网络基础上发展而来的,是4G移动通信的进一步的发展与延伸[1]。
5G部署的时间是很漫长的,在部署的过程中,需要设计一款能够获取5G信号参数的安卓APP。流程如下:首先需要找一块部署的场地,建立多个信号基站,信号基站用来发射5G信号[2],测试人员需要获取这些无线参数并进行分析,从而分析信号的强弱,以及能否进行实际应用。测试人员会布置不同的点,将手机部署在这些点上,手机上安装应用软件,用来实际获取信号参数。
上述说的应用软件[3],所需要实现的功能如下:
(1)在无人值守的条件下,获取基站的信号参数。
(2)在无人值守的条件下,每秒可以以数据的形式上报基站的信号参数。
(3)在无人值守的情况下,可以上报手机的状态,例如:当手机电量不足时,可以上报信息给测试人员。
(4)服务器可以下达一些简单的指令,比如重启指令,手机可以进行重启。
(5)软件可以以图表的样式来显示各个参数的数值,特别是表格滑动的实现,使测试人员能更加直观地观察参数,提高用户体验。
(6)需要实现自动登录,由于布置的点(手机)比较多,电脑下达重启命令之后,再次进入软件,需要自动连接,可人性化设计。
本系统获取的参数是5G信号参数,手机内部有5G(SIM)卡,当信号传达手机时,要获取的参数有IMSI、IP、PCI、RSRP、SINR、CQI等[3],在实际应用中,这几个参数在3G/4G的时代就可以获取到,参考SDK里面的SingnalStrength类,查看源码,发现SingnalStrength类里面有需要的参数,但是SingnalStrength类没有需要的get方法。可以通过toString()方法将这些参数解析出来。
在实际开发中,使用反射的方式来获取,核心代码如下:
Method method2=signalStrength.getClass().getMethod("getLteLevel");
level=method2.invoke(signalStrength);
最终获取到各个信号参数值。
首先了解传输层两种协议:TCP协议与UDP协议[4]。
TCP协议是一种可靠传输协议,在TCP传输数据之前,会用三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传输完之后,会断开连接来节约资源,缺点是比较慢,耗时,容易被攻击。
UDP协议是一种不可靠传输协议。没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。
在上报信号的过程中,选用的是UDP协议。因为上报只需要把收据上报过去就行了,程序不用关心服务器有没有收到,要求数据传输快速。链路选择的是内部传输网络而不是5G移动传输网络。也就是选择WIFI链路传输。
要想传输数据,假如使用蓝牙协议传输,就要用到基于Bluetooth协议的Socket,这里使用的是基于TCP协议的Socket[5]。
Socket实际上是一种通信接口,基于不同的协议,有各种Socket,比如基于TCP和UDP协议的Socket,Android中使用是java的Socket模型。应用程序可以通过”套接字”向网络发送请求或者应答网络请求,这时把Socket分成了两部分,一部分是服务器端Socket,这个Socket主要用来接收来自网络的请求,它一直监听在某一个端口上。一部分是客户端Socket,这个Socket向网络发送请求。
通信流程如下:应用程序通过套接字也就是Socket可以选择这两种协议中的一种,可以选择UDP发送数据,也可以选择TCP发送数据。数据发送出去通过“通信信道”也就是IP网络的基础网络,来到服务器端(接收端),就可以接收到数据。发送数据的时候用UDP,接收数据的时候也要用UDP,发送数据的时候用TCP协议,接收的时候也要用TCP协议,在发送的时候指定接收端的IP地址和端口号就可以了,而数据包或者数据是如何发送的,框架已经帮我们封装好了[6]。流程如图1所示。
图1 Socket通信流程
下达指令首先也要选择链路,这次需要做的是给某个手机下达一些指令,比如重启,需要的是可靠传输链路,所以整个过程是建立在TCP链路。指令采用的是基于Linux指令,比如重启:-rebot,因为安卓的底层是基于Linux的,将指令包装在数据包里面,然后通过程序解析出指令,再通过Java语言进行执行[7]。
Android ViewPager适配器PageAdapter的使用。PageAdapter是一个抽象类,直接继承于Object,导入包android.support.v4.view.PageAdapter即可使用。要使用PageAdapter首先要继承PageAdapter类,至少要实现以下方法:getcount(),isViewFromObject(),destroyItem()。然后把设计好的表格进行封装,放到一个list里面,再进行传送。
Android界面布局方式[8],包括框架布局、线性布局、表格布局、网格布局、相对布局和绝对布局。框架布局(FrameLayout)是最简单的界面布局,是用来存放一个元素的空白空间,而且子元素的位置不能够指定,只能放在空白空间的左上角,如果有多个子元素,后放置的子元素将遮挡前面放置的子元素,这种布局使用最少。线性布局(Linearyout)是一种重要的界面布局,也是经常使用到的一种界面布局,在现行布局中,所有的子元素都按照垂直或者水平的顺序在界面上排列。相对布局(lativeLayout)是一种非常灵活的布局方式,能够通过指定界面元素与其他元素的相对位置关系,确定界面的相对位置关系,确定界面中所有元素的布局位置。特点是最大程度上保证各种屏幕尺寸的手机正确显示界面布局。剩下的布局参考文献[9]。
该文设计的布局系统有个res资源文件,用来存放一些布局文件,布局文件都是以XML文件的形式存放在代码中。各个组件有着严格的层次关系,最后利用Fragement元素来控制布局文件的加载。
该文设计的Android无人值守信号参数上报软件APP可以分为6个大模块[10],如图2所示。
图2 系统模块
各个模块应用的场景[11]如下所述:
新用户第一个安装APP,打开APP后,会弹出一个询问窗口是否选择自动连接还是手动连接,一般都会选择自动连接。自动连接会保存你上次输入的IP以及端口,在无人的情况下会自动连接。
开启后,APP就会通过5G移动链路获取基站的参数信息,无线参数获取模块应用在此场景。在软件实现的代码中,会有一个定时器,每秒将获取的参数以JSON格式上传到数据库,在执行一段时间后,当手机电量过低时,会上报手机低电量的信息给工作人员。无线参数上报模块就应用在此。在整个运行过程中,会显示程序运行状态,当输入的IP地址不对时,连不上服务器时,会在显示框中输出:”输入的IP地址格式不对,请输入正确的IP地址格式”,提醒输入人员输入正确的IP格式。程序运行状态显示模块显示应用在此。
当有需求需要手机重启时,而每个手机点分布的地方不一样,工作人员很难去寻找每个手机点,然后去重启手机,此时指令模块就可以应用在此情境中。通信链路选择模块,上传信号参数链路和指令下达的链路是不同的链路,上传链路选择的是UDP链路[12],实行快速上传,指令下达链路选择的是TCP链路,需要用到点对点端到端安全链路。程序流程如图3所示。
图3 系统流程
当用户第一次安装此软件时,会出现弹窗,是否自动连接,当用户选择自动连接时,进入此页面,然后输入HostIp、HostPort、UE ID、ProjectID这四个参数,在XML布局文件中,这些是androidinput Type=“text”,根据属性来设置输入框的输入限制。HostIp是服务器IP地址,port是端口号,这两个参数需要封装成UDP数据包,服务器端应用根据这两个参数来获取UDP数据包。IEID默认为1.1.1.1,用作以后预留的一个参数,ProjectID也是预留的参数,用作以后其他的项目预留的端口。这些参数都有自己的格式,用户必须按照规定的格式进行输入,如图4所示。界面设置内容如上所述[13]。
图4 上报模块界面
数据参数上报后端设计,首先需要判断网络连接状态,默认是移动5G网络,也就是默认UDP传输方式,软件被打开时就可以直接上报数据至服务器端。第一步:先编写一个定时器,导入安卓定时器包new timer();设置定时器的时间,以及执行的UDP方法。这里的时间设计为1 s上报一次,上报的过程是单独开启一个线程,UDP线程专门用于UDP编程,UDP分为UDP服务器端(UdpClient)和UDP客户端(UdpReceive),在服务器没有发送指令时,UDP服务器端处于阻塞状态,只有UDP客户端上报指令的功能在运作,在java中,实现UDP编程就是套接字(Socket)编程[14]。核心代码如下:
DatagramSocket ds=new
DatagramSocket();//拿到套接字对象
byte[] bytes=str.getBytes();//定义一个空间用于接受字符
DatagramPacket dp=new
DatagramPacket(bytes,bytes.length,address,6666);//将数据封装成数据包,传递5个固定参数。
接下来就是解决可能抛出的异常,以及怎么协调好前端的控件显示。
信号参数显示模块的实现是为了更人性化,为了工作人员能够很方便地看出信号参数强弱。最上面的是RSRP、SINR、DownThrough这三个参数动态的显示,以折线图的形态显示。引入jar包hellocharts.jar,一个开源的jar包库,用作Android图表的编程。然后根据jar的源码,动态编写折线图,利用图片滑动的原理,引入ViewAdapter容器。将编好的折线图xml文件放入容器中,最终实现滑动效果。如图5所示,顶部的折线图显示的是RSRP和SINR两个参数的情况。
图5 显示模块
接下来的IMSI、IP、PCI等显示使用了布局文件中的相对布局,将布局先设置好,再利用SDK里面的SingnalStrength()来获取相关参数,然后再来设置相应的数值到表格中,人性化地显示再界面中,如图5所示。
以搭建Android平台为开发环境,使用了Android Studio为开发工具,运用计算机通信和计算机应用与技术,实现了5G信号参数获取上报APP,完成了在无人监听的情况下,手机端能自动获取5G信号参数、信号参数自动上报到计算机服务器端、动态显示参数的任务。后续可以根据使用情况来进行改进,扩展更多的功能,服务于5G通信的部署[15]。