android蓝牙简介

Bluetooth是目前使用最广泛的无线通讯协议,近距离无线通讯的标准。传说瑞典有个国王特别爱吃蓝莓导致自己的牙齿天天都是蓝色的,在他执政期间这位国王非常善于交际,能说会到,和邻国的搞得关系非常好,这个Bluetooth的发明者觉得蓝牙它的作用就是在近距离沟通周围的设备,跟这个国王很类似,于是起名叫蓝牙。

Android提供默认的蓝牙协议栈是BlueDroid,分为两层:蓝牙嵌入式系统(BTE)和蓝牙应用层(BTA),BTE层主要实现蓝牙的核心功能,BTA层则主要负责和Anroid框架通信

Android4.2之前,Google一直应用的是Linux官方蓝牙协议栈,即知名老牌开源

项目BlueZ。BlueZ实际上是由高通公司在2001年5月基于GPL协议release的一个开源项目,该项目仅release一个月后就被Linux之父LinuxTorvalds纳入了Linux内核,并做为Linux2.4.6内核的官方蓝牙协议栈。随着Android设备的流行,BlueZ也得到了极大的完善和扩展。例如Android4.1中BlueZ的版本升级为4.93,它支持蓝牙核心规范4.0,并实现了绝大部分的Profiles。但是从Android4.2即JellyBean开始,Google便在Android源码中推出了它和博通公司一起开发的BlueDroid以替代BlueZ。虽然因为时间及成熟度的原因,大部分手机厂商在Android4.2中仍继续应用BlueZ。但是BlueZ的创始者,高通公司也将在基于其芯片的Android参考设计中去除BlueZ,并仅支持BlueDroid。BlueZ的未来如何笔者姑且不论。不过,能让高通改弦易辙,BlueDroid自有其合理之处。相比BlueZ,BlueDroid最值得称道的地方就是其框架结构变得更为简洁和清晰。另外,借助HAL(HardwareAbstractionLayer,硬件抽象层),BlueDroid终于不再和dbus有任何瓜葛。(引用)

蓝牙设备连接的过程如下所示:

1、开启蓝牙(开启权限)

2、查找周围设备

3、获取设备的name,address

4、创建BluetoothSocket

BluetoothSockettmp=null;

//GetaBluetoothSocketforaconnectionwiththe

//givenBluetoothDevice

try{

tmp=device.createRfcommSocketToServiceRecord(MY_UUID);

}catch(IOExceptione){

Log.e(TAG,"create()failed",e);

}

5、调用connect()链接

主要API

1:BuletoothAdapter

这个类的对象代表了本地的蓝牙适配器,相当于蓝牙工作流程图中的手机里的蓝牙适配器,也就是说比如这个应用程序是运行在手机上,那么手机上的蓝牙适配器就是本地蓝牙适配器。

2:BuletoothDevice

这个类的对象代表了远程的蓝牙设备,相当于蓝牙工作流程图中的计算机里的蓝牙适配器,也就是说比如这个应用程序是运行在手机上,那么BuletoothDevice代表了你要连接的远程的那个设备上面的蓝牙适配器。

/**

*

*蓝牙连接线程

*

*

*@authorlsw

*

*/

privateclassConnectThreadextendsThread{

StringmacAddress="";

publicConnectThread(Stringmac){

macAddress=mac;

}

publicvoidrun(){

connecting=true;

connected=false;

if(mBluetoothAdapter==null){

mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();

}

mBluetoothDevice=mBluetoothAdapter.getRemoteDevice(macAddress);

mBluetoothAdapter.cancelDiscovery();

//initSocket();

try{

socket=mBluetoothDevice.createRfcommSocketToServiceRecord(uuid);

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

//e.printStackTrace();

Log.e(TAG,"Socket",e);

}

//adapter.cancelDiscovery();

while(!connected&&connetTime<=10){

connectDevice();

}

//重置ConnectThread

//synchronized(BluetoothService.this){

//ConnectThread=null;

//}

}

publicvoidcancel(){

try{

socket.close();

socket=null;

}catch(Exceptione){

e.printStackTrace();

}finally{

connecting=false;

}

}

}

接下来是调用的连接设备方法connectDevice():

复制代码

protectedvoidconnectDevice(){

try{

//连接建立之前的先配对

if(mBluetoothDevice.getBondState()==BluetoothDevice.BOND_NONE){

MethodcreMethod=BluetoothDevice.class

.getMethod("createBond");

Log.e("TAG","开始配对");

creMethod.invoke(mBluetoothDevice);

}else{

}

}catch(Exceptione){

//TODO:handleexception

//DisplayMessage("无法配对!");

e.printStackTrace();

}

mBluetoothAdapter.cancelDiscovery();

try{

socket.connect();

//DisplayMessage("连接成功!");

//connetTime++;

connected=true;

}catch(IOExceptione){

//TODO:handleexception

//DisplayMessage("连接失败!");

connetTime++;

connected=false;

try{

socket.close();

socket=null;

}catch(IOExceptione2){

//TODO:handleexception

Log.e(TAG,"Cannotcloseconnectionwhenconnectionfailed");

}

}finally{

connecting=false;

}

}

利用反射通过端口获得BluetoothSocket,然后执行connect()方法。

复制代码

/**

*

*蓝牙连接线程

*

*

*@authorlsw

*

*/

privateclassConnectThreadextendsThread{

StringmacAddress="";

publicConnectThread(Stringmac){

macAddress=mac;

}

publicvoidrun(){

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(IOExceptione1){

connetTime++;

connected=false;

//关闭socket

try{

socket.close();

socket=null;

}catch(IOExceptione2){

//TODO:handleexception

Log.e(TAG,"Socket",e2);

}

}finally{

connecting=false;

}

//connectDevice();

}

//重置ConnectThread

//synchronized(BluetoothService.this){

//ConnectThread=null;

//}

}

publicvoidcancel(){

try{

socket.close();

socket=null;

}catch(Exceptione){

e.printStackTrace();

}finally{

connecting=false;

}

}

}

接下来是初始化并得到BluetoothSocket的方法

复制代码

/**

*取得BluetoothSocket

*/

privatevoidinitSocket(){

BluetoothSockettemp=null;

try{

Methodm=mBluetoothDevice.getClass().getMethod(

"createRfcommSocket",newClass[]{int.class});

temp=(BluetoothSocket)m.invoke(mBluetoothDevice,1);//这里端口为1

}catch(SecurityExceptione){

e.printStackTrace();

}catch(NoSuchMethodExceptione){

e.printStackTrace();

}catch(IllegalArgumentExceptione){

e.printStackTrace();

}catch(IllegalAccessExceptione){

e.printStackTrace();

}catch(InvocationTargetExceptione){

e.printStackTrace();

}

socket=temp;

}

要点:1.蓝牙配对和连接是两回事,不可混为一谈。

 2.蓝牙串口连接可通过端口(1-30)和UUID两种方法进行操作。

 3.通过UUID进行蓝牙连接最好先进行配对操作。

相关推荐