基于Android平台的无线局域网通信APP设计与实现
2018-07-27王霄翔
王霄翔
(南京市第十三中学,江苏南京,210000)
0 引言
随着智能移动终端设备极大范围的普及,手机应用软件(APP)正掀起互联网式的浪潮,完善原始系统的不足与个性化的缺失。APP将获取到的数据信息直观呈现,用户可以更加便捷地参与到各个领域,实现对其他设备的交互控制。Android系统,作为手机应用软件的主流系统之一,以Linux为基础为当前流行的各种移动终端设备提供了开源开发平台。Android系统已经是目前使用最为广泛的智能手机操作系统之一,获得了大量手机生产商和智能终端应用开发商的追捧[1]。在硬件方面,使用Android系统的手机厂商可获谷歌(Google)强大的技术支撑。软件方面,程序开发人员可享受基于android平台的应用程序权限,并可上传软件以及其开源代码,提供给Android用户或开发者免费下载使用。
更重要的一点是,Android终端具备WiFi无线连接的功能,开发者可以在系统所提供的WiFi模块功能上进一步开发,本文在系统的设计上巧妙地应用了这一功能并进行拓展。在Android开发平台上可采用基于TCP/IP或UDP/IP协议的socket编程思想,实现手机客户终端通过WiFi无线网络与其他手机终端或Personal Computer(PC)的数据传输。为了方便用户更加快捷的实现即时通讯,本文设计一款基于Android平台的无线局域网通信APP。将传统的计算机网页平台转变为便携式手机应用,也进一步为实现真正的智能控制方式提供了可能。
基于飞鸽传书以及TCP/IP及UDP/IP协议,实现了两种方式的局域网通信。具体的创新的如下:
(1)通过无线局域网建立连接以及基于飞鸽传书协议,实现与Android手机移动终端之间的即时通讯,包括消息发送,文件传输等。
(2)M2M功能模块中,当多个用户终端同处在一个局域网下可通过APP自动寻找并连接周围的其他用户终端并连接。
(3)基于UDP/IP和TCP/IP协议以及UDP发送全网广播等方法,进一步实现局域网下PC端到Android客户端的socket通信。
1 无线局域网通信APP的设计与实现
■1.1 Android系统架构
Android是一个Google公司推出的以Linux为基础的开源操作系统是首个为移动终端打造的真正开放和完整的移动平台。Google重新设计了Java虚拟机,使得Android的Java应用更接近于底层系统,运行效率更高,并且在被监控的情况下运行,安全性也更高[4]。
Android操作系统采用了软件叠层的架构,自顶向下共包含四个层次:应用层,应用框架层,组件库和虚拟机层,Linux内核层[5],如图1所示。Android架构的层次划分合理,适合底层组件开发和移植同时应用层软件开发也方便,对于开发人员很有吸引力。
图1 Android系统架构
■1.2 软件详细功能设计与实现
1.2.1 AndroidSocket通信
Android与服务器有两种通信方式,分别为Http通信和Socket通信。在我们的日常开发中不论是响应网络的请求还是向网络中发送请求,通常都是用socket实现的[2]。Socket又名套接字,是一种抽象层,应用程序通过它来发送和接收数据。使用Socket可以将应用程序添加到网络中,与处于同一网络中的其他应用程序进行通信。简单来说,Socket提供了程序内部与外界通信的端口并为通信双方的提供了数据传输通道。
基于TCP/IP协议的Socket通信是在双方通过IP地址以及端口号,建立连接后可直接进行数据的传输,在连接时可实现信息的主动推送,不需要在传输时不停地由客户端发送请求给服务器。基于UDP/IP协议建立通信过程更为简单,提供的是无连接的数据报服务,只要对端都有彼此的IP地址及端口号即可,不需要确认是否建立连接了,不对数据报进行检查即可发送数据包。相比于TCP/IP协议的通信,UDP线程不安全且易丢失数据包。TCP/IP通信协议是比较偏向物理硬件底层的网络通信协议,并且是一种可跨多平台编程的计算机语言。
在基于TCP/IP协议的Socket编程模式中,Socket类是用来建立客户端程序,ServiceSocket类是用来建立服务器端程序。开发通信程序时,首先建立服务器端,本设计中电脑作为服务器端。建立一个基本的TCP/IP协议的无线局域网socket通信,具体实现步骤归纳如图2所示。
(1)服务器端创建:声明一个ServerSocket对象并制定端口号;
(2)调用ServerSocket的accept()方法,等待接受客户端所发送的连接请求。注意accept()方法在没有数据进行接收的处于堵塞状态,即程序不运行;
图2 基于TCP/IP协议的Socket通信原理
(3)客户端创建:一个Socket对象,指定服务器端的IP地址和端口号;
(4)客户端成功建立了与服务器的连接之后,双方即以进行数据通信;
(5)两端分别创建InputStream输入流跟Output Stream输出流对象用于之间发送数据。
1.2.2 Android手机移动终端间的即时通讯(M2M)
用户终端的即时通讯,是基于TCP/IP协议的socket通信。在同一局域网下,用户可通过APP发布的UDP全网广播,将自己的IP地址及端口号信息通知给周围的APP用户,通过自组建立socket通信子线程,实现消息的传递及文件传输,图3为其功能模块图。
图3 M2M功能模块图
(1)M2M的功能实现过程
实现Android客户端之间的即时通讯的根本是,通过同一局域网下端对端的建立起通信连接。客户端双方在建立即时通讯之前,由连接的发起方主动向接收方发起创建通信连接请求。通信双方采用的是飞鸽传书协议,它是基于TCP/IP协议设计的一种分支协议。
Android客户端之间的通信采用多线程[3]的方式。多线程实际是指实现多任务的一种方式。一个Java应用总是从main()方法开始运行,而这条默认的生产线被称为主线程。通常创建一个Android工程是,系统都会自动生成一个MainActivity.java的文件。在这个Activity里面如果之间将代码段写入到OnCreate()里面,并运行。那么这段代码就会在主线程里面进行执行。由于,在Android4.0以上版本中,规定在主线程中不能进行访问网络相关的操作,所以必须建立子线程处理局域网的通信过程。需要在OnCreate()方法里面加入如下的线程声明。
由于M2M的socket通信建立过程与P2M的socket建立过程类似,所以此处不再进行重复说明。由于文件的处理时间较长,如果将其放入主线程中处理,很可能造成这个程序卡死,所以设计时新建了文件传输[4]NetTcp FileSendThread与文件发送NetTcpFileReceiveThread两个子线程来处理。文件的传输都是通过TCP/IP协议进行的,所以根据对方的IP地址与之间规定的端口号(飞鸽传输协议默认port:2425)来新建一个socket,下面代码中指出了发送文件的核心代码。
(2)M2M功能模块的界面设计
M2M局域网通信,类似于被大家所熟知的手机QQ,由好友列表、聊天界面、文件浏览界面等构成。其中,好友列表界面是这个功能的主界面,包含两部分,头部跟好友列表。头部设计包括在线用户数等信息的显示。好友列表主要是采用Listview,然后为其添加一个UserListviewAdapter的适配器[6]。如图4第一个界面所示。好友列表可自动的搜索周围其他在线用户发送的广播,并由发起方自动组建与接收方的socket通信。
如图4所示,聊天界面的布局类似于微信,头部显示对方的基本信息,消息列表也是同样的有属于自己的Adapter适配器,不同之处在于,由于对方的消息跟自己发的消息都要呈现在列表当中,对方头像与消息偏左放置,自己的消息跟头像则偏右放置,所以需要设计两个不同的Adapter分别实现各自的样式。在最下方消息发送栏的最左边,有一个加号的按键,用户通过点击此加号弹出文件浏览页面,选定文件后进行传输。
图4 局域网M2M好友列表及聊天界面
选择文件列表中的某一项文件后,当前路径就会在界面中显示出来,此时发送按键会enabled。点击发送会想接收方提交发送文件请求,接收方检测到文件之后,就会弹出是否确认接收文件的对话框,对话框显示了文件的数量、发送者的IP地址、发送者的手机型号信息。相应的发送放的手机界面中会出现当前文件的发送进度信息,如图5的文件浏览与接收。
图5 局域网M2M文件浏览及发送进度与接收请求
1.2.3 电脑端与手机端通信(P2M)
P2M通信与M2M通信原理相一致。不同之处在于,电脑服务器端是通过Java代码实现的界面以及程序的编写,与Android的java代码编写有一些接口程序上的不同。服务器端可以自动的捕捉到用户端的连接与退出,以及信息发送等等。
图6 P2M局域网通信电脑端与手机端界面
图6中分别为Java服务器端界面与Android客户端界面。客户端输入服务器端在显示文本框中IP地址跟端口号,进行对服务器的连接。连接成功之前用户无法点击发送按键,成功连入之后发送按键使能,用户可以在发送框中输入消息与服务器进行socket通信。
2 软件测试与运行结果分析
测试设备:两部Android手机(android版本为4.0以上)、一台Win7电脑、一根USB连接线、WiFi等。
测试准备:①将其中一部Android手机通过USB线连入到电脑上。②打开电脑端的Eclipse软件,进入Eclipse平台的测试环境,USB将APP程序打包下载到手机测试终端并通过电脑上的LogCat以及控制台[7]监测到的终端运行信息进行如下的测试过程。
(1)点击进入M2M功能模块。
①正常进入后,查看好友列表界面上方是否正确显示当前在线用户数等信息。之后,打开另一部Android手机中的APP,同样进入M2M功能界面。此时,查看两部手机的在线人数是否更新为2人。
②如果列表用户数没有更新,则点击刷新按键,判断是否实现更新。
③点击其中某个好友,查看是否正常进入聊天界面。
④如果正常进入后,两部手机互相发送消息,进行通信功能测试。
⑤在聊天界面中,点击屏幕左下角的加号,查看是否成功跳转到文件浏览界面。
⑥选择某个文件,查看是否能够完成文件传输功能。
(2)完成局域网M2M功能测试后,点击进入P2M界面。
①输入电脑服务器显示文本框中的IP地址跟端口号,点击连接,查看电脑端是否出现P2M通信连接成功提示。
②成功建立连接后,手机与电脑端互相发送消息,进行通信功能的测试。
(3)完成局域网通信功能测试。
3 结论
本文实现了基于Android平台下无线局域网络通信APP的设计与开发。基于TCP/IP和UDP/IP协议实现了P2M与M2M两大局域网通信功能。
本文首先对研究内容的背景与现状做出了讨论,随后介绍了在技术开发与设计当中会用到了相关知识与技术。之后重点就APP的详细设计进行了分功能的描述,包括程序编写以及界面设计等。在最后,进行了系统的测试与结果分析,达到了最初的设计预期,并确保应用程序的可靠性与稳定性。主要的创新点在于:
当多个用户终端同处在一个局域网下可通过APP自动寻找并连接周围的其他用户终端,实现多方的消息传送或文件传输。基于UDP的全网广播及TCP/IP协议的局域网通信,不仅可以智能的实现用户之间自由通信,针对需要进行登录校园网等付费热点来说,还可以节省用户的部分流量费用。
通过WiFi无线网络与局域网建立连接以及基于飞鸽传书协议,实现与Android客户端之间的即时通讯,包括消息发送,文件传输等。
基于UDP/IP和TCP/IP协议以及UDP发送全网广播等方法,进一步实现局域网下PC端到Android客户端的socket通信。