android开发之蓝牙配对连接的方法「建议收藏」

新年第一篇。最近在做蓝牙开锁的小项目,手机去连接单片机总是出现问题,和手机的连接也不稳定,看了不少蓝牙方面的文档,做了个关于蓝牙连接的小结。在做android蓝牙串口连接的时候一般会使用BluetoothSocket tmp = null;// Get a BluetoothSocket for a connection with the// given BluetoothDevi

大家好,又见面了,我是全栈君。

新年第一篇。

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

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

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);
}

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

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

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

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

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

 

    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();
            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;
        }  
    }

 

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

    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进行蓝牙连接最好先进行配对操作。

 

作者:jason0539

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

扫码关注我微信公众号

android开发之蓝牙配对连接的方法「建议收藏」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121375.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c++动态库和静态库的区别_静态库里面包含动态库

    c++动态库和静态库的区别_静态库里面包含动态库                                          C++静态库与动态库这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书《程序员的自我修养——链接…

    2022年9月30日
    4
  • 0范数 无穷范数 上确界[通俗易懂]

    无穷范数——向量中最大元素的绝对值0范数——向量中非0的元素的个数(或#表示)1范数参考上篇文章:范数概念 “上确界”的概念是数学分析中最基本的概念。考虑一个实数集合M.如果有一个实数S,使得M中任何数都不超过S,那么就称S是M的一个上界。  在所有那些上界中如果有一个最小的上界,就称为M的上确界。  一个有界数集有无

    2022年4月8日
    96
  • laravel5.6 调用第三方类库

    laravel5.6 调用第三方类库

    2021年11月5日
    43
  • 如何制作一个简单的网页(二)_简单的个人网页

    如何制作一个简单的网页(二)_简单的个人网页使用HTML和CSS来制作一个简单的网页前言一、HTML1.1常见元素介绍1.2借助工具,浏览器开发者工具二、实现个人名片1.基本框架2.使用CSS美化1.CSS书写位置1、以元素的style属性来指定(内联样式)2、以style标签包裹(内部样式)3、以外部文件的方式 (外部样式)2.CSS中的选择器1.标签选择器2.id选择器3.类选择器4.子元素选择器前言HTML负责描述了网页的整体骨架CSS负责描述了页面样式利用其完成一个简单的个人建立网页。一、HTMLHTML不是

    2022年10月10日
    2
  • 【Android开发经验】使用Ant批量打包Android应用全然指南

    【Android开发经验】使用Ant批量打包Android应用全然指南

    2022年2月3日
    58
  • Excel去除空行的各种方法_批量删除所有空行

    Excel去除空行的各种方法_批量删除所有空行本文转载至:https://baijiahao.baidu.com/s?id=1590204478648348952&wfr=spider&for=pc,需要详细信息可链接查看方法一

    2022年8月2日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号