Android 蓝牙4.0 BLE

Android ble (Bluetooth Low Energy) 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用。

BLE是蓝牙4.0的核心Profile,主打功能是快速搜索,快速连接,超低功耗保持连接和传输数据,弱点是数据传输速率低,由于BLE的低功耗特点,因此普遍用于穿戴设备。

官方demo:http://developer.android.com/guide/topics/connectivity/bluetooth-le.html

官方demo(csdn下载,感谢分享的人吧):http://download.csdn.net/detail/lqw770737185/8116019

由于搜索需要尽量减少功耗,因此在实际使用时需要注意:

1、当找到对应的设备后,立即停止扫描;

2、不要循环搜索设备,为每次搜索设置适合的时间限制。避免设备不在可用范围的时候持续不停扫描,消耗电量。

注意:添加权限:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

除了蓝牙权限外,如果需要BLE feature则还需要声明uses-feature:

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

设置required为true时,则应用只能在支持BLE的Android设备上安装运行;required为false时,Android设备均可正常安装运行,需要在代码运行时判断设备是否支持BLE feature:

if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
      //不支持ble
      finish();
}

(1)实现 BluetoothAdapter.LeScanCallback接口,BLE设备的搜索结果将通过这个callback返回

 1   // Device scan callback.
 2     private BluetoothAdapter.LeScanCallback mLeScanCallback =
 3             new BluetoothAdapter.LeScanCallback() {
 4
 6         @Override
 7         public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
 8
30         }
31
32     };

(2)关闭BLE设备的搜索

1 mBluetoothAdapter.stopLeScan(mLeScanCallback);

(3)开启BLE设备的搜索

1 mBluetoothAdapter.startLeScan(mLeScanCallback);

*************注意:搜索时,你只能搜索传统蓝牙设备或者BLE设备,两者完全独立,不可同时被搜索。

(4)使用BluetoothGatt 来连接设备

两个设备通过BLE通信,首先需要建立GATT连接。这里我们讲的是Android设备作为client端,连接GATT Server。

连接GATT Server,你需要调用BluetoothDevice的connectGatt()方法。此函数带三个参数:Context、autoConnect(boolean)和BluetoothGattCallback对象。

1 private BluetoothGatt mBluetoothGatt;
 1   final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
 2     if (device == null) {
 3       Log.w(TAG, "Device not found.  Unable to connect.");
 4       return false;
 5     }
 6     mBluetoothGatt = device.connectGatt(this, true, mGattCallback);

(5)使用BluetoothGattCallback 来跟设备进行通信

 1 private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
 2     @Override
 3     public void onConnectionStateChange(BluetoothGatt gatt,
 4         int status, int newState) {
 5         super.onConnectionStateChange(gatt, status, newState); 9         if (newState == BluetoothProfile.STATE_CONNECTED) {
10             setState(State.CONNECTED);
11             gatt.discoverServices();
12         } else {
13             setState(State.IDLE);
14         }
15     }
16
17     @Override
18     public void onServicesDiscovered(BluetoothGatt gatt,
19        int status) {
20         if(status == BluetoothGatt.GATT_SUCCESS) {
21             Log.v(TAG, "onServicesDiscovered: " + status);
22         }
23     }
24 }

连接时会走这个方法onConnectionStateChange,传过来的新状态是连接状态,这时在这个方法中调用一下这句:mBluetoothGatt.discoverServices(),

mBluetoothGatt是连接完成时的对象,还记得吧,调用这句后,会走回调函数的onServicesDiscovered方法。在这个方法中去获取设备的一些服务,蓝牙通道,然后通过这些通道去发送数据给外设。

在蓝牙设备中, 其包含有多个BluetoothGattService, 而每个BluetoothGattService中又包含有多个BluetoothGattCharacteristic。

(1)获取到设备中的服务列表  mBluetoothGatt.getServices(); 或者通过uuid 来获取某一个服务:

public List<BluetoothGattService> getSupportedGattServices() {
        if (mBluetoothGatt == null)
            return null;
        return mBluetoothGatt.getServices();
        // 或者通过uuid来获取某一个服务 mBluetoothGatt.getServices(uuid);
}

(2)通过Gatt这个对像,就是蓝牙连接完成后获取到的对象,通过这个对象设置好指定的通道向设备中写入和读取数据。

服务中, 获得Characteristic 集合则调用 gattService.getCharacteristics():

在 Characteristic中, 可以通过  mBluetoothGatt.readCharacteristic(characteristic); 来读取其里面的数据, 其结果在mGattCallback 回调函数中获取.

写如数据:  characteristic .setValue(data);

mBluetoothGatt .wirteCharacteristic(mCurrentcharacteristic);

1 public void wirteCharacteristic(BluetoothGattCharacteristic characteristic) {
2
3         if (mBluetoothAdapter == null || mBluetoothGatt == null) {
4             Log.w(TAG, "BluetoothAdapter not initialized");
5             return;
6         }
7
8         mBluetoothGatt.writeCharacteristic(characteristic);
9  }
1 public void readCharacteristic(BluetoothGattCharacteristic characteristic) {
2         if (mBluetoothAdapter == null || mBluetoothGatt == null) {
3             Log.w(TAG, "BluetoothAdapter not initialized");
4             return;
5         }
6         mBluetoothGatt.readCharacteristic(characteristic);
7  }

注意:BluetoothGattCharacteristic这个是指定的通道,蓝牙服务:

1 BluetoothGattCharacteristic characteristic = null;
2 characteristic = mGattCharacteristics.get(4).get(4);

这两个数字就是从指定的服务中找到你要发送数据的那个服务。

