APP下载

一种基于Android蓝牙技术的点对点聊天工具

2021-02-26黄丽丽

电脑与电信 2021年11期
关键词:服务端调用列表

杨 敏 黄丽丽

(1.黔东南民族职业技术学院,贵州 凯里 556000;2.贵州电子信息职业技术学院,贵州 凯里 556000)

1 引言

在如今这个全球信息化的时代背景下,网络几乎遍布了世界的每一个角落,给人类的工作生活带来了翻天覆地的变革。聊天作为人类日常生活中一个最普通的行为,受信息化的影响首当其冲。近年来,网络上涌现出一大批功能强大的聊天工具,但这些工具大多都必须依托于因特网,在某些特定的环境下使用受限,因此开发一款无需外网的聊天工具具备一定的现实意义。

2 系统环境

2.1 Android系统

安卓(Android)是一种基于Linux 内核(不包含GNU 组件)的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑[1]。

2.2 蓝牙技术

蓝牙是一种支持设备短距离通信(一般是10m 之内)的无线电技术,可以在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。蓝牙的标准是IEEE802.15,工作在2.4GHz 频带,带宽为1Mb/s[2]。

3 设计与实现

3.1 工作流程

两台移动设备安装并打开蓝牙聊天工具,开启蓝牙功能,搜索附近可用的蓝牙设备,发现对方后一方发起配对请求,双方确认Pin码后完成配对,设备由可用设备列表转移至已配对的设备列表,表示可以连接该设备,然后其中一台移动设备作为服务端开启连接监听,另一台移动设备则作为客户端长按已配对的设备列表中对应的列表项向服务端发起连接请求,连接成功之后双方自动跳转至聊天界面,可互相发送文本信息。

3.2 界面设计

主界面(图1)参考华为P9手机蓝牙设置界面进行设计,采用自上而下的布局形式,界面元素依次为蓝牙开关,设备名称,已配对设备列表,可用设备列表,扫描设备按钮和开启监听按钮。

图1 应用主界面

聊天界面则跟微信聊天界面相似,顶部显示连接设备的蓝牙名称,白色背景文本为接收到的消息,灰色背景文本为本机发出的消息,详见图2,图3。

图2 设备1聊天界面

图3 设备2聊天界面

3.3 Android蓝牙开发

Android系统支持蓝牙通讯栈,拥有蓝牙模块的Android设备和其他的蓝牙设备之间可以实现无线数据传输。应用程序通过Android 蓝牙API 来调用蓝牙功能,实现P2P 或多端无线连接[3]。

一般来说,Android 应用程序之间实现蓝牙通讯需要执行以下四个步骤:

(1)打开蓝牙

(2)搜索附近可用设备

(3)设备间建立连接

(4)设备间数据交换

在Android系统中,所有的蓝牙API都位于android.bluetooth包下面,本次开发用到了以下四个常用类:

BluetoothAdapter:表示本地蓝牙适配器,是所有蓝牙交互的入口。应用程序通过BluetoothAdapter可以发现其他蓝牙设备,查询已配对的设备列表,使用一个已知的MAC地址来实例化一个蓝牙设备,以及创建一个蓝牙服务器套接字来处理设备间的通信[3]。

BluetoothDevice:表示一个远程蓝牙设备,应用程序使用该类可以查询关于设备名称、设备地址和连接状态等设备信息。

BluetoothSocket:表示一个蓝牙Socket 的接口(和TCP Socket 类似),它允许蓝牙设备之间通过输入输出流进行数据交换。

BluetoothServerSocket:表示一个开放的服务端socket,它监听其他蓝牙设备发起的连接请求。为了连接两台Android 设备,其中一台设备必须使用该类创建一个服务端socket,另一台设备则向该设备发起一个连接请求,若连接成功,BluetoothServerSocket 将会返回一个已连接的Bluetooth-Socket[3]。

3.4 技术难点

3.4.1 权限

