简介:

Android 提供支持传统蓝牙和低功耗蓝牙的默认蓝牙堆栈。借助蓝牙,Android 设备可以创建个人区域网络,以便通过附近的蓝牙设备发送和接收数据。

在 Android 4.3 及更高版本中,Android 蓝牙堆栈可提供实现低功耗蓝牙 (BLE) 的功能。为了充分利用 BLE API,请遵循  Android 蓝牙 HCI 要求。具有合格芯片组的 Android 设备可以实现传统蓝牙或同时实现传统蓝牙和 BLE。BLE 不能向后兼容较低版本的蓝牙芯片组。

Android 架构

蓝牙应用通过 Binder 与蓝牙进程进行通信。蓝牙进程使用 JNI 与蓝牙堆栈通信,并向开发者提供对各种蓝牙配置文件的访问权限。下图显示了蓝牙堆栈的常规结构:

IOT Android 之BLE技术APP实现_Android

APP层实现:
 关键术语:

通用属性配置文件 (GATT):GATT 配置文件是一种通用规范,内容针对在 BLE链路上发送和接收称为“属性”的简短数据片段。所有最新的 BLE 应用配置文件都基于 GATT。

Characteristic(特征值):BLE设备上存储数据的基本单元,可以理解为一个数据类型。它包括一个value(值)和0至多个对此characteristic的描述(Descriptor)。 描述符:对Characteristic的描述,如范围、单位等。它是可选的,并提供关于特征值的元数据。

Service(服务):Characteristic的集合,它可以包含多个Characteristic。每个BLE设备可以包含一个或多个服务,而每个服务又可以包含一个或多个特征值(Characteristic)。

UUID(通用唯一识别码):用于唯一标识BLE设备中的服务、特征值和描述符。UUID可以是标准的16位或128位,也可以是自定义的。

通知(Notify)与指示(Indicate):这是BLE中两种用于数据更新的机制。当特征值的值发生变化时,外围设备可以向中心设备发送通知或指示。通知是单向的,可能无法保证可靠传递;而指示则具有确认机制,可以确保通知被接收。

MTU :在一个蓝牙数据包中能够传输的最大数据量。

Android 端广播及连接+GATT模式实现

1,所需权限:

<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

2,发现设备:

判断是否支持==>获取bluetoothAdapter==>判断是否开启蓝牙==>startScan===>发现设备device。

(Note:如需更详细的扫描策略 可使用ScanSettings 对扫描进行管理或者使用ScanFilter搜索特定设备)

/**
     * 设备是否支持蓝牙模块
     */
fun isSupportBle(context: Context): Boolean {
          
          
    return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2
            && context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE))
    }

private  fun getBluetoothAdapter(context: Context):BluetoothAdapter{
          
          
    val bluetoothManager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager?
        val bluetoothAdapter = bluetoothManager!!.adapter
        return bluetoothAdapter
    }


fun startBlueScan(context: Context){
          
          
    if(!isSupportBle(context)){
          
          
        return
        }
    //get the bluetoothAdapter
    val bluetoothAdapter =