Android-BLE

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容

  • Key Terms And Concepts 关键术语和概念 Here is a summary of key B...
    Jaesoon阅读 2,432评论 0 5
  • 一、方法 使用开源库fastble 使用开源库baseble 使用原生接口 二、声明权限 如果您要声明您的应用仅适...
    小黎1993阅读 325评论 0 0
  • 安卓4.3(API 18)为BLE的核心功能提供平台支持和API,App可以利用它来发现设备、查询服务和读写特性。...
    风雨byt阅读 14,058评论 3 43
  • 前言: 本文主要描述Android BLE的一些基础知识及相关操作流程,不牵扯具体的业务实现,其中提供了针对广播包...
    幻影宇寰阅读 5,345评论 6 19
  • BLE 即 Bluetooth Low Energy,蓝牙低功耗技术,是蓝牙4.0引入的新技术。现在越来越多的智能...
    fengmlo阅读 8,095评论 3 10