`
闷骚的小老头
  • 浏览: 26912 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android蓝牙简介

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


0
1
分享到:
评论

相关推荐

    android蓝牙封装代码

    android蓝牙封装代码

    Android蓝牙广播通信

    Android提供了一个名为BluetoothAdapter的类,它是Android蓝牙功能的主要入口点。通过这个类,我们可以检查蓝牙是否开启,扫描附近的蓝牙设备,并建立连接。当我们要监听蓝牙设备的状态变化时,就需要用到广播通信。...

    Android 蓝牙开发,蓝牙连打印机

    首先,理解Android蓝牙API是基础。Android提供了BluetoothAdapter类,它是系统蓝牙服务的主要接口,用于查找、配对和管理蓝牙设备。开发者需要通过BluetoothAdapter.getDefaultAdapter()获取系统的默认蓝牙适配器,...

    Android蓝牙连接设备demo

    "Android蓝牙连接设备demo"是一个示例项目,它演示了如何使用Android SDK来实现BLE 4.0及更高版本的蓝牙设备连接和通信功能。下面我们将深入探讨这个demo涉及的关键知识点。 1. **BLE 4.0与Android支持**:BLE 4.0...

    android蓝牙开发步骤.pdf

    Android 蓝牙开发步骤详解 Android 蓝牙开发步骤是一个复杂的过程,它涉及到硬件、Linux 内核、库、框架和应用程序等多个方面。在本文中,我们将详细介绍 Android 蓝牙开发的步骤,从硬件到应用程序的所有方面。 ...

    android 蓝牙SPP传输demo

    本示例是一个Android蓝牙SPP传输的Demo,它展示了如何在Android应用中实现与蓝牙设备的数据交换。以下是关于这个主题的详细知识: 1. **蓝牙SPP介绍**: - SPP是蓝牙核心规格的一部分,模仿了串口通信,使得不同...

    android蓝牙聊天源代码

    "android蓝牙聊天源代码"项目提供了一个很好的实例,帮助开发者了解如何在Android应用程序中实现蓝牙聊天功能。以下将详细介绍这个项目的相关知识点: 1. **Android Bluetooth API**: Android提供了`...

    Android 蓝牙map协议连接流程图(上层),将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更

    Android 蓝牙map协议连接流程图(上层),将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据收发走向,代码流程更加形象生动,能够很快的熟悉Android 蓝牙源码,利于后面问题处理和BUG解决

    Android蓝牙开发客户端代码

    首先,我们需要理解蓝牙技术的基本概念,然后我们将详细讨论Android蓝牙开发客户端的实现步骤。 蓝牙是一种短距离无线通信技术,允许电子设备之间进行数据交换。在Android中,蓝牙功能主要通过`BluetoothAdapter`、...

    Android蓝牙打印支持图片和文字打印

    首先,我们要理解Android蓝牙打印的基本原理。Android系统提供了一个名为`BluetoothAdapter`的类,用于处理蓝牙连接和通信。通过这个类,我们可以发现可用的蓝牙设备,建立与打印机的连接,并发送数据。要启用蓝牙...

    C#Android蓝牙通信

    【C#与Android之间的蓝牙通信】是移动设备间交互的重要技术之一,特别是在物联网(IoT)和嵌入式系统中广泛应用。本示例是通过C#编写的应用程序与Android设备进行蓝牙连接,实现数据传输,如图片、语音和文字等。这种...

    Android蓝牙设备之间通过UUID通信

    通过分析和运行这些代码,可以更直观地理解Android蓝牙通信的工作原理。 需要注意的是,由于蓝牙通信涉及到权限问题,记得在AndroidManifest.xml中添加`&lt;uses-permission android:name="android.permission....

    android蓝牙间传输demo

    "android蓝牙间传输demo"是一个示例项目,它展示了如何在Android设备之间通过蓝牙进行数据交换。这个项目的重点在于理解和实现Android Bluetooth API,这将涵盖蓝牙的配对、连接、数据发送与接收等关键步骤。 首先...

    安卓wifi蓝牙相关-android蓝牙hid协议开发实现手机连接蓝牙鼠标键盘扫描枪.rar

    本文将深入探讨Android蓝牙HID协议开发的相关知识点,并提供实现手机连接蓝牙外设的基础步骤。 首先,理解蓝牙HID协议至关重要。蓝牙HID是Bluetooth SIG(蓝牙特别兴趣小组)定义的一种标准,主要用于无线连接输入...

    android蓝牙开发简介.pdf

    本文将详细介绍Android蓝牙开发的基础知识,帮助开发者快速入门。 首先,要开启蓝牙功能并进行相关操作,必须在`AndroidManifest.xml`文件中添加必要的权限: ```xml &lt;uses-permission android:name="android....

    Android蓝牙,配对,搜索,连接,通信,断开的Demo

    本项目"Android蓝牙,配对,搜索,连接,通信,断开的Demo"是一个使用Kotlin编写的Android应用示例,它涵盖了蓝牙功能的基本操作,包括设备的搜索、配对、取消配对、连接、数据传输以及断开连接等核心环节。...

    android蓝牙通信(分为客户端,服务端)

    在Android平台上进行蓝牙通信是一项常见的...总的来说,构建Android蓝牙通信系统涉及多个步骤,包括设备发现、连接建立、数据传输和错误处理。通过客户端和服务端的协同工作,可以在Android设备间实现可靠的蓝牙通信。

    Android 打开蓝牙耳机录音

    在Android平台上,实现“蓝牙耳机录音”涉及到一系列的系统服务、API接口以及音频处理技术。以下将详细解析这个过程,并提供关键知识点。 首先,我们来理解“Sco”(Short Range Communication)模式。Sco是蓝牙...

    Android蓝牙扫描

    本文将详细解析如何实现Android蓝牙扫描,包括注册蓝牙扫描广播、使用LeScanCallback回调以及ScanCallback回调这三种方法。 首先,我们要了解Android蓝牙的基础知识。在Android系统中,BluetoothManager类提供了对...

    Android 蓝牙 A2DP播放AVDTP连接,音乐从audio到A2dp蓝牙侧,流程图。

    Android 蓝牙 A2DP播放AVDTP连接,音乐从audio到A2dp蓝牙侧,流程图。非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙...

Global site tag (gtag.js) - Google Analytics