根据SDK中的文档说明,Android应用想要使用蓝牙特性,只需要申请BLUETOOTH 和BLUETOOTH_ADM IN 两个权限即可保证蓝牙的正常的工作,包括蓝牙功能的开启和关闭、搜索可用设备、数据通信等,但出于用户信息安全方面的考虑,Android6.0 之后所有需要访问硬件唯一标识符的地方都需要申请位置权限(ACCESS_FINE_LOCATION 或者ACCESS_COARSE_LOCATION),蓝牙权限属于NORMAL级别,在清单文件中声明即可,但位置权限属于DANGEROUS 级别,除了在清单文件中声明之外,还需要在应用程序代码中进行动态申请,并跟踪用户对权限的确认结果[4]。

3.4.2 检测蓝牙可用性

BluetoothAdapter 类的静态方法getDefaultAdapter()会返回一个表示本机蓝牙适配器的BluetoothAdapter 对象,该对象在Android 系统中是唯一的,应用程序可以通过它与设备蓝牙模块进行交互,若getDefaultAdapter()返回null,则表示当前设备不具备蓝牙模块,即不支持蓝牙功能。

3.4.3 开启蓝牙

BluetoothAdapter 对象的isEnabled()方法返回一个布尔值,表示当前设备的蓝牙功能是否开启,若返回值为false,则需要请求开启蓝牙,首先创建一个Intent对象,其构造方法中传入BluetoothAdapter.ACTION_REQUEST_ENABLE,再调用startActivityForResult()方法将Intent 对象传入即可发起一次开启系统蓝牙的请求。

3.4.4 搜索可用设备

应用程序可以使用BluetoothAdapter对象来搜索附近的蓝牙设备(startDiscovery)或者查询已配对的蓝牙设备(get-BondedDevices)。

设备搜索是一个浏览流程,它查找附近可用的蓝牙设备,然后请求设备的相关信息。如果一个设备是允许被发现的,它将通过反馈一些数据来响应发现请求,例如设备名称、唯一的MAC地址等。借助这些信息,搜索发起设备可以选择和被发现的设备创建一个连接。

3.4.5 连接设备

两台蓝牙设备之间的连接需要借助C/S(客户端/服务端)机制来实现,因此其中一台设备必须创建一个服务端socket(BluetoothServerSocket),而另一台设备使用服务端设备的MAC地址来初始化一个连接。连接成功后,两台设备在相同的RFCOMM通道均持有一个相互连接的BluetoothSocket对象,并可以使用该对象中的输入输出流进行数据传输。

3.4.6 数据通信

两台设备成功连接后,各自都将持有一个相互连接的BluetoothSocket 对象,借助BluetoothSocket 对象可以轻易实现二进制数据传输。

分别调用BluetoothSocket 对象的getInputStream() 和getOutputStream()方法取出关联的输入输出数据流对象,接着调用输入流对象InputStream 的read(byte[])方法读取设备发送过来的数据,或者调用输出流对象OutputStream的w rite(byte[])方法向设备发送数据,实现双向数据通信。

开发过程中还需要考虑一些实现的细节,举个例子,数据读取操作应该处于一个专属的子线程中,因为read(byte[])方法是阻塞调用,放在主线程会引发ANR,严重影响用户体验。通常的做法是开启一个子线程循环等待,如果收到数据则利用消息机制通知UI 线程更新显示界面,直到设备断开连接或者其中一方的BluetoothSocket被关闭。

4 结语

蓝牙作为一种小范围无线连接技术,能在设备间实现方便快捷、灵活安全、低成本、低功耗的数据通信和语音通信,而Android是当今主流的移动设备操作系统,文章从移动社交应用的角度,设计并实现了一种基于Android 蓝牙技术的点对点聊天工具,在无网络等特殊环境下有一定的应用价值。

猜你喜欢

服务端调用列表
学习运用列表法
扩列吧
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
新时期《移动Web服务端开发》课程教学改革的研究
在Windows Server 2008上创建应用
基于系统调用的恶意软件检测技术研究
列表画树状图各有所长
利用RFC技术实现SAP系统接口通信
2011年《小说月刊》转载列表