在看Android4.42的源代码时看到有加入对BLE设备的处理。看的一头雾水,多方百度,最终有种柳暗花明的感觉。
本文总结来源于百度多篇文章,欢迎转载。分享交流
BLE蓝牙概念
BLE:Bluetooth low Energy 低能耗蓝牙,实现低成本,短距离的无线传输。传输速率于传统蓝牙同样位2.4GHZ。採用很高速的连接方式,适用于发送数据量少并且发送次数较少的蓝牙通信
相比于传统蓝牙
- BLE蓝牙设备的传输距离最远可达100米
- 发送数据所需时间短(<3ms)
- 响应延时时间短(6ms)
- 低能耗
- 主要应用于仅仅能穿戴,汽车。家用电子等
BLE通信协议
在进行BLE通信时通信两方分为外围(Periphery)和*(Central)
1,外围用于提供数据
2。*用于接收和处理数据
相当于集中式布局。*可接收多个外围的数据,但外围仅仅能向一个*发送数据,也就是说一个*同一时候可连接多个外围设备,但一个外围设备仅仅能连接一个*
3,主要类
i>,BluetoothGattServer:外围设备要发送的数据
ii>。BluetoothServerCallback:返回外围设备的状态
iii>,BluetoothGatt:*使用和处理数据
iv>。BluetoothGattCallBack:返回*设备的状态
使用ble通信能够包括多个Profile,一个profile能够包括多个service。一个service能够包括多个特征characteristic。
眼下所使用的Android手机仅仅能作为*使用和处理数据,接下来介绍下怎样去创建一个*
创建*(Central)
- 在配置文件里加入蓝牙的权限
- 获取本地蓝牙适配器mBluetoothAdapter = BluetoothAapter.getDefaultAdapter()
- 扫描附近可用的BLE蓝牙设备mBluetoothAdapter.startLeScan(mLeScanCallback);传入的參数对象为BluetoothAdapter.LeScanCallback。
- 搜索到ble设备时会回调onLeScan方法,获取到BluetoothDevice
- 利用所获取的device调用连接方法device.connectGatt(......)方法。方法返回BluetoothGatt对象
/**
*第一个參数为上下文,context
*第二个參数为autoConnect。布尔值
*第三个參数为BluetoothAdapter.LeScanCallback对象,连接后回调,在回调中能够获取到手机的蓝牙连接状态
*/
mBluetoothGatt = device.connectGatt(BluetoothCODAService.this, false, mGattCallback);
- 在连接成功后就能够搜索服务进行通信了。利用获取到的BluetoothGatt对象。mBluetoothGatt.discoveryServices()能够搜索服务。在搜索到服务后会触发onServicesDiscovered()方法。若status位BluetoothGatt.GATT_SUCCESS代表搜索成功
- 在搜索到服务后调用mBluetoothGatt.getService()来获取BluetoothGattService列表
- 单个BluetoothGattService对象调用gattService.getCharacteristics()方法获取到BluetoothGattCharacteristic列表
- 获取到特征之后能够调用API的方法来获取所须要的信息