- 浏览: 26912 次
- 性别:
- 来自: 北京
文章分类
最新评论
Bluetooth是目前使用最广泛的无线通讯协议,近距离无线通讯的标准。传说瑞典有个国王特别爱吃蓝莓导致自己的牙齿天天都是蓝色的,在他执政期间这位国王非常善于交际,能说会到,和邻国的搞得关系非常好,这个Bluetooth的发明者觉得蓝牙它的作用就是在近距离沟通周围的设备,跟这个国王很类似,于是起名叫蓝牙。
Android 提供默认的蓝牙协议栈是 BlueDroid,分为两层:蓝牙嵌入式系统(BTE)和蓝牙应用层(BTA),BTE 层主要实现蓝牙的核心功能,BTA 层则主要负责和 Anroid 框架通信
Android 4.2 之前,Google 一直应用的是 Linux 官方蓝牙协议栈,即知名老牌开源
项目 BlueZ。BlueZ 实际上是由高通公司在 2001 年 5 月基于 GPL 协议 release 的一个开源项目,该项目仅 release 一个月后就被 Linux 之父 Linux Torvalds 纳入了 Linux 内核,并做为 Linux 2.4.6 内核的官方蓝牙协议栈。随着 Android 设备的流行,BlueZ 也得到了极大的完善和扩展。例如 Android 4.1 中 BlueZ 的版本升级为 4.93,它支持蓝牙核心规范4.0,并实现了绝大部分的 Profiles。但是从 Android 4.2 即 Jelly Bean 开始,Google 便在 Android 源码中推出了它和博通公司一起开发的 BlueDroid 以替代 BlueZ。虽然因为时间及成熟度的原因,大部分手机厂商在 Android 4.2 中仍继续应用 BlueZ。但是 BlueZ 的创始者,高通公司也将在基于其芯片的 Android 参考设计中去除 BlueZ,并仅支持 BlueDroid。BlueZ 的未来如何笔者姑且不论。不过,能让高通改弦易辙,BlueDroid 自有其合理之处。相比 BlueZ,BlueDroid 最值得称道的地方就是其框架结构变得更为简洁和清晰。另外,借助 HAL(Hardware Abstraction Layer,硬件抽象层),BlueDroid 终于不再和 dbus 有任何瓜葛。(引用)
蓝牙设备连接的过程如下所示:
1、开启蓝牙(开启权限)
2、查找周围设备
3、获取设备的name,address
4、创建BluetoothSocket
BluetoothSocket tmp = null;
// Get a BluetoothSocket for a connection with the
// given BluetoothDevice
try {
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
Log.e(TAG, "create() failed", e);
}
5、调用connect()链接
主要API
1:BuletoothAdapter
这个类的对象代表了本地的蓝牙适配器,相当于蓝牙工作流程图中的手机里的蓝牙适配器,也就是说比如这个应用程序是运行在手机上,那么手机上的蓝牙适配器就是本地蓝牙适配器。
2:BuletoothDevice
这个类的对象代表了远程的蓝牙设备,相当于蓝牙工作流程图中的计算机里的蓝牙适配器,也就是说比如这个应用程序是运行在手机上,那么BuletoothDevice代表了你要连接的远程的那个设备上面的蓝牙适配器。
/**
*
* 蓝牙连接线程
*
*
* @author lsw
*
*/
private class ConnectThread extends Thread {
String macAddress = "";
public ConnectThread(String mac) {
macAddress = mac;
}
public void run() {
connecting = true;
connected = false;
if(mBluetoothAdapter == null){
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(macAddress);
mBluetoothAdapter.cancelDiscovery();
//initSocket();
try {
socket = mBluetoothDevice.createRfcommSocketToServiceRecord(uuid);
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
Log.e(TAG, "Socket", e);
}
//adapter.cancelDiscovery();
while (!connected && connetTime <= 10) {
connectDevice();
}
// 重置ConnectThread
//synchronized (BluetoothService.this) {
//ConnectThread = null;
//}
}
public void cancel() {
try {
socket.close();
socket = null;
} catch (Exception e) {
e.printStackTrace();
} finally {
connecting = false;
}
}
}
接下来是调用的连接设备方法connectDevice():
复制代码
protected void connectDevice() {
try {
// 连接建立之前的先配对
if (mBluetoothDevice.getBondState() == BluetoothDevice.BOND_NONE) {
Method creMethod = BluetoothDevice.class
.getMethod("createBond");
Log.e("TAG", "开始配对");
creMethod.invoke(mBluetoothDevice);
} else {
}
} catch (Exception e) {
// TODO: handle exception
//DisplayMessage("无法配对!");
e.printStackTrace();
}
mBluetoothAdapter.cancelDiscovery();
try {
socket.connect();
//DisplayMessage("连接成功!");
//connetTime++;
connected = true;
} catch (IOException e) {
// TODO: handle exception
//DisplayMessage("连接失败!");
connetTime++;
connected = false;
try {
socket.close();
socket = null;
} catch (IOException e2) {
// TODO: handle exception
Log.e(TAG, "Cannot close connection when connection failed");
}
} finally {
connecting = false;
}
}
利用反射通过端口获得BluetoothSocket,然后执行connect()方法。
复制代码
/**
*
* 蓝牙连接线程
*
*
* @author lsw
*
*/
private class ConnectThread extends Thread {
String macAddress = "";
public ConnectThread(String mac) {
macAddress = mac;
}
public void run() {
connecting = true;
connected = false;
if(mBluetoothAdapter == null){
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(macAddress);
mBluetoothAdapter.cancelDiscovery();
initSocket();
//adapter.cancelDiscovery();
while (!connected && connetTime <= 10) {
try {
socket.connect();
connected = true;
} catch (IOException e1) {
connetTime++;
connected = false;
// 关闭 socket
try {
socket.close();
socket = null;
} catch (IOException e2) {
//TODO: handle exception
Log.e(TAG, "Socket", e2);
}
} finally {
connecting = false;
}
//connectDevice();
}
// 重置ConnectThread
//synchronized (BluetoothService.this) {
//ConnectThread = null;
//}
}
public void cancel() {
try {
socket.close();
socket = null;
} catch (Exception e) {
e.printStackTrace();
} finally {
connecting = false;
}
}
}
接下来是初始化并得到BluetoothSocket的方法
复制代码
/**
* 取得BluetoothSocket
*/
private void initSocket() {
BluetoothSocket temp = null;
try {
Method m = mBluetoothDevice.getClass().getMethod(
"createRfcommSocket", new Class[] { int.class });
temp = (BluetoothSocket) m.invoke(mBluetoothDevice, 1);//这里端口为1
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
socket = temp;
}
要点:1.蓝牙配对和连接是两回事,不可混为一谈。
2.蓝牙串口连接可通过端口 (1-30)和UUID两种方法进行操作。
3.通过UUID进行蓝牙连接最好先进行配对操作。
Android 提供默认的蓝牙协议栈是 BlueDroid,分为两层:蓝牙嵌入式系统(BTE)和蓝牙应用层(BTA),BTE 层主要实现蓝牙的核心功能,BTA 层则主要负责和 Anroid 框架通信
Android 4.2 之前,Google 一直应用的是 Linux 官方蓝牙协议栈,即知名老牌开源
项目 BlueZ。BlueZ 实际上是由高通公司在 2001 年 5 月基于 GPL 协议 release 的一个开源项目,该项目仅 release 一个月后就被 Linux 之父 Linux Torvalds 纳入了 Linux 内核,并做为 Linux 2.4.6 内核的官方蓝牙协议栈。随着 Android 设备的流行,BlueZ 也得到了极大的完善和扩展。例如 Android 4.1 中 BlueZ 的版本升级为 4.93,它支持蓝牙核心规范4.0,并实现了绝大部分的 Profiles。但是从 Android 4.2 即 Jelly Bean 开始,Google 便在 Android 源码中推出了它和博通公司一起开发的 BlueDroid 以替代 BlueZ。虽然因为时间及成熟度的原因,大部分手机厂商在 Android 4.2 中仍继续应用 BlueZ。但是 BlueZ 的创始者,高通公司也将在基于其芯片的 Android 参考设计中去除 BlueZ,并仅支持 BlueDroid。BlueZ 的未来如何笔者姑且不论。不过,能让高通改弦易辙,BlueDroid 自有其合理之处。相比 BlueZ,BlueDroid 最值得称道的地方就是其框架结构变得更为简洁和清晰。另外,借助 HAL(Hardware Abstraction Layer,硬件抽象层),BlueDroid 终于不再和 dbus 有任何瓜葛。(引用)
蓝牙设备连接的过程如下所示:
1、开启蓝牙(开启权限)
2、查找周围设备
3、获取设备的name,address
4、创建BluetoothSocket
BluetoothSocket tmp = null;
// Get a BluetoothSocket for a connection with the
// given BluetoothDevice
try {
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
Log.e(TAG, "create() failed", e);
}
5、调用connect()链接
主要API
1:BuletoothAdapter
这个类的对象代表了本地的蓝牙适配器,相当于蓝牙工作流程图中的手机里的蓝牙适配器,也就是说比如这个应用程序是运行在手机上,那么手机上的蓝牙适配器就是本地蓝牙适配器。
2:BuletoothDevice
这个类的对象代表了远程的蓝牙设备,相当于蓝牙工作流程图中的计算机里的蓝牙适配器,也就是说比如这个应用程序是运行在手机上,那么BuletoothDevice代表了你要连接的远程的那个设备上面的蓝牙适配器。
/**
*
* 蓝牙连接线程
*
*
* @author lsw
*
*/
private class ConnectThread extends Thread {
String macAddress = "";
public ConnectThread(String mac) {
macAddress = mac;
}
public void run() {
connecting = true;
connected = false;
if(mBluetoothAdapter == null){
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(macAddress);
mBluetoothAdapter.cancelDiscovery();
//initSocket();
try {
socket = mBluetoothDevice.createRfcommSocketToServiceRecord(uuid);
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
Log.e(TAG, "Socket", e);
}
//adapter.cancelDiscovery();
while (!connected && connetTime <= 10) {
connectDevice();
}
// 重置ConnectThread
//synchronized (BluetoothService.this) {
//ConnectThread = null;
//}
}
public void cancel() {
try {
socket.close();
socket = null;
} catch (Exception e) {
e.printStackTrace();
} finally {
connecting = false;
}
}
}
接下来是调用的连接设备方法connectDevice():
复制代码
protected void connectDevice() {
try {
// 连接建立之前的先配对
if (mBluetoothDevice.getBondState() == BluetoothDevice.BOND_NONE) {
Method creMethod = BluetoothDevice.class
.getMethod("createBond");
Log.e("TAG", "开始配对");
creMethod.invoke(mBluetoothDevice);
} else {
}
} catch (Exception e) {
// TODO: handle exception
//DisplayMessage("无法配对!");
e.printStackTrace();
}
mBluetoothAdapter.cancelDiscovery();
try {
socket.connect();
//DisplayMessage("连接成功!");
//connetTime++;
connected = true;
} catch (IOException e) {
// TODO: handle exception
//DisplayMessage("连接失败!");
connetTime++;
connected = false;
try {
socket.close();
socket = null;
} catch (IOException e2) {
// TODO: handle exception
Log.e(TAG, "Cannot close connection when connection failed");
}
} finally {
connecting = false;
}
}
利用反射通过端口获得BluetoothSocket,然后执行connect()方法。
复制代码
/**
*
* 蓝牙连接线程
*
*
* @author lsw
*
*/
private class ConnectThread extends Thread {
String macAddress = "";
public ConnectThread(String mac) {
macAddress = mac;
}
public void run() {
connecting = true;
connected = false;
if(mBluetoothAdapter == null){
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(macAddress);
mBluetoothAdapter.cancelDiscovery();
initSocket();
//adapter.cancelDiscovery();
while (!connected && connetTime <= 10) {
try {
socket.connect();
connected = true;
} catch (IOException e1) {
connetTime++;
connected = false;
// 关闭 socket
try {
socket.close();
socket = null;
} catch (IOException e2) {
//TODO: handle exception
Log.e(TAG, "Socket", e2);
}
} finally {
connecting = false;
}
//connectDevice();
}
// 重置ConnectThread
//synchronized (BluetoothService.this) {
//ConnectThread = null;
//}
}
public void cancel() {
try {
socket.close();
socket = null;
} catch (Exception e) {
e.printStackTrace();
} finally {
connecting = false;
}
}
}
接下来是初始化并得到BluetoothSocket的方法
复制代码
/**
* 取得BluetoothSocket
*/
private void initSocket() {
BluetoothSocket temp = null;
try {
Method m = mBluetoothDevice.getClass().getMethod(
"createRfcommSocket", new Class[] { int.class });
temp = (BluetoothSocket) m.invoke(mBluetoothDevice, 1);//这里端口为1
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
socket = temp;
}
要点:1.蓝牙配对和连接是两回事,不可混为一谈。
2.蓝牙串口连接可通过端口 (1-30)和UUID两种方法进行操作。
3.通过UUID进行蓝牙连接最好先进行配对操作。
发表评论
-
android二维码扫描
2016-11-23 14:56 701直接上demo地址,不知道写啥https://github. ... -
github简单操作
2016-11-03 09:59 831先以 Square ... -
android中Intent简介
2016-11-03 09:44 725Intent是什么? Android中提供了In ... -
MVVM使用简介
2016-11-02 11:18 1106我们一步步来,从MVC开始。 MVC 我们都知道,模型——视 ... -
自定义控件之组合控件
2016-11-01 10:33 1007在开发中很多用到自定义控件,其中大部分是有几个控件组合到一起使 ... -
BigDecimal
2016-10-27 14:18 658转载http://jeelee.iteye.com/b ... -
DataBinding+Retorfit+Rxjava简单示例
2016-10-25 10:17 981目前比较流行的DataBinding+Retorfit+Rxj ... -
RecycleView
2016-10-25 10:06 978RecycleView是谷歌在5.0后新出的一款控件,可以代替 ... -
Error:Execution failed for task ':app:preDexDebug'.
2016-09-18 21:54 798在使用as开发的时候有时候会遇到这个错误 Error:Exec ... -
android6.0权限管理
2016-09-04 15:41 740在android6.0中谷歌对权限加强了管理,运行时权限必须开 ... -
设置ProgressBar的默认颜色
2016-09-04 15:33 1484ProgressBar progressBar = (Prog ... -
圆角按钮
2016-09-04 15:31 603<?xml version="1.0" ... -
svn提交失败Error:svn: E165001: Commit failed (details follow): svn: E165001: Failed
2016-07-22 16:15 8721在使用as的时候,svn提交代码的时候出现这个错误: E ... -
gson解析工具类
2016-07-22 11:34 914今天后台调东西,我这暂时调不了,称这个时间在来个博客,其实 ... -
android仿支付宝支付底部dialog,多个模块切换
2016-07-21 14:55 4417从上班以来,入职的每个公司都特别忙,想写个博客都写不了,今 ... -
android带清除按钮的输入框
2016-06-21 16:35 999话不多说,直奔主题,清除按钮的输入框,上代码 packa ...
相关推荐
android蓝牙封装代码
Android提供了一个名为BluetoothAdapter的类,它是Android蓝牙功能的主要入口点。通过这个类,我们可以检查蓝牙是否开启,扫描附近的蓝牙设备,并建立连接。当我们要监听蓝牙设备的状态变化时,就需要用到广播通信。...
首先,理解Android蓝牙API是基础。Android提供了BluetoothAdapter类,它是系统蓝牙服务的主要接口,用于查找、配对和管理蓝牙设备。开发者需要通过BluetoothAdapter.getDefaultAdapter()获取系统的默认蓝牙适配器,...
"Android蓝牙连接设备demo"是一个示例项目,它演示了如何使用Android SDK来实现BLE 4.0及更高版本的蓝牙设备连接和通信功能。下面我们将深入探讨这个demo涉及的关键知识点。 1. **BLE 4.0与Android支持**:BLE 4.0...
Android 蓝牙开发步骤详解 Android 蓝牙开发步骤是一个复杂的过程,它涉及到硬件、Linux 内核、库、框架和应用程序等多个方面。在本文中,我们将详细介绍 Android 蓝牙开发的步骤,从硬件到应用程序的所有方面。 ...
本示例是一个Android蓝牙SPP传输的Demo,它展示了如何在Android应用中实现与蓝牙设备的数据交换。以下是关于这个主题的详细知识: 1. **蓝牙SPP介绍**: - SPP是蓝牙核心规格的一部分,模仿了串口通信,使得不同...
"android蓝牙聊天源代码"项目提供了一个很好的实例,帮助开发者了解如何在Android应用程序中实现蓝牙聊天功能。以下将详细介绍这个项目的相关知识点: 1. **Android Bluetooth API**: Android提供了`...
Android 蓝牙map协议连接流程图(上层),将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据收发走向,代码流程更加形象生动,能够很快的熟悉Android 蓝牙源码,利于后面问题处理和BUG解决
首先,我们需要理解蓝牙技术的基本概念,然后我们将详细讨论Android蓝牙开发客户端的实现步骤。 蓝牙是一种短距离无线通信技术,允许电子设备之间进行数据交换。在Android中,蓝牙功能主要通过`BluetoothAdapter`、...
首先,我们要理解Android蓝牙打印的基本原理。Android系统提供了一个名为`BluetoothAdapter`的类,用于处理蓝牙连接和通信。通过这个类,我们可以发现可用的蓝牙设备,建立与打印机的连接,并发送数据。要启用蓝牙...
【C#与Android之间的蓝牙通信】是移动设备间交互的重要技术之一,特别是在物联网(IoT)和嵌入式系统中广泛应用。本示例是通过C#编写的应用程序与Android设备进行蓝牙连接,实现数据传输,如图片、语音和文字等。这种...
通过分析和运行这些代码,可以更直观地理解Android蓝牙通信的工作原理。 需要注意的是,由于蓝牙通信涉及到权限问题,记得在AndroidManifest.xml中添加`<uses-permission android:name="android.permission....
"android蓝牙间传输demo"是一个示例项目,它展示了如何在Android设备之间通过蓝牙进行数据交换。这个项目的重点在于理解和实现Android Bluetooth API,这将涵盖蓝牙的配对、连接、数据发送与接收等关键步骤。 首先...
本文将深入探讨Android蓝牙HID协议开发的相关知识点,并提供实现手机连接蓝牙外设的基础步骤。 首先,理解蓝牙HID协议至关重要。蓝牙HID是Bluetooth SIG(蓝牙特别兴趣小组)定义的一种标准,主要用于无线连接输入...
本文将详细介绍Android蓝牙开发的基础知识,帮助开发者快速入门。 首先,要开启蓝牙功能并进行相关操作,必须在`AndroidManifest.xml`文件中添加必要的权限: ```xml <uses-permission android:name="android....
本项目"Android蓝牙,配对,搜索,连接,通信,断开的Demo"是一个使用Kotlin编写的Android应用示例,它涵盖了蓝牙功能的基本操作,包括设备的搜索、配对、取消配对、连接、数据传输以及断开连接等核心环节。...
在Android平台上进行蓝牙通信是一项常见的...总的来说,构建Android蓝牙通信系统涉及多个步骤,包括设备发现、连接建立、数据传输和错误处理。通过客户端和服务端的协同工作,可以在Android设备间实现可靠的蓝牙通信。
在Android平台上,实现“蓝牙耳机录音”涉及到一系列的系统服务、API接口以及音频处理技术。以下将详细解析这个过程,并提供关键知识点。 首先,我们来理解“Sco”(Short Range Communication)模式。Sco是蓝牙...
本文将详细解析如何实现Android蓝牙扫描,包括注册蓝牙扫描广播、使用LeScanCallback回调以及ScanCallback回调这三种方法。 首先,我们要了解Android蓝牙的基础知识。在Android系统中,BluetoothManager类提供了对...
Android 蓝牙 A2DP播放AVDTP连接,音乐从audio到A2dp蓝牙侧,流程图。非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙...