安卓经典蓝牙连接

1 前言

  2009年4月21日,蓝牙技术联盟(Bluetooth SIG)正式颁布了新一代标准规范"Bluetooth Core Specification Version 3.0 High Speed"(蓝牙核心规范3.0版 高速),蓝牙3.0的核心是"Generic Alternate MAC/PHY"(AMP),这是一种全新的交替射频技术,允许蓝牙协议栈针对任一任务动态地选择正确射频。
  蓝牙3.0的数据传输率提升到24Mbps,相比于已经淡出市场的蓝牙2.0大大提升了传输速率。在上一篇文章安卓蓝牙开发之——搜索蓝牙设备中已经实现了蓝牙的搜索过程,本文将主要介绍蓝牙3.0的连接过程。

2 蓝牙Socket通信

  安卓系统对于蓝牙3.0的通信封装成Socket通信方式,既然采用socket通信就有服务端和客户端之分。在安卓蓝牙开发中将手机端作为服务端,将周边设备作为客户端。

3 服务端线程

  Socket通信中服务端负责启动监听,等待客户端的连接。首先创建服务端线程ServerThread。核心代码如下:

// 服务端线程
private class ServerThread extends Thread {

    public void run() {
        try {
            // 创建一个蓝牙服务器 参数分别:服务器名称、UUID
            mserverSocket = mBluetoothAdapter
                    .listenUsingRfcommWithServiceRecord(
                            "btspp",
                            UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

            // 启动监听,接受客户端的连接请求
            socket = mserverSocket.accept();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }    
}

  ServerThread 服务端首先调用了BluetoothAdapter类中listenUsingRfcommWithServiceRecord()方法,创建了创建一个安全的RFCOMM蓝牙通过信道。这就相当于开辟了一条用于蓝牙通信的路径。

方法原型:
public BluetoothServerSocket listenUsingRfcommWithServiceRecord (String name, UUID uuid);

方法参数 参数含义
name 创建信道的名称
uuid 通用唯一识别码,用于唯一标识此通信信道
返回值 含义
BluetoothServerSocket 服务端用于开启监听的蓝牙套接字。

  创建BluetoothServerSocket 对象成功后调用mserverSocket.accept()用于开启监听。注意accept()方法为阻塞方法,开启之后等待客户端的连接,在没有设备连接上之前,accept()方法不会返回。

方法原型:
public BluetoothSocket accept ()

返回值 含义
BluetoothSocket对象 该对象主要用于socket通信,在后面与设备进行数据通信时将会重点使用此对象。

4 客户端线程

  客户端线程ClientThread用于向服务端发起连接,连接成功将建立socket通信通道。客户端核心代码如下:

top Created with Sketch.