[转载]蓝牙4-Android BLE开发官方文档翻译
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作者 风雨byt (/users/fdba5151fd6e) 2016.03.02 15:07 写了24530字,被50人关注,获得了98个喜欢 (/users/fdba5151fd6e)
添加关注 (/sign_in)
[转载]蓝牙4.0——Android BLE开发官方文档翻译
字数3340 阅读1719 评论2 喜欢19
... } 如果你只想扫描指定类型的外围设备,可以改为调用startLeScan(UUID[], BluetoothAdapter.LeScanCallback)),需要提供 你的app支持的GATT services的UUID对象数组。 作为BLE扫描结果的接口,下面是BluetoothAdapter.LeScanCallback的实现。
发现BLE设备 为了发现BLE设备,使用startLeScan())方法。这个方法需要一个参数BluetoothAdapter.LeScanCallback。你必须实现它 的回调函数,那就是返回的扫描结果。因为扫描非常消耗电量,你应当遵守以下准则: 只要找到所需的设备,停止扫描。 不要在循环里扫描,并且对扫描设置时间限制。以前可用的设备可能已经移出范围,继续扫描消耗电池电量。 下面代码显示了如何开始和停止一个扫描: // 扫描和显示可以提供的蓝牙设备.
// 使用此检查确定BLE是否支持在设备上,然后你可以有选择性禁用BLE相关的功能 if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show(); finish(); }
开启蓝牙 接下来,你需要确认蓝牙是否开启。调用isEnabled())去检测蓝牙当前是否开启。如果该方法返回false,蓝牙被禁用。下面 的代码检查蓝牙是否开启,如果没有开启,将显示错误提示用户去设置开启蓝牙。
// 确保蓝牙在设备上可以开启 if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); }
// 初始化蓝牙适配器 final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter();
安卓4.3(API 18)为BLE的核心功能提供平台支持和API,App可以利用它来发现设备、查询服务和读写特性。相比传统的 蓝牙,BLE更显著的特点是低功耗。这一优点使android App可以与具有低功耗要求的BLE设备通信,如近距离传感器、 心脏速率监视器、健身设备等。 关键术语和概念 Generic Attribute Profile(GATT)—GATT配置文件是一个通用规范,用于在BLE链路上发送和接收被称为“属性”的数据 块。目前所有的BLE应用都基于GATT。 蓝牙SIG规定了许多低功耗设备的配置文件。配置文件是设备如何在特定的应用 程序中工作的规格说明。注意一个设备可以实现多个配置文件。例如,一个设备可能包括心率监测仪和电量检测。 Attribute Protocol(ATT)—GATT在ATT协议基础上建立,也被称为GATT/ATT。ATT对在BLE设备上运行进行了优化, 为此,它使用了尽可能少的字节。每个属性通过一个唯一的的统一标识符( UUID )来标识,每个 String 类型 UUID 使用 128 bit标准格式。属性通过ATT被格式化为characteristics和services。 Characteristic 一个characteristic包括一个单一变量和0n个用来描述characteristic变量的descriptor,characteristic可以被 认为是一个类型,类似于类。 Descriptor Descriptor 用来描述 characteristic 变量的属性。例如,一个 descriptor 可以规定一个可读的描述,或者一个 characteristic变量可接受的范围,或者一个characteristic变量特定的测量单位。 Service service是characteristic的集合。例如,你可能有一个叫“Heart Rate Monitor(心率监测仪)”的service,它包括了很 多characteristics,如“heart rate measurement(心率测量)”等。你可以在 找到一个目前支持的基于GATT的配 置文件和服务列表。 角色和责任 以下是Android设备与BLE设备交互时的角色和责任: 中央 VS 外围设备。 适用于BLE连接本身。中央设备扫描,寻找广播;外围设备发出广播。 GATT 服务端 VS GATT 客户端。决定了两个设备在建立连接后如何互相交流。 为了方便理解,想象你有一个Android手机和一个用于活动跟踪BLE设备,手机支持中央角色,活动跟踪器支持外围(为 了建立BLE连接你需要注意两件事,只支持外围设备的两方或者只支持中央设备的两方不能互相通信)。 当手机和运动追踪器建立连接后,他们开始向另一方传输GATT数据。哪一方作为服务器取决于他们传输数据的种类。例 如,如果运动追踪器想向手机报告传感器数据,运动追踪器是服务端。如果运动追踪器更新来自手机的数据,手机会作为 服务端。 在这份文档的例子中,android app(运行在android设备上)作为GATT客户端。app从gatt服务端获得数据,gatt服务端即 支持Heart Rate Profile(心率配置)的BLE心率监测仪。但是你可以自己设计android app去扮演GATT服务端角色。更多信 息见BluetoothGattServer。
<uses‐permission android:name="android.permission.BLUETOOTH"/>
Hale Waihona Puke <uses‐permission android:name="android.permission.BLUETOOTH_ADMIN"/>"
如果想声明你的app只为具有BLE的设备提供,在manifest文件中包括:
private LeDeviceListAdapter mLeDeviceListAdapter; ... // Device scan callback. private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { runOnUiThread(new Runnable() { @Override public void run() { mLeDeviceListAdapter.addDevice(device); mLeDeviceListAdapter.notifyDataSetChanged(); } }); } };
App下载 (/apps/download?utm_medium=topsuggdown&utm_source=noteshow)
登录 (/sign_in)
// 10秒后停止寻找. private static final long SCAN_PERIOD = 10000; ... private void scanLeDevice(final boolean enable) { if (enable) { // 经过预定扫描期后停止扫描 mHandler.postDelayed(new Runnable() { @Override public void run() { mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } }, SCAN_PERIOD); mScanning = true; mBluetoothAdapter.startLeScan(mLeScanCallback); } else { mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } ... }
设置BLE 你的app能与BLE通信之前,你需要确认设备是否支持BLE,如果支持,确认已经启用。注意如果<usesfeature.../>设置 为false,这个检查才是必需的。 如果不支持BLE,那么你应该适当地禁用部分BLE功能。如果支持BLE但被禁用,你可以无需离开应用程序而要求用户启 动蓝牙。使用BluetoothAdapter两步完成该设置。 获取 BluetoothAdapter 所有的蓝牙活动都需要蓝牙适配器。BluetoothAdapter代表设备本身的蓝牙适配器(蓝牙无线)。整个系统只有一个蓝牙适 配器,而且你的app使用它与系统交互。下面的代码片段显示了如何得到适配器。注意该方法使用getSystemService()] 返回BluetoothManager,然后将其用于获取适配器的一个实例。Android 4.3(API 18)引入BluetoothManager。
BLE权限 为了在app中使用蓝牙功能,必须声明蓝牙权限BLUETOOTH。利用这个权限去执行蓝牙通信,例如请求连接、接受连 接、和传输数据。 如 果 想 让 你 的 app 启 动 设 备 发 现 或 操 纵 蓝 牙 设 置 , 必 须 声 明 BLUETOOTH_ADMIN 权 限 。 注 意 : 如 果 你 使 用 BLUETOOTH_ADMIN权限,你也必须声明BLUETOOTH权限。 在你的app manifest文件中声明蓝牙权限。
<uses‐feature android:name="android.hardware.bluetooth_le" android:required="true"/>
但是如果想让你的app提供给那些不支持BLE的设备,需要在manifest中包括上面代码并设置required="false",然后在运 行时可以通过使用PackageManager.hasSystemFeature()确定BLE的可用性。
public class DeviceScanActivity extends ListActivity { private BluetoothAdapter mBluetoothAdapter; private boolean mScanning; private Handler mHandler; 注册 (/sign_up) 简
添加关注 (/sign_in)
[转载]蓝牙4.0——Android BLE开发官方文档翻译
字数3340 阅读1719 评论2 喜欢19
... } 如果你只想扫描指定类型的外围设备,可以改为调用startLeScan(UUID[], BluetoothAdapter.LeScanCallback)),需要提供 你的app支持的GATT services的UUID对象数组。 作为BLE扫描结果的接口,下面是BluetoothAdapter.LeScanCallback的实现。
发现BLE设备 为了发现BLE设备,使用startLeScan())方法。这个方法需要一个参数BluetoothAdapter.LeScanCallback。你必须实现它 的回调函数,那就是返回的扫描结果。因为扫描非常消耗电量,你应当遵守以下准则: 只要找到所需的设备,停止扫描。 不要在循环里扫描,并且对扫描设置时间限制。以前可用的设备可能已经移出范围,继续扫描消耗电池电量。 下面代码显示了如何开始和停止一个扫描: // 扫描和显示可以提供的蓝牙设备.
// 使用此检查确定BLE是否支持在设备上,然后你可以有选择性禁用BLE相关的功能 if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show(); finish(); }
开启蓝牙 接下来,你需要确认蓝牙是否开启。调用isEnabled())去检测蓝牙当前是否开启。如果该方法返回false,蓝牙被禁用。下面 的代码检查蓝牙是否开启,如果没有开启,将显示错误提示用户去设置开启蓝牙。
// 确保蓝牙在设备上可以开启 if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); }
// 初始化蓝牙适配器 final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter();
安卓4.3(API 18)为BLE的核心功能提供平台支持和API,App可以利用它来发现设备、查询服务和读写特性。相比传统的 蓝牙,BLE更显著的特点是低功耗。这一优点使android App可以与具有低功耗要求的BLE设备通信,如近距离传感器、 心脏速率监视器、健身设备等。 关键术语和概念 Generic Attribute Profile(GATT)—GATT配置文件是一个通用规范,用于在BLE链路上发送和接收被称为“属性”的数据 块。目前所有的BLE应用都基于GATT。 蓝牙SIG规定了许多低功耗设备的配置文件。配置文件是设备如何在特定的应用 程序中工作的规格说明。注意一个设备可以实现多个配置文件。例如,一个设备可能包括心率监测仪和电量检测。 Attribute Protocol(ATT)—GATT在ATT协议基础上建立,也被称为GATT/ATT。ATT对在BLE设备上运行进行了优化, 为此,它使用了尽可能少的字节。每个属性通过一个唯一的的统一标识符( UUID )来标识,每个 String 类型 UUID 使用 128 bit标准格式。属性通过ATT被格式化为characteristics和services。 Characteristic 一个characteristic包括一个单一变量和0n个用来描述characteristic变量的descriptor,characteristic可以被 认为是一个类型,类似于类。 Descriptor Descriptor 用来描述 characteristic 变量的属性。例如,一个 descriptor 可以规定一个可读的描述,或者一个 characteristic变量可接受的范围,或者一个characteristic变量特定的测量单位。 Service service是characteristic的集合。例如,你可能有一个叫“Heart Rate Monitor(心率监测仪)”的service,它包括了很 多characteristics,如“heart rate measurement(心率测量)”等。你可以在 找到一个目前支持的基于GATT的配 置文件和服务列表。 角色和责任 以下是Android设备与BLE设备交互时的角色和责任: 中央 VS 外围设备。 适用于BLE连接本身。中央设备扫描,寻找广播;外围设备发出广播。 GATT 服务端 VS GATT 客户端。决定了两个设备在建立连接后如何互相交流。 为了方便理解,想象你有一个Android手机和一个用于活动跟踪BLE设备,手机支持中央角色,活动跟踪器支持外围(为 了建立BLE连接你需要注意两件事,只支持外围设备的两方或者只支持中央设备的两方不能互相通信)。 当手机和运动追踪器建立连接后,他们开始向另一方传输GATT数据。哪一方作为服务器取决于他们传输数据的种类。例 如,如果运动追踪器想向手机报告传感器数据,运动追踪器是服务端。如果运动追踪器更新来自手机的数据,手机会作为 服务端。 在这份文档的例子中,android app(运行在android设备上)作为GATT客户端。app从gatt服务端获得数据,gatt服务端即 支持Heart Rate Profile(心率配置)的BLE心率监测仪。但是你可以自己设计android app去扮演GATT服务端角色。更多信 息见BluetoothGattServer。
<uses‐permission android:name="android.permission.BLUETOOTH"/>
Hale Waihona Puke <uses‐permission android:name="android.permission.BLUETOOTH_ADMIN"/>"
如果想声明你的app只为具有BLE的设备提供,在manifest文件中包括:
private LeDeviceListAdapter mLeDeviceListAdapter; ... // Device scan callback. private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { runOnUiThread(new Runnable() { @Override public void run() { mLeDeviceListAdapter.addDevice(device); mLeDeviceListAdapter.notifyDataSetChanged(); } }); } };
App下载 (/apps/download?utm_medium=topsuggdown&utm_source=noteshow)
登录 (/sign_in)
// 10秒后停止寻找. private static final long SCAN_PERIOD = 10000; ... private void scanLeDevice(final boolean enable) { if (enable) { // 经过预定扫描期后停止扫描 mHandler.postDelayed(new Runnable() { @Override public void run() { mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } }, SCAN_PERIOD); mScanning = true; mBluetoothAdapter.startLeScan(mLeScanCallback); } else { mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } ... }
设置BLE 你的app能与BLE通信之前,你需要确认设备是否支持BLE,如果支持,确认已经启用。注意如果<usesfeature.../>设置 为false,这个检查才是必需的。 如果不支持BLE,那么你应该适当地禁用部分BLE功能。如果支持BLE但被禁用,你可以无需离开应用程序而要求用户启 动蓝牙。使用BluetoothAdapter两步完成该设置。 获取 BluetoothAdapter 所有的蓝牙活动都需要蓝牙适配器。BluetoothAdapter代表设备本身的蓝牙适配器(蓝牙无线)。整个系统只有一个蓝牙适 配器,而且你的app使用它与系统交互。下面的代码片段显示了如何得到适配器。注意该方法使用getSystemService()] 返回BluetoothManager,然后将其用于获取适配器的一个实例。Android 4.3(API 18)引入BluetoothManager。
BLE权限 为了在app中使用蓝牙功能,必须声明蓝牙权限BLUETOOTH。利用这个权限去执行蓝牙通信,例如请求连接、接受连 接、和传输数据。 如 果 想 让 你 的 app 启 动 设 备 发 现 或 操 纵 蓝 牙 设 置 , 必 须 声 明 BLUETOOTH_ADMIN 权 限 。 注 意 : 如 果 你 使 用 BLUETOOTH_ADMIN权限,你也必须声明BLUETOOTH权限。 在你的app manifest文件中声明蓝牙权限。
<uses‐feature android:name="android.hardware.bluetooth_le" android:required="true"/>
但是如果想让你的app提供给那些不支持BLE的设备,需要在manifest中包括上面代码并设置required="false",然后在运 行时可以通过使用PackageManager.hasSystemFeature()确定BLE的可用性。
public class DeviceScanActivity extends ListActivity { private BluetoothAdapter mBluetoothAdapter; private boolean mScanning; private Handler mHandler; 注册 (/sign_up) 简