引言
android 一词的英文本义是机器人,它是google 公司于2007 年11 月宣布的基于linux 平台的开源手机操作系统,它是一套真正意义上的开放性的移动设备综合平台,该平台由操作系统、中间件、用户界面和应用软件组成[1].android 最大的特点在于其开放性,它宣布开放源代码,手机制造商、手机芯片厂商、移动运营商以及开发者都可以对源码进行学习和修改并进行开发。蓝牙是智能手机的一项重要功能,它也被整合到了android 平台上,作为android 的一个移动网络通信模块。android 系统提供了蓝牙开发的api,供开发者调用。
本文实现了基于android 平台通过蓝牙进行通信的一对多聊天系统。选择蓝牙作为通信手段是由于蓝牙连接简单,避免了网络连接对于网络及信号强度的依赖性。android手机使用蓝牙模块分别作为客户端和服务器端,实现好友或陌生人间即时的一对多聊天系统。
1 android 应用程序组成
一般来说,android 应用程序主要由下列四部分组成,分别是:
activity(活动对象)、broadcast receiver(广播接收器)、service(服务)、content provider(内容提供者)。然而,并不是所有的程序都需要全部部分,可以由上面的一个或几个来组建。使用某些组件构建android 应用程序时,需要在androidmanifest.xml 文件里进行声明。
activity
在android 应用程序中,activity 一般代表手机的一屏,即用户可见的一个界面。android应用程序的运行过程就是在不同的activity 之间切换的过程。每个activity 都有自己的视图和事件对应。大多数应用程序都有多个activity.
broadcast receiver
broadcast receiver 是一个接受广播消息并响应的组件。广播消息可以由系统产生,例如时区发生变化,电池电量发生变化等。同时也可以由其他应用程序产生,对于这两种广播,在broadcast receiver 里都可以设置相应的过滤规则来进行接收。
service
service 是具有长生命周期并且没有用户界面的代码。通过startservice(intent service)可以来启动一个service,通过context.bindservice()可以绑定一个service.当已经连接上了一个服务,就可以使用服务提供的外部接口来和服务通讯了。
content provider
content provider 就是一个类,作为应用程序之间唯一的共享数据的途径,它实现了一个标准的方法集合,其他应用程序可以使用这些方法在应用程序之间共享数据。
本文系统主要用到了activity 和service.
2 蓝牙
蓝牙这个名称来自于第十世纪的一位丹麦国王 harald blatand , blatand在英文里的意思可以被解释为bluetooth(蓝牙)。现取其统一的含义,用来命名意在统一无线局域网通讯标准的蓝牙技术。它是一种支持设备短距离通信(一般10m 内)的无线电技术。能在包括移动电话、pda、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用蓝牙技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与internet之间的通信,从而使数据传输变得更加迅速高效,为无线通信拓宽道路。蓝牙采用分散式网络结构以及快跳频和短包技术,支持点对点及点对多点通信,工作在全球通用的2.4ghz ism(即工业、科学、医学)频段,其数据速率为1mbps,采用时分双工传输方案实现全双工传输。
3 android 上蓝牙模块
android 平台支持蓝牙协议栈,允许一台设备与另外的蓝牙设备无线交换数据。android提供了相关的蓝牙api来支持蓝牙方面应用的开发。
使用蓝牙进行通信有主要的四个步骤:
设置蓝牙、搜索蓝牙设备、连接设备、传输数据。
本文用到的主要类有:
bluetoothadapter:表示本地的蓝牙适配器。bluetoothadapter是所有蓝牙操作的入口点。
用它可以搜索其他的蓝牙设备、查询已配对的设备、用已知的mac地址来实例化一个蓝牙设备(bluetoothdevice),建立一个bluetoothserversocket来监听其他设备的连接请求。
bluetoothdevice:表示一个蓝牙设备。用它来向服务器端设备发起连接请求(通过bluetoothsocket),或者查询设备信息,如名字、地址、配对状态等。
bluetoothserversocket :表示一个开启的server socket 来监听连接请求(类似于tcpserversocket)。为了连接两个蓝牙设备,其中一台设备必须用这个类创建server socket.
当远端设备向这个设备发出了连接请求,bluetoothserversocket接收请求后会返回一个已连接的bluetoothsocketbluetoothsocket:表示蓝牙套接字(类似于tcp socket),它是应用程序与其他蓝牙设备通过输入输出流交换数据的连接点。
要在 android应用程序中使用蓝牙特性,必须声明两个蓝牙权限:
4 聊天系统设计
蓝牙通信,类似于tcp通信,都需要有服务器端和客户端。在本聊天系统中,一部android手机作为蓝牙服务器端,另外两台android手机作为蓝牙客户端。客户端分别连到服务器,给服务器发送并接收文本消息;服务器也能够给客户端发送并接收文本消息。
前面已经提到,本系统主要用到的android 系统组件为activity 和service.在android的设计中,每个activity 都是一个独立的进程,每个service 也是一个独立的进程,而activity要与service 进行通信,就是跨进程的通信,这时就需要使用binder 机制了[4].android 对binder 机制进行了抽象,定义了ibinder 接口。在上层,其具体实现是由aidl(androidinterface definition language,即android 接口描述语言)来完成的。
本文在蓝牙通信服务器端和客户端都使用了mvc 模式,采用分层的结构,具体分为表示层、控制层、业务和数据交换层,对应mvc 设计模式中的view、controller 和model[5].
软件总体架构如下图所示。
图1 蓝牙聊天系统服务器架构
图2 蓝牙聊天系统客户端架构
下面对各层做简要介绍:
表示层向用户展示模型的状态,在本软件中是以每个activity 的对应的页面、对话框和一些显示控件所展现,一般以layout 文件夹下的布局文件承载。主要用来输入和显示文本消息、打开蓝牙可被查找功能及搜索蓝牙设备。
控制层负责表示层和业务层的流程控制,一方面将表示层的调用发到业务层请求处理;另一方面将业务层的处理结果反应到表示层进行界面上的显示。
业务和数据交互层,封装了蓝牙数据传输的核心操作,如创建socket 创建通道、传输数据、处理输入输出流等。它可以通过控制层被调用,也可以在收到连接请求或文本消息时把结果返回给控制层,进而返回到表示层。
采用 mvc 设计模式,对整个代码进行了分层,使程序结构更加清晰、代码更加健壮,提高了模块化程度,各模块职责明确,高效率的处理相应事件。
5 聊天系统实现
5.1 服务器端
参考图1 蓝牙聊天系统服务器架构:
① 在 btserver 里,有两个listview,分别用来显示从不同客户端接收到的文本消息,两个输入框,用来输入文本消息发给客户端。这是程序的界面构成。
② 启动程序后,到startdiscoverablemodeactivity 界面,提示用户设置本设备可被查找.
可被查找的含义是其他蓝牙设备在搜索的情况下,能获得服务器端的存在及其相关信息。为了隐私保护及安全,蓝牙设备默认是关闭状态,需要在用户的同意下才打开并设置为可被查找。
③ 服务器进行初始化操作,包括构造onmessagereceivedlistener 用以监听消息到来事件;启动connectionservice,由它来处理发送和接收文本消息。
④ 在 connectionservice 里,创建connectionwaiter 线程,在connectionwaiter 线程里创建bluetoothserversocket 监听连接请求。
⑤ 在有连接请求的时候,connectionservice 里的connectionwaiter 线程接收请求,创建bluetoothsocket,并把远端请求的地址address 和这个bluetoothsocket 放到hashmap 里,用来管理socket.接着启动btstreamwatcher 线程,用来监听这个socket 里的输入输出流,把此线程也放到另外一个hashmap里。接着创建新的connectionwaiter 线程,继续监听新的连接请求。也就是说,创建多个通信线程,并放到hashmap 里进行管理,以完成蓝牙的一对多通信。
⑥ btstreamwatcher 用来处理输入输出流。在btserver 界面上进行输入的时候,根据目的地址(address)的不同,从hashmap 里取出对应的socket,由它来向此address 发送消息。接收到文本消息时,回调onmessagereceivedlistener 来通知上层,在界面上显示。
5.2 客户端
参考图 2 蓝牙聊天系统客户端架构:
① 在 btclient 里,有一个listview 和一个输入框,分别用来显示接收到的服务器端发送的消息和输入文本消息向服务器端发送。这是程序的界面构成。
② 启动程序后,客户端进行初始化操作,包括构造 onmessagereceivedlistener、onconnectionservicereadylistener;启动connectionservice.
③ 准备工作完毕后,回调onconnectionservicereadylistener,启动serverlistactivity 界面,显示搜索到的蓝牙设备, 点击服务器端所在设备地址,通过connection 调用connectionservice 的connect()函数,来向服务器发起连接请求。
④ 等服务器接受连接请求后,返回bluetoothsocket,把服务器端地址address 和这个bluetoothsocket 放到hashmap 里,用来管理socket.接着启动btstreamwatcher 线程,用来监听这个socket 里的输入输出流,把此线程也放到另外一个hashmap 里。
⑤ btstreamwatcher 用来处理输入输出流。在btclient 界面上进行输入的时候,根据服务器地址,从hashmap 里取出对应的socket,由它来向此服务器发送消息。接收到文本消息时,回调onmessagereceivedlistener 来通知上层,在界面上显示。
⑥ 启动第二个客户端,进行同样操作。
这样,本系统就完成了基于蓝牙的一对二多人聊天。
6 聊天系统效果图
软件完成后的效果图如下所示:
服务器手机型号:htc g12.
客户端手机型号:右设备:天语w606;左设备:htc g13.
服务器端:
图3 蓝牙聊天系统服务器界面
客户端:
图4 蓝牙聊天系统客户端界面
7 后续计划
蓝牙最多支持一对七的通信,但由于蓝牙开发必须在真机上进行,受到设备限制,本系统只实现了一对二的聊天,但很容易扩展到一对三、一对更多。在此基础上,通过服务器把收到的客户端信息转发给所有其他的客户端,能够实现群组通信。本系统目前也只是实现了文本消息的传输,后续计划准备实现图片、语音、视频等多媒体文件的一对多蓝牙传输。
8 结论
本文以mvc模式架构设计了蓝牙通信的服务器端和客户端,并对各层作了简要介绍,详细实现了服务器端和客户端的模块,给出了运行效果图,最后对本系统的后续计划进行了说明。
三菱fx系列plc梯形图编程实例
机械师F57拆解,惊人的内部结构
国产超级跑车-前途K50:搭载两台电动机,最大续航里程将超过300km!新车有望于明年上市
此次博通收购高通事件中,谁才是最后的赢家
可视可觉公司获融资 欲打造中国文博行业首家VR影院
一对多聊天系统的实现方案
linux里eventfd的原理及应用
情人节送男生什么礼物好,情人节送礼清单
PoE供电选择哪种网线最合适?PoE以太网供电的两种方法
EK与技嘉合作推出一款专为技嘉主板设计的水冷头
电流探头无法消磁是什么原因?
电雷管测试仪的指标_电雷管测试仪的测试元件的接入
不掩对智能家电野心 三星发布智能灯泡
自动驾驶使用的毫米波雷达
互联网风口变向 美团港交所吹响上市号角
5G兵临城下,各地基站建设如火如荼进行中
边缘计算标准件计划征集第二批测试产品
怎样利用物联网为物流企业如何降本增效
基于 XP® 的 SLA 电池充电器
微信正式推出可实现全语音交互的车载版