android4.3 nei内置了ble并为上层app提供相应的接口来使用BLE功能。

BLE主要涉及的协议及术语:

GenericAttribute Profile (GATT)

BLE上层的协议都是基于GATT,它是一个通用的规范,通过BLE连接发送/接收属性值。

bluetoothSIG定义了很多的ble协议。

AttributeProtocol (ATT)

GATT是建立在ATT之上。也被称为GATT/ATT。

ATT运行在ble设备上,所以被优化,尽可能的占用较少的字节。

每一个属性被指定一个UUID,通过ATT传输的属性被格式化位特性(characteristics)或服务(services)。

Characteristic

一个特性包含一个单一的值和0-n个描述符(Descriptor)来描述这个特性值。一个特性可以被看作一个类型。

Descriptor

描述符被定义为属性,这些属性用来描述特性的值。

例如:规定特性值的取值范围,特性值的单位等

Service

服务是一组特性的集合。例如:“心率检测”服务包含“心速测量”的特性。

角色和职责

中心与外围:被应用于BLE连接本身,中心角色设备扫描/寻找广播,外围设备角色发出广播。

GATTserver vs. GATT client:

这个决定了两个设备在建立连接之后如何交互。

android手机和BLE设备的区别:手机支持中心角色(centralrole),BLE设备支持peripheralrole。

一旦建立连接,他们就开始相互传输gatt数据,根据传输的数据的种类其中的一个可能作为服务器。

如果BLE设备想报告数据给手机,它可能让BLE设备的传感器作为服务器。如果BLE设备准备接收来自手机的数据,手机的传感器就作为服务端。

以上例子说明:androidapp 是GATT client,GATTclient 从GATT server 获取数据。也可以设计android app 作为GATTserver。

BLE权限:

<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"/>

如果想把app提供给不支持BLE的设备需要设置android:required="fasle",然后在运行时进行判断:

if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {    Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
    finish();
}

设置BLE

1:获取BluetoothAdapter

BluetoothAdapter是所有蓝牙功能所必需的,整个系统只有一个BluetoothAdapter,获取BluetoothAdapter之后就可以进行各种蓝牙的操作了。

// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager =(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

2:启动蓝牙

通过isEnabled()判断是否启动,如果没有启动,通过下面的方式启动:

private BluetoothAdapter mBluetoothAdapter;
...
// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

3:查找BLE设备

通过startLeScan查找LE设备,并实现LeScanCallback作为参数。

注意事项:1:一旦找到所查找的设备,立即停止扫描

2:设置扫描超时,避免循环扫描。

public class DeviceScanActivity extends ListActivity {private BluetoothAdapter mBluetoothAdapter;private boolean mScanning;private Handler mHandler;// Stops scanning after 10 seconds.private static final long SCAN_PERIOD = 10000;...private void scanLeDevice(final boolean enable) {if (enable) {// Stops scanning after a pre-defined scan period.mHandler.postDelayed(new Runnable() {@Overridepublic void run() {mScanning = false;mBluetoothAdapter.stopLeScan(mLeScanCallback);}}, SCAN_PERIOD);mScanning = true;mBluetoothAdapter.startLeScan(mLeScanCallback);} else {mScanning = false;mBluetoothAdapter.stopLeScan(mLeScanCallback);}...}
...
}

如果需要查找特定类型的LE设备,需要使用startLeScan(UUID[],BluetoothAdapter.LeScanCallback()),提供一个你的设备支持的服务的UUID数组。

LeScanCallback的实现:

private LeDeviceListAdapter mLeDeviceListAdapter;
...
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =new BluetoothAdapter.LeScanCallback() {@Overridepublic void onLeScan(final BluetoothDevice device, int rssi,byte[] scanRecord) {runOnUiThread(new Runnable() {@Overridepublic void run() {mLeDeviceListAdapter.addDevice(device);mLeDeviceListAdapter.notifyDataSetChanged();}});}
};

注意:要么搜索经典蓝牙,要么搜索BLE,两者不能同时搜索。

连接GATTserver

使用connectGatt连接到BLE设备的GATT server,

mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

将会返回一个BluetoothGatt实例,通过这个实例可以进行Gattclient的各种操作。调用者(androidapp)是Gattclient。GattCallback用来提供结果给客户端。

读取BLE的属性

如果androidapp已经连接了Gatt server并且发现了服务,就能够进行属性的读写了。

收取Gatt的通知

通常BLEapp需要被通知,如果BLE设备的特性发生了改变。

使用setCharacteristicNotification方法为一个特性设置通知:

private BluetoothGatt mBluetoothGatt;
BluetoothGattCharacteristic characteristic;
boolean enabled;
...
mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
...
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor);

一旦一个特性被设置为通知可用,远端设备的特性发生改变就会触发onCharacteristicChanged

回调。

@Override
// Characteristic notification
public void onCharacteristicChanged(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic) {broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}

关闭clientapp

结束和BLE设备的通讯后,需要释放资源:

public void close() {if (mBluetoothGatt == null) {return;}mBluetoothGatt.close();mBluetoothGatt = null;
}

