图2.3.3 Android SDK 更新界面
SDK装好后还要修改下环境变量PATH,在前面加上:
C:\\Program Files\\Java\\android-sdk-windows\\platform-tools;
2.4 运行环境
1、硬件环境
? 两台Android系统的智能手机 一台Windows7系统的电脑 2、软件环境
? Android4.0.0及其以上手机系统 Eclipse +JDK + ADT + SDK
三、系统总体设计
3.1 设计思想
在Android系统中对蓝牙的操作包括开启蓝牙,关闭蓝牙,设置蓝牙可见性,扫描周围蓝牙设备,对蓝牙设备进行配对,连接蓝牙设备,进行数据通信。其中对第一次扫描到的蓝牙设备进行配对过程是通过系统秘钥手动完成的,是为了保证数据通信的安全性。我们的技术开发主要的工作是设置蓝牙可见性,扫描周围的蓝牙设备,选择一台蓝牙设备进行连接并进行数据通信。并在此基础上完成数据库的读写操作,实现查看聊天记录的功能。
首先两个设备上都要有蓝牙设备或者专业一点叫蓝牙适配器,以手机和电脑为例我画了一个蓝牙工作流程图如图3.1所示。其次在手机上进行扫描,扫描周围的蓝牙设备,找到手机附近的电脑后给它发出一个信号需要进行蓝牙的配对,再次返回一个信号说明手机和电脑已经配对成功了,最后配对成功后就可以进行连接和数据通信了。这是一个最基本的流程。
图3.1 蓝牙工作流程图
在Android中进行蓝牙开发的相关类和接口都位于Android.bluetooth包中。其中最主要的几个API如下所示。
BluetoothAdapter类:代表了一个本地的蓝牙适配器。它是所有蓝牙交互的的入口点。利用它你可以发现其他蓝牙设备,查询绑定了的设备,使用已知的MAC地址实例化一个蓝牙设备和建立一个BluetoothServerSocket(作为服务器端)来监听来自其他设备的连接。
BluetoothDevice类:代表了一个远端的蓝牙设备,使用它请求远端蓝牙设备连接或者获取远端蓝牙设备的名称、地址、种类和绑定状态。其信息是封装在bluetoothsocket中。
BluetoothSocket类:代表了一个蓝牙套接字的接口(类似于tcp中的套接字),它是应用程序通过输入、输出流与其他蓝牙设备通信的连接点。
BlueboothServerSocket类:代表打开服务连接来监听可能到来的连接请求(属于Server端),为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。当远端设备发起连接连接请求的时候,并且Server端已经接受连接时,BlueboothServerSocket类将会返回一个BluetoothSocket。
Bluetoothclass类:描述了一个蓝牙设备的一般特点和能力。它的只读属性集定义了设备的主、次设备类和一些相关服务。然而,它并没有准确地描述所有该设备所支持的蓝牙文件和服务,而是作为对设备种类来说的一个小小暗示。
3.2 设计框架
完整的蓝牙操作过程示意图如图3.2.1所示。
图3.2.1 蓝牙操作流程图
扫描周围蓝牙设备得到配对的设备列表后,需要从中选取一个设备进行连接并进行数据通信。蓝牙数据通信过程采用C/S模型,两台手机通过蓝牙进行数据传输,其中主动发起连接请求的设备视为客户端,监听并接受请求的设备视为服
务器端。下面分别介绍蓝牙通信在服务器端和客户端上的连接操作过程如图3.2.2和图3.2.3所示。
图3.2.2 服务器端连接过程
图3.2.3 客户端连接过程
在服务器端,注意如下几点:
1.一定要保证蓝牙开启且通信双方已经手动完成匹配; 2.服务端要开启蓝牙可见性,以保证能被客户端搜索到;
3.用BluetoothServerSocket的listenUsingRfcommWithServiceRecord()方法获取ServerSocket对象,再使用BluetoothServerSocket的accept()方法阻塞接收请求者的连接请求,成功后该方法返回BluetoothSocket对象;
4.使用获取到的socket对象的输入输出流方法操作数据通信,接收到的数据一定要通过handler处理显示。
在客户端,注意如下几点:
1.同样一定要保证蓝牙开启且通信双方已经手动完成匹配; 2.通过广播扫描周围可用设备,并确定该设备已与本机完成匹配; 3.通过调用BluetoothAdapter的startDiscovery()方法异步扫描到周围的BluetoothDevice对象,调用createRfcommSocketToServiceRecord()方法,获取BluetoothSocket对象,并用该对象调用connect()方法想服务器提出连接请求。注意此连接请求过程要循环请求,直至完成连接;
4.使用此连接的socket对象的输入输出流方法操作数据通信,接收到的数据一定要通过handler处理显示。