美文网首页
Android-BLE

Android-BLE

作者: 背着蘑菇的鸡蛋 | 来源:发表于2016-05-11 12:03 被阅读0次

    BLE 工作原理?

    BLE 根据需要提供短数据包,然后关闭链路。 这是蓝牙 LE 实现低能耗的原因之一。 相比于常规蓝牙的传统配对方法,BLE 设备仅在需要收发信息时进行链接。
    BLE 的通信方式极其严密。 设备显示收发数据的服务,后者包含称之为特征的内容,以定义可共享的数据。 如需获取更多详情,特征可包含描述符,帮助定义数据。 例如,您可以拥有一项标记为 "Heart Rate Monitor" 的服务,该服务包含 "heart rate measurement" 等特征。
    大多数蓝牙 LE API 都支持搜索本地设备和发现有关这些设备的服务、特征和描述符。

    BLE 关键术语和概念

    下面简单介绍启动 BLE 项目之前应该了解的关键 BLE 术语和概念。

    通用属性配置文件 (GATT)

    GATT 配置文件是关于通过蓝牙低能耗链路收发短数据片(称为 "属性")的通用规范。 当前所有的 LE 应用配置文件均以 GATT 为基础。 蓝牙特别兴趣小组 (SIG) (https://www.bluetooth.org) 对 BLE 设备的配置文件数量进行了预定义。 这些配置文件是关于描述设备使用方法的规范。

    属性协议 (ATT)

    属性协议 (ATT) 指 GATT 的构建基础。 ATT 是专门针对 BLE 设备而设计的优化型协议。 ATT 通信发送字节尽可能少的数据。 所有属性均带有通用唯一标识符 (UUID),后者为标准的 128 位字符串 ID,以唯一的方式识别信息。 ATT 传输的属性被格式化为特征和服务(定义如下)。

    特征(Characteristic)

    特征包含一个单独数值以及 0 或多个描述符(见下文)以描述特征的值。

    描述符 (Descriptor)

    描述符指定义了的属性,可描述特征值。 它们可能是人类可读的描述,可注明单位或测量,或定义可接受的数值范围。

    服务(Service)

    服务指特征的集合。 下列链接提供了基于现有 GATT 的配置文件列表:
    比如。有个蓝牙ble的血压计。他可能包括多个Servvice,每个Service有包括多个Characteristic
    注意:蓝牙ble只能支持Android 4.3以上的系统 SDK>=18
    https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx

    Android 中的 BLE

    您可以访问下列链接,从 GitHub 下载完整的项目:
    https://github.com/adrianstevens/Edison_to_Android_BLE/tree/master/Android/BLEConnect
    但我建议您构建自己的项目,并参考上述链接逐行写入代码。
    创建新项目
    打开 Android Studio(或选择的 IDE),创建新的空白 Android 应用,并将其命名为 BLEConnect。 请务必将最低 SDK 设置为至少 API 18。 否则,您将无法使用 BLE API。

    图1

    接下来打开 AndroidManifest.xml,并在 <application>标签上方添加下列内容,以添加所需的权限:
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>

    判断是否支持,打开和关闭蓝牙

    为引用 Bluetooth Manager,我们首先应查看设备是否提供 BLE,调用 **getSystemService
    ** 以引用 Bluetooth Manager (BluetoothManager
    )
    ,然后调用 **getAdapter()
    ** 方法,以引用 **BluetoothAdapter
    ** 项目。 或者,您还可以直接从 Bluetooth Manager 类使用静态帮助方法 getDefaultAdapter

    //check to see if Bluetooth Low Energy is supported on this device
        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
            Toast.makeText(this, "BLE not supported on this device", Toast.LENGTH_SHORT).show();
            finish();
        }
    
        statusUpdate("BLE supported on this device");
    
        //get a reference to the Bluetooth Manager
        final BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = mBluetoothManager.getAdapter();
        if (mBluetoothAdapter == null) {
            Toast.makeText(this, "BLE not supported on this device", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }
    
        //Open settings if Bluetooth isn't enabled
        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        }
    
        if (mBluetoothAdapter == null) {
            Toast.makeText(this, "Bluetooth disabled", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }
    
        //try to find the Grove BLE V1 module
        searchForDevices();
    }
    

    搜索附近的 BLE 设备

    搜索设备时,我们使用计时器搜索特定时间段。 我们调用 Bluetooth manager 项目中的 **startLeScan
    **,并传入至回调项目,以知晓是否搜索到设备。
    API 持续扫描设备,因此,我们可能会在每台设备的 **LeScanCallback
    ** 中接收到多个通知,所以在保存之前,我们应确认该设备入口的唯一性。 我们还要检查模块的设备名称,并保存引用。 就本示例而言,我们实际上不需要将设备保存在列表中。

    mHandler.postDelayed(newRunnable() {
                    @Override
                    public void run() {
                        mScanning = false;
                       mBluetoothAdapter.stopLeScan(mLeScanCallback);
                    }
                }, SCAN_PERIOD); 
                mScanning = true;
               mBluetoothAdapter.startLeScan(mLeScanCallback);
    
    privateBluetoothAdapter.LeScanCallback mLeScanCallback =
            newBluetoothAdapter.LeScanCallback() {
            @Override
            public void onLeScan(finalBluetoothDevice device, int rssi, byte[] scanRecord) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mLeDeviceListAdapter.addDevice(device);
                       mLeDeviceListAdapter.notifyDataSetChanged();
                    }
                });
            }
    };
    

    查找通信服务

    大多数 BLE 设备都会显示一个或多个服务以供通信/互动。 Grove BLE 中的 TI CC2540 包含一个 ID 为 “0000ffe0-0000-1000-8000-00805f9b34fb” 的关键服务。 接下来,我们将查找引用,并将其保存至该服务。
    首先,我们需要连接设备。 为了知晓连接时间或查找到服务的时间,我们需要 **BluetoothGattCallback
    ** 项目,并覆盖 **onConnectionStateChanged
    ** 和 **onServicesDiscovered
    **。
    请注意,使用 onConnectionStateChanged
    ** 方法时,如果获悉连接成功,我们可调用
    mBluetoothGatt.discoverServices()
    ** 搜索服务。 识别到所需的服务后,我们可以继续发送消息。

    public void onConnectionStateChange (BluetoothGatt gatt, int status, int newState){ …}
    @Override
    public void onServicesDiscovered (BluetoothGatt gatt, int status) { …}```
    
    许多其他方法可以被覆盖。 请访问此处参阅其中的文档:
    [https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html](https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html)

    相关文章

      网友评论

          本文标题:Android-BLE

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