如果要进行多个连接,每次连接完成后可以将BluetoothGatt的对象放到一个list里面,获取到的服务也放到一个List里面,然后发送数据的时候调用不同的Gatt发送不同的通道数据即可。

参考:

Android提高之Android手机与BLE终端通信

android 蓝牙4.0多通道

Android Bluetooth Low Energy(官方)

时间: 2024-10-28 21:22:42

Android 蓝牙4.0 BLE的相关文章

Android 蓝牙4.0 BLE 理解

本文简单结合两篇文章 http://blog.csdn.net/hellogv/article/details/24267685 http://blog.csdn.net/jimoduwu/article/details/21604215 在BLE协议中,有两个角色,周边(Periphery)和中央(Central),一个中央可以同时连接多个周边,但是一个周边某一时刻只能连接一个中央.但是不管是Periphery还是Central都是可以实现 GATT server 和 GATT client去

android蓝牙4.0(BLE)开发之ibeacon初步

此文使用的ibeacon模块是april beacon,至于什么是ibeacon.本文不做解释,具体请自查. 一个april beacon里携带的信息如下 0201061AFF4C0002159069BDB88C11416BAC3F33468C2788A3044B0378C60C09417072696C426561636F6E051250002003020A0000000000000000000000 具体是什么意思呢 02 Number of bytes that follow in firs

Android项目实战(三十四):蓝牙4.0 BLE 多设备连接

原文:Android项目实战(三十四):蓝牙4.0 BLE 多设备连接 最近项目有个需求,手机设备连接多个蓝牙4.0 设备 并获取这些设备的数据. 查询了很多资料终于实现,现进行总结. -------------------------------------------------------------------------------------------------------------------------------------------------------------

ym——物联网入口之一Android蓝牙4.0

如果还有同学不知道蓝牙4.0可以做什么请查看Android+蓝牙 4.0 将带来什么?,现在可以穿戴设备也大多用的是蓝牙4.0,如 智能体质秤,智能手环,智能血压计等等. 安卓4.3(API 18)为BLE的核心功能提供平台支持和API,App可以利用它来发现设备.查询服务和读写特性.相比传统的蓝牙,BLE更显著的特点是低功耗.这一优点使android App可以与具有低功耗要求的BLE设备通信,如近距离传感器.心脏速率监视器.健身设备等. 关键术语和概念 Generic Attribute P

Android蓝牙4.0之玩爆智能穿戴、家具(二)【进阶篇】

闲话中心 这几天最大的事可能就是美国总统的上任,双十一,还有乐视股价了,乍一看,好像和我们没什么关系,其实肯定是有的了,要不然他也成不了新闻啊,有一点我们得改变,就是我们必须要希望我们自己国家的企业能过强大,我们必须支持他们,哪怕他做的不够好,这个问题其实就像一个国家一样,我们都知道许多政策是不合理的,或者说有很多制度是坑人的,但是我们不能因为这些而不爱我们的国家,那么企业也是一样,就拿乐视来说,股价跌了,公司遇到资金问题了,你看看这些媒体都在报道什么,全是负面消息,马上倒闭了,或者说是撑不住了

蓝牙4.0 BLE

读了N多文档,其中推荐的有: Webee的<蓝牙4.0是战演练> Ghostyu的 <BLE权威教程> 1:透穿实现: 利用TI的BLE包里的工程直接烧 上位设备用 central,下位设备用peripheral工程 做以下处理: central 的NPI初始化时添加uart CB,并在串口回调函数中 直接添加write char函数写进特征值(实现上位从串口接收并通过蓝牙发送), 使能特征值通知,并在通知处理事件中将数据从串口发送(实现上位的从蓝牙接受并从串口发送) periph

android 蓝牙4.0 开发介绍

最近一直在研究一个蓝牙功能 由于本人是菜鸟  学起来比较忙 一直搞了好久才弄懂 , 网上对蓝牙4.0也就是几个个dome 抄来抄去,全是英文注解 , 对英语不好的朋友来说 真是硬伤 , 一些没必要的描述罗里吧嗦 , 关键的方法接口 一笔带过 .........算了不吐槽了.我就介绍一下我最近的学习心得吧 ,简单的什么开启  蓝牙 搜索蓝牙什么的我就不说了 你们百度一下 android 蓝牙 4.0 一大坨.看完再来看我的博客也行  ,我就介绍点 网上那些 一笔带过 比较重要的接口回调 之类的.

iOS开发 之 可穿戴设备 蓝牙4.0 BLE 开发

1 前言 当前有越来越多的可穿戴设备使用了蓝牙4.0 BLE(Bluetooth Low Energy).对于iOS开发而言,Apple之前专门推出CoreBluetooth的Framework来支持BLE的开发.对于硬件开发有了解的朋友应该知道,在之前使用低版本的蓝牙的设备,要连接到iOS设备上,需要注册MFI,拥有MFI协议才能进行相应的开发.如果大家关注我之前对LEGO EV3的研究,就可以发现,EV3是使用了蓝牙2.1,因此需要MFI协议来进行开发. 本文将一步一步讲解如何使用CoreB

蓝牙4.0 BLE学习笔记

一.知识普及 1.蓝牙4.0分为两个部分: 1)Bluetooth Ready,兼容传统蓝牙的高速部分: 2)Bluetooth Smart,BLE(Bluetooth Low Energy),功耗低,速率低.最大传输速率4~5k字节/s: 2.BLE协议栈: 1)只是一个协议规范,BLE协议栈是该协议的代码实现:蓝牙组织SIG负责制定协议,芯片公司负责实现协议: 2)BLE协议栈是芯片公司预先编好的源码或者库: 3.CC2540/2541,CC254x就是一颗带有蓝牙功能的51单片机,BLE协