当前位置: 移动互联网学院 > Android开发 > Android开发蓝牙通信教程
Android开发蓝牙通信教程 时间:2017-04-19     来源:Android开发学习网

今天为大家分享一下Android开发中蓝牙通信方面的一些知识,从蓝牙基本操作开始

1.蓝牙基本操作

随着可穿戴设备的流行,现在研究蓝牙开发已经成为必不可少的一门技术了。这里小编总结一些Android蓝牙开发方面的知识,希望对大家学习和进行Android蓝牙开发有所帮助。

1>添加蓝牙权限

使用Android的系统功能需要先声明权限,所以进行蓝牙开发,首先要在AndroidManifest.xml文件中添加操作蓝牙的权限。

2>获取蓝牙适配器

BluetoothAdapter

BluetoothAdapter类是操作蓝牙,进行蓝牙开发时主要用到的类,使用时需导包。

import android.bluetooth.BluetoothAdapter;

源码具体位置frameworks/base/core/Java/android/bluetooth/BluetoothAdapter.java

BluetoothAdapter代表本地设备的蓝牙适配器。该BluetoothAdapter可以执行基本的蓝牙任务,例如启动设备发现,查询配对的设备列表,使用已知的MAC地址实例化一个BluetoothDevice类,并创建一个BluetoothServerSocket监听来自其他设备的连接请求。

获取蓝牙适配器:BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

3>与蓝牙有关的一些操作

开启蓝牙

Android开发蓝牙通信教程:开启蓝牙

获取本地蓝牙信息

Android开发蓝牙通信教程:获取本地蓝牙信息

搜索设备

mBluetoothAdapter.startDiscovery();

停止搜索

mBluetoothAdapter.cancelDiscovery();

监听扫描

搜索蓝牙设备是一个异步的过程,需要通过注册广播接收者监听扫描到设备。

Android开发蓝牙通信教程:监听扫描蓝牙

通过广播接收者查看扫描到的蓝牙设备,每扫描到一个设备,系统都会发送此广播(BluetoothDevice.ACTION_FOUNDE)。其中参数intent可以获取蓝牙设备BluetoothDevice。

Android开发蓝牙通信教程:监听扫描蓝牙2

设置蓝牙可见性

有时候扫描不到某设备,这是因为该设备对外不可见或者距离远,需要设备该蓝牙可见,这样该才能被搜索到。

可见时间默认值为120s,多可设置300。

Android开发蓝牙通信教程:设置蓝牙可见性

2.服务端

android 蓝牙之间可以通过SDP协议建立连接进行通信,通信方式类似于平常使用socket。

首先创建BluetoothServerSocket ,BluetoothAdapter中提供了两种创建BluetoothServerSocket 方式,如下图所示为创建安全的RFCOMM Bluetooth socket,该连接是安全的需要进行配对。而通过listenUsingInsecureRfcommWithServiceRecord创建的RFCOMM Bluetooth socket是不安全的,连接时不需要进行配对。

其中的uuid需要服务器端和客户端进行统一。

Android开发蓝牙通信教程:服务端1

mServerSocket通过accept()等待客户端的连接(阻塞),直到连接成功或失败。

Android开发蓝牙通信教程:服务端2

3.客户端

客户端主要用来创建RFCOMM socket,并连接服务端。先扫描周围的蓝牙设备,如果扫描到指定设备则进行连接。

连接过程主要在ConnectThread线程中进行,先创建socket,方式有两种,下图是安全的。另一种不安全连接对应的函数是createInsecureRfcommSocketToServiceRecord。

Android开发蓝牙通信教程:客户端1

接着客户端socket主动连接服务端。连接过程中会自动进行配对,需要双方同意才可以连接成功。

Android开发蓝牙通信教程:客户端2

4.数据传输

客户端与服务端连接成功后都会创建一个ConnectedThread线程。该线程主要用来接收和发送数据。客户端和服务端处理方式一样。该线程通过socket获得输入输出流。

private InputStream mmInStream = socket.getInputStream();

private OutputStream mmOutStream =socket.getOutputStream();

发送数据

Android开发蓝牙通信教程:发送数据

接收数据

线程循环进行接收数据。

Android开发蓝牙通信教程:接收数据