android开发之蓝牙配对连接的方法

转载 2016年08月31日 12:58:17

新年第一篇。

最近在做蓝牙开锁的小项目,手机去连接单片机总是出现问题,和手机的连接也不稳定,看了不少蓝牙方面的文档,做了个关于蓝牙连接的小结。

在做Android蓝牙串口连接的时候一般会使用

  1. BluetoothSocket tmp = null;  
  2. // Get a BluetoothSocket for a connection with the  
  3. // given BluetoothDevice  
  4. try {  
  5.          tmp = device.createRfcommSocketToServiceRecord(MY_UUID);  
  6. catch (IOException e) {  
  7.     Log.e(TAG, "create() failed", e);  
  8. }  

然后是tmp赋给BluetoothSocket,接着调用connect方法进行蓝牙设备的连接。

可是 BluetoothSocket 的connect方法本身就会报很多异常错误。

以下根据对蓝牙开发的一点研究可通过以下方法解决:

方法1.先进行蓝牙自动配对,配对成功,通过UUID获得BluetoothSocket,然后执行connect()方法。

方法2.通过UUID获得BluetoothSocket,然后先根据mDevice.getBondState()进行判断是否需要配对,最后执行connnect()方法。

 

  1. private class ConnectThread extends Thread {  
  2.     String macAddress = "";  
  3.   
  4.     public ConnectThread(String mac) {  
  5.         macAddress = mac;  
  6.     }  
  7.   
  8.     public void run() {  
  9.         connecting = true;  
  10.         connected = false;  
  11.         if(mBluetoothAdapter == null){  
  12.             mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();  
  13.         }  
  14.         mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(macAddress);  
  15.         mBluetoothAdapter.cancelDiscovery();  
  16.         try {  
  17.             socket = mBluetoothDevice.createRfcommSocketToServiceRecord(uuid);  
  18.               
  19.         } catch (IOException e) {  
  20.             // TODO Auto-generated catch block  
  21.             //e.printStackTrace();  
  22.             Log.e(TAG, "Socket", e);  
  23.         }               
  24.         //adapter.cancelDiscovery();  
  25.         while (!connected && connetTime <= 10) {                  
  26.             connectDevice();  
  27.         }  
  28.         // 重置ConnectThread   
  29.         //synchronized (BluetoothService.this) {  
  30.            //ConnectThread = null;  
  31.         //}  
  32.     }  
  33.   
  34.     public void cancel() {  
  35.         try {  
  36.             socket.close();  
  37.             socket = null;  
  38.         } catch (Exception e) {  
  39.             e.printStackTrace();  
  40.         } finally {  
  41.             connecting = false;  
  42.         }  
  43.     }  
  44. }  

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

  1. protected void connectDevice() {    
  2.         try {    
  3.             // 连接建立之前的先配对    
  4.             if (mBluetoothDevice.getBondState() == BluetoothDevice.BOND_NONE) {    
  5.                 Method creMethod = BluetoothDevice.class    
  6.                         .getMethod("createBond");    
  7.                 Log.e("TAG""开始配对");    
  8.                 creMethod.invoke(mBluetoothDevice);    
  9.             } else {    
  10.             }    
  11.         } catch (Exception e) {    
  12.             // TODO: handle exception    
  13.             //DisplayMessage("无法配对!");    
  14.             e.printStackTrace();    
  15.         }    
  16.         mBluetoothAdapter.cancelDiscovery();    
  17.         try {    
  18.             socket.connect();    
  19.             //DisplayMessage("连接成功!");   
  20.             //connetTime++;  
  21.             connected = true;  
  22.         } catch (IOException e) {    
  23.             // TODO: handle exception    
  24.             //DisplayMessage("连接失败!");  
  25.             connetTime++;  
  26.             connected = false;  
  27.             try {    
  28.                 socket.close();  
  29.                 socket = null;  
  30.             } catch (IOException e2) {    
  31.                 // TODO: handle exception    
  32.                 Log.e(TAG, "Cannot close connection when connection failed");    
  33.             }    
  34.         } finally {  
  35.             connecting = false;  
  36.         }    
  37.     }  


 

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

  1. private class ConnectThread extends Thread {  
  2.     String macAddress = "";  
  3.   
  4.     public ConnectThread(String mac) {  
  5.         macAddress = mac;  
  6.     }  
  7.   
  8.     public void run() {  
  9.         connecting = true;  
  10.         connected = false;  
  11.         if(mBluetoothAdapter == null){  
  12.             mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();  
  13.         }  
  14.         mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(macAddress);  
  15.         mBluetoothAdapter.cancelDiscovery();  
  16.         initSocket();                           
  17.         //adapter.cancelDiscovery();  
  18.         while (!connected && connetTime <= 10) {  
  19.             try {  
  20.                 socket.connect();  
  21.                 connected = true;  
  22.             } catch (IOException e1) {  
  23.                 connetTime++;  
  24.                 connected = false;  
  25.                 // 关闭 socket  
  26.                 try {  
  27.                     socket.close();  
  28.                     socket = null;  
  29.                 } catch (IOException e2) {  
  30.                     //TODO: handle exception    
  31.                     Log.e(TAG, "Socket", e2);  
  32.                 }  
  33.             } finally {  
  34.                 connecting = false;  
  35.             }  
  36.             //connectDevice();  
  37.         }  
  38.         // 重置ConnectThread   
  39.         //synchronized (BluetoothService.this) {  
  40.            //ConnectThread = null;  
  41.         //}  
  42.     }  
  43.   
  44.     public void cancel() {  
  45.         try {  
  46.             socket.close();  
  47.             socket = null;  
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.         } finally {  
  51.             connecting = false;  
  52.         }  
  53.     }  
  54. }  

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

  1. /** 
  2.      * 取得BluetoothSocket 
  3.      */  
  4.     private void initSocket() {  
  5.         BluetoothSocket temp = null;  
  6.         try {              
  7.             Method m = mBluetoothDevice.getClass().getMethod(  
  8.                     "createRfcommSocket"new Class[] { int.class });  
  9.             temp = (BluetoothSocket) m.invoke(mBluetoothDevice, 1);//这里端口为1              
  10.         } catch (SecurityException e) {  
  11.             e.printStackTrace();  
  12.         } catch (NoSuchMethodException e) {  
  13.             e.printStackTrace();  
  14.         } catch (IllegalArgumentException e) {  
  15.             e.printStackTrace();  
  16.         } catch (IllegalAccessException e) {  
  17.             e.printStackTrace();  
  18.         } catch (InvocationTargetException e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.         socket = temp;  
  22.     }  

 

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

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

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

 

作者:jason0539

博客:http://blog.csdn.net/jason0539(转载请说明出处)

Android蓝牙自动配对和Pin码设置

前言(android2.3版本,4.0版本由于是随机获取pin值,没有研究过): 1、蓝牙设备之间自动配对,需要两个设备都安装进行配对的apk(网上好多自动配对的帖子都没有说明情况) 2、在自动匹配的...
  • cbk861110
  • cbk861110
  • 2016年03月22日 19:49
  • 14670

Android蓝牙实现自动配对,无需输入密码

在项目开发中,需要连接一个蓝牙设备,实现自动配对,经过尝试和分析Android源码,最终问题得以解决: 网上较为流行的ClsUtils工具类并不能满足我的要求, (1)首先分析一下ClsUtils工具...
  • czniuzaiku
  • czniuzaiku
  • 2015年01月21日 22:50
  • 2630

android 连接蓝牙模块教程附源码

由于最近项目需要连接蓝牙,类似于智能手环连接蓝牙模块,网上找了些教程,有一些零零散散的程序,自己于是也写了一个能用,然后我发现谷歌有一个蓝牙的sample,一对比突然发现自己写的好low,不严谨。于是...
  • sinat_28676875
  • sinat_28676875
  • 2016年09月07日 19:04
  • 2897

android蓝牙连接

  • 2016年09月25日 15:10
  • 3KB
  • 下载

Android 蓝牙自动匹配PIN码跳过用户交互

近期项目中需要连接蓝牙设备,起初只是设置蓝牙列表界面让用户点击然后输入默认PIN码,后来改需求了 = = ,要求自动连接指定设备并不需要用户手动输入PIN码,作为Android 小白的我是拒绝的,但是...
  • yi412
  • yi412
  • 2017年04月17日 11:07
  • 1787

RxJava使用(一)基本使用

前言         RxJava及RxAndroid比较详细的介绍可以参考该文档《给 Android 开发者的 RxJava 详解》          基本介绍         React...
  • tangxl2008008
  • tangxl2008008
  • 2016年05月06日 20:07
  • 8971

关于 Android 连接蓝牙的方法

尊重原创,转载请注明出处 今天在看自己的项目时,看到了关于蓝牙连接的这部分,在此做个笔记。在之前,蓝牙连接的方法为: BluetoothDevice.createBond(BluetoothDe...
  • ImSeekbar
  • ImSeekbar
  • 2015年04月20日 09:08
  • 1742

Android蓝牙ble扫描

酒已经准备好了,各位看客,请准备好小板凳。 理论性的东西就不写太多了,推荐一个挺好的博文 http://www.jianshu.com/p/de82f411a7fc  官方文档的翻译(简书): ...
  • qq_35270692
  • qq_35270692
  • 2017年07月30日 00:28
  • 413

android ble 4.0实现自动配对

这几天在开发与蓝牙4.0Ble的通讯,因需求要求android必须能过自动与蓝牙配对。于是就开始上网找资料,查出来最多的就是说是用 ClsUtils 这个类,说利用反射调用封起来的方法,我直接copy...
  • pcw550
  • pcw550
  • 2015年08月25日 00:13
  • 3411

Android Bluetooth蓝牙开发:Bluetooth蓝牙设备配对Paired Bluetooth Devices(2)

 Android Bluetooth蓝牙开发:Bluetooth蓝牙设备配对Paired Bluetooth Devices(2) 不同的Bluetooth进行配对时候,通常会显示如图所示...
  • zhangphil
  • zhangphil
  • 2016年01月18日 17:08
  • 2634
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android开发之蓝牙配对连接的方法
举报原因:
原因补充:

(最多只允许输入30个字)