android BLE相关推荐

  1. android手机上的ancs,Android BLE开发之操作IOS ANCS

    前言 之前写过两篇有关于ANCS的文章,最近一段时间老是有人问关于得到ANCS服务的问题,因为IOS ANCS不同于其他的Peripheral一样对周边所有的蓝牙设备广播自己,而是仅有连接上配对并连接 ...

  2. Android BLE学习(一): Android搜索BLE设备

    http://my.csdn.net/lidec 背景 总结一下最近ble的学习情况.自从入手ble 51822开发板后就开始不停加班,中途出于好奇,业余时间写了一些单片机上json解析相关的东西,妄 ...

  3. android BLE Peripheral 手机模拟设备发出BLE广播 BluetoothLeAdvertiser

    android 从4.3系统开始可以连接BLE设备,这个大家都知道了.iOS是从7.0版本开始支持BLE.android 进入5.0时代时,开放了一个新功能,手机可以模拟设备发出BLE广播, 这个新功 ...

  4. Android BLE蓝牙详细解读

    代码地址如下: http://www.demodashi.com/demo/15062.html 随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环.心率检测仪.以及各式各样的智能 ...

  5. 快速接入 Android BLE 开发的基础框架

    代码地址如下: http://www.demodashi.com/demo/12092.html * Android BLE基础操作框架,基于回调,操作简单.包含扫描.多连接.广播包解析.服务读写及通 ...

  6. Android BLE(3) ---FastBle解析

    Android BLE开发详解和FastBle源码解析 项目中有用到了蓝牙相关的功能,所以之前也断断续续地针对蓝牙通信尤其是BLE通信进行了一番探索,整理出了一个开源框架FastBle与各位分享经验. ...

  7. Android BLE(1)---蓝牙通讯学习

    Android BLE蓝牙通讯学习 在app应用的开发过程中,一般和蓝牙接触的不多,但是随着智能穿戴设备的发展,穿戴设备和手机关联的app越来越多,之前也是没怎么接触过这一块的东西,正好最近需要做一个 ...

  8. Android 系统(252)---Android:BLE智能硬件开发详解

    Android:BLE智能硬件开发详解 目录 前言 BLE是个什么鬼 BLE中的角色分工 主要的关键词和概念  GATT(Generic Attribute Profile ) Characteris ...

  9. Android BLE新手进入

    我们提到了中央设备(central)和外围设备(peripheral),在这里我们可以这样简单的理解: 中央设备(central): 收到外围设备发出的广播信号后能主动发起连接的主设备, 例如我们给摩 ...

  10. android蓝牙设置特征属性,Android BLE蓝牙详细解读(二)

    上篇文章主要介绍了关于BLE的一些基础操作,我们能够大概了解到蓝牙操作的一些流程,上文末介绍了本人的一个BLE开源库,支持蓝牙一对多的连接方式,该库封装了蓝牙的开启.扫描.连接.断开.连接超时...一 ...

最新文章

  1. DNS 到底怎么工作的? (How does dns work?)
  2. PIE SDK与IDL算法结合说明文档
  3. 职业-把工作当作职业 or 事业?
  4. Android_TextSwitcher和ImageSwitcher
  5. c++ 多重背包状态转移方程_【模板】各种背包问题amp;讲解
  6. centOS7 Minima无法上网解决方案(Linux设置开机自动获取ip地址)
  7. PP管和PPR管的区别在哪
  8. Redis 05_List列表 数组 Hash散列
  9. iPhone UITableViewCell如何滚动到视图顶端。
  10. 修改mysql数据库默认存储引擎和默认编码
  11. SpringBoot2.1.5(18)--- 国际化配置,SpringBoot Locale 国际化使用方法
  12. 根据线程名获取线程及停止线程
  13. 凿渠造舟:视频会议的昨天与明天
  14. JavaScript闭包函数的理解
  15. 【车间调度】基于matlab粒子群算法求解6X6车间调度问题【含Matlab源码 411期】
  16. csdn下载频道积分规则
  17. 石河子大学计算机研究生好考吗,石河子大学2020考研经验分享
  18. CycleGan脱衣服(男人)
  19. sm-crypto配合hutool加解密报pad block corrupted错误
  20. 蓝牙协议栈HFP SCO连接流程

热门文章

  1. 2020最新个人博客搭建教程:Wordpress+免费精美主题搭建个人博客
  2. python数字转英文_「年月日英文」python英文日期转数字年月日格式 - seo实验室
  3. matlab 谐振腔,使用Matlab编程验证谐振腔的稳定条件。
  4. Android ART介绍
  5. 朝向能学习, 思考和计划的机器进发——图灵奖得主杨立昆:GPT模式五年就不会有人用了,世界模型才是AGI未来
  6. TNS Listener Hang, New Child Listener Process Forked
  7. python之del
  8. javascript网页二次元3D小人详细教程
  9. ❤️软件设计师之系统安全分析与设计大总结(莽起来)❤️
  10. bp神经网络的训练方法,bp神经网络训练流程图