Android开发之ble蓝牙

作者: 晨海宝 | 来源:发表于2017-08-16 21:14 被阅读0次

    前言

    由于自己工作中需要开发ble的项目,于是在折腾了一段时间后也有所了解,便想写下来分享给大家,同时对自己的知识也是一种巩固

    1.BLE介绍

    BLE是Bluetooth Low Energy的缩写,又叫蓝牙4.0,区别于蓝牙3.0和之前的技术。BLE前身是NOKIA开发的Wibree技术,主要用于实现移动智能终端与周边配件之间的持续连接,是功耗极低的短距离无线通信技术,并且有效传输距离被提升到了100米以上,同时只需要一颗纽扣电池就可以工作数年之久。BLE是在蓝牙技术的基础上发展起来的,既同于蓝牙,又区别于传统蓝牙。BLE设备分单模和双模两种,双模简称BR,商标为Bluetooth Smart Ready,单模简称BLE或者LE,商标为Bluetooth Smart。Android是在4.3后才支持BLE,这说明不是所有蓝牙手机都支持BLE,而且支持BLE的蓝牙手机一般是双模的。双模兼容传统蓝牙,可以和传统蓝牙通信,也可以和BLE通信,常用在手机上,android4.3和IOS4.0之后版本都支持BR,也就是双模设备。单模只能和BR和单模的设备通信,不能和传统蓝牙通信,由于功耗低,待机长,所以常用在手环的智能设备上。

    2.连接流程

    android的ble连接流程图.png
    • BluetoothManager
      用BluetoothManager来获取BluetoothAdapter。
      BluetoothManager bluetoothManager =(BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);

    • BluetoothAdapter
      代表了移动设备(如:手机)的本地的蓝牙适配器, 通过该蓝牙适配器可以对蓝牙进行基本操作,一个Android系统只有一个BluetoothAdapter,通过BluetoothManager获取。
      BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();

    • startLeScan()
      既然获得了BluetoothAdapter对象,那么接下来就可以搜索ble设备了,这时就需要用到BluetoothAdapter的startLeScan()这个方法了
      mBluetoothAdapter.startLeScan(mLeScanCallback); //此mLeScanCallback为回调函数

    • onLeScan(BluetoothDevice, rssi, byte[])

      • BluetoothDevice devic 为蓝牙对象可以获得mac地址,名字等信息
      • rssi为信号强度,为负数如:-100
      • scanRecord 为广播包和响应包组成的字节数组
      • 1、当找到对应的设备后,立即停止扫描;
      • 2、不要循环搜索设备,为每次搜索设置适合的时间限制。避免设备不在可用范围 的时候持续不停扫描,消耗电量。
    private LeScanCallback mLeScanCallback = new LeScanCallback() {
        @Override
              public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
                       Log.i(TAG, "onLeScan() DeviceName------>"+device.getName());  
                           
                       if(device.getName() == null){  
                               return;
                       }
                      if (device.getName().contains("xxxxx")) {    //做设备过滤
                                 mBluetoothDevice = device;   //获取到周边设备
                               stopLeScan(); //停止        
                     } 
          }
    };
    
    • BluetoothGatt(连接蓝牙,建立GATT连接)
      mBluetoothGatt = mBluetoothDevice.connectGatt(mContext, false, mGattCallback); //mGattCallback为回调接

    上文已经成功连接ble设备,接下的数据交互操作,需要了解GATT(最后我会贴出全部代码)


    3.什么是GATT?

    GATT全称Generic Attribute Profile,中文名叫通用属性协议,它定义了services和characteristic两种东西来完成低功耗蓝牙设备之间的数据传输。它是建立在通用数据协议Attribute Protocol (ATT),之上的,ATT把services和characteristic以及相关的数据保存在一张简单的查找表中,该表使用16-bit的id作为索引。

    一旦两个设备建立了连接,GATT就开始发挥作用,同时意味着GAP协议管理的广播过程结束了。但是必须要知道的是,建立GATT连接必要经过GAP协议。

    最重要的事情,GATT连接是独占的,也就意味着一个BLE周边设备同时只能与一个中心设备连接。一旦周边设备与中心设备连接成功,直至连接断开,它不再对外广播自己的存在,其他的设备就无法发现该周边设备的存在了。

    周边设备和中心设备要完成双方的通信只能通过建立GATT连接的方式。

    GATT图解.png

    一个ble蓝牙设备有多个包括多个Profile
    一个Profile中有多个服务Service(通过服务的uuid找到对应的Service)
    一个Service中有多个特征Characteristic(通过特征的uuid找到对应的Characteristic)
    一个Characteristic中包括一个value和多个Descriptor(通过Descriptor的uuid找到对应的Descriptor)
    UUID一般硬件工程师会告诉你的!!!

    4.如何开发?

    • 在AndroidManifest.xml添加权限
     <!--  位置权限-->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <!-- 蓝牙权限 -->
        <uses-permission android:name="android.permission.BLUETOOTH"/>
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
        <uses-feature
            android:name="android.hardware.bluetooth_le"
            android:required="true" />
    
    • 获得开位置权限
      android6.0以后搜索ble蓝牙需要获得位置权限,获得位置权限可查看MainActivity.java

    • 由于代码太多我就不贴出来了,具体实现点击下面demo地址查看,先放下效果图
      DEMO地址点击这里

      扫描.jpg
    发指令收广播.jpg

    END


    如果你就得帮助到你了,请点个赞吧!

    相关文章

      网友评论

        本文标题:Android开发之ble蓝牙

        本文链接:https://www.haomeiwen.com/subject/uuptzttx.html