Android4.3 蓝牙BLE初步

2023-10-31 04:10
文章标签 初步 蓝牙 ble android4.3

本文主要是介绍Android4.3 蓝牙BLE初步,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


   To build a better world !

Android4.3 蓝牙BLE初步


Android4.3 蓝牙BLE初步

一、关键概念:

Generic Attribute Profile (GATT)
通过BLE连接,读写属性类小数据的Profile通用规范。现在所有的BLE应用Profile都是基于GATT的。
Attribute Protocol (ATT)
GATT是基于ATT Protocol的。ATT针对BLE设备做了专门的优化,具体就是在传输过程中使用尽量少的数据。每个属性都有一个唯一的UUID,属性将以characteristics and services的形式传输。
Characteristic
Characteristic可以理解为一个数据类型,它包括一个value和0至多个对次value的描述(Descriptor)。
Descriptor
对Characteristic的描述,例如范围、计量单位等。
Service
Characteristic的集合。例如一个service叫做“Heart Rate Monitor”,它可能包含多个Characteristics,其中可能包含一个叫做“heart rate measurement"的Characteristic。

二、角色和职责:

Android设备与BLE设备交互有两组角色:
中心设备和外围设备(Central vs. peripheral);
GATT server vs. GATT client.
Central vs. peripheral:
中心设备和外围设备的概念针对的是BLE连接本身。Central角色负责scan advertisement。而peripheral角色负责make advertisement。
GATT server vs. GATT client:
这两种角色取决于BLE连接成功后,两个设备间通信的方式。
举例说明:
现有一个活动追踪的BLE设备和一个支持BLE的Android设备。Android设备支持Central角色,而BLE设备支持peripheral角色。创建一个BLE连接需要这两个角色都存在,都仅支持Central角色或者都仅支持peripheral角色则无法建立连接。
当连接建立后,它们之间就需要传输GATT数据。谁做server,谁做client,则取决于具体数据传输的情况。例如,如果活动追踪的BLE设备需要向Android设备传输sensor数据,则活动追踪器自然成为了server端;而如果活动追踪器需要从Android设备获取更新信息,则Android设备作为server端可能更合适。

三、权限及feature:

和经典蓝牙一样,应用使用蓝牙,需要声明BLUETOOTH权限,如果需要扫描设备或者操作蓝牙设置,则还需要BLUETOOTH_ADMIN权限:
<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:
// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
    finish();
}

四、启动蓝牙:

在使用蓝牙BLE之前,需要确认Android设备是否支持BLE feature(required为false时),另外要需要确认蓝牙是否打开。 
如果发现不支持BLE,则不能使用BLE相关的功能。如果支持BLE,但是蓝牙没打开,则需要打开蓝牙。
打开蓝牙的步骤:
1、获取BluetoothAdapter
BluetoothAdapter是Android系统中所有蓝牙操作都需要的,它对应本地Android设备的蓝牙模块,在整个系统中BluetoothAdapter是单例的。当你获取到它的示例之后,就能进行相关的蓝牙操作了。
获取BluetoothAdapter代码示例如下:
// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager =
        (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
注:这里通过getSystemService获取BluetoothManager,再通过BluetoothManager获取BluetoothAdapter。BluetoothManager在Android4.3以上支持(API level 18)。
2、判断是否支持蓝牙,并打开蓝牙
获取到BluetoothAdapter之后,还需要判断是否支持蓝牙,以及蓝牙是否打开。
如果没打开,需要让用户打开蓝牙:
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);
}

五、搜索BLE设备:

通过调用BluetoothAdapter的 startLeScan()搜索BLE设备。调用此方法时需要传入  BluetoothAdapter.LeScanCallback参数。
因此你需要实现  BluetoothAdapter.LeScanCallback接口,BLE设备的搜索结果将通过这个callback返回。
由于搜索需要尽量减少功耗,因此在实际使用时需要注意:
1、当找到对应的设备后,立即停止扫描;
2、不要循环搜索设备,为每次搜索设置适合的时间限制。避免设备不在可用范围的时候持续不停扫描,消耗电量。
搜索的示例代码如下:
/**
 * Activity for scanning and displaying available BLE devices.
 */
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() {
                @Override
                public void run() {
                    mScanning = false;
                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                }
            }, SCAN_PERIOD);

            mScanning = true;
            mBluetoothAdapter.startLeScan(mLeScanCallback);
        } else {
            mScanning = false;
            mBluetoothAdapter.stopLeScan(mLeScanCallback);
        }
        ...
    }
...
}
如果你只需要搜索指定UUID的外设,你可以调用  startLeScan(UUID[], BluetoothAdapter.LeScanCallback)方法。
其中UUID数组指定你的应用程序所支持的GATT Services的UUID。
BluetoothAdapter.LeScanCallback的实现示例如下:
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();
           }
       });
   }
};
注意:搜索时,你只能搜索传统蓝牙设备或者BLE设备,两者完全独立,不可同时被搜索。

六、连接GATT Server:

两个设备通过BLE通信,首先需要建立GATT连接。这里我们讲的是Android设备作为client端,连接GATT Server。
连接GATT Server,你需要调用BluetoothDevice的 connectGatt()方法。此函数带三个参数:Context、autoConnect(boolean)和 BluetoothGattCallback对象。调用示例:
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
函数成功,返回 BluetoothGatt对象,它是GATT profile的封装。通过这个对象,我们就能进行GATT Client端的相关操作。 BluetoothGattCallback用于传递一些连接状态及结果。
BluetoothGatt常规用到的几个操作示例:
connect() :连接远程设备。
discoverServices() : 搜索连接设备所支持的service。
disconnect():断开与远程设备的GATT连接。
close():关闭GATT Client端。
readCharacteristic(characteristic) :读取指定的characteristic。
setCharacteristicNotification(characteristic, enabled) :设置当指定characteristic值变化时,发出通知。
getServices() :获取远程设备所支持的services。
等等。
注:
1、某些函数调用之间存在先后关系。例如首先需要connect上才能discoverServices。
2、一些函数调用是异步的,需要得到的值不会立即返回,而会在BluetoothGattCallback的回调函数中返回。例如discoverServices与onServicesDiscovered回调,readCharacteristic与onCharacteristicRead回调,setCharacteristicNotification与onCharacteristicChanged回调等。

posted on 2013-12-09 20:27 zh.weir 阅读(6966) 评论(11)  编辑  收藏 所属分类: Android应用秘技

评论

re: Android4.3 蓝牙BLE初步2013-12-11 12:56鹏达锁业

谢谢博主分享  回复  更多评论  

re: Android4.3 蓝牙BLE初步2013-12-23 20:20yusy

我现在有个功能是 手机APP 向 硬件发送指令!
现在我使用上述方法链接上了设备 但是怎么去发送指令呢?
BluetoothGatt bluetoothGatt = DeviceActivity.bluetoothGatt;
BluetoothGattService service = bluetoothGatt.getService(
UUID.fromString("xx"));
BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID.fromString("oo"));
characteristic.setValue(bytes);
bluetoothGatt.writeCharacteristic(characteristic);
这样可以吗? 如果可以 UUID 我要如何获得,不能随便找个UUID我试过了!
求博主解答,十万火急,真心感激不尽@鹏达锁业

  回复  更多评论  

re: Android4.3 蓝牙BLE初步[未登录]2013-12-23 21:15zh.weir

@yusy

肯定不能随便用个UUID啊。。。

建议你先看看你的BLE外设支持的service是什么,如果是用的Bluetooth SIG标准的Profile,你可以在https://developer.bluetooth.org/gatt/profiles/Pages/ProfilesHome.aspx 这个网站找到对应的service和characteristic的UUID。如果不是标准的,你需要和对应的BLE外设方案商交流,以获得相关资料。  回复  更多评论  

re: Android4.3 蓝牙BLE初步[未登录]2014-02-04 23:20Chris

您好
我現在正在嘗試要用Android手機讀取多個BLE設備的值
看完您的文章後
我發覺我原本的做法是Android爲Client端去向設備(Server)要資料
不過當我連線好兩個設備時
當其中一方開始傳送資料時
另一方就會自動斷線
不過單獨連線一個設備取資料都是沒問題的
想請問是不是Client端沒辦法同時連線多個Server?
感謝!  回复  更多评论  

re: Android4.3 蓝牙BLE初步[未登录]2014-02-21 11:39zh.weir

@Chris

应该是可以同时连接多个Server的。而且你也已经连上了。
BLE最好不用于传输较大的数据,只是简单的属性读写。大数据传输过程中,引起连接断开的情况经常发生,你可以抓下HCI log,看看连接断开的原因是什么。  回复  更多评论  

re: Android4.3 蓝牙BLE初步2014-03-15 12:45xchen

android设备可以作为 Periphreal role么  回复  更多评论  

re: Android4.3 蓝牙BLE初步[未登录]2014-03-17 11:17zh.weir

@xchen

目前还不支持。硬件应该是支持的,软件不支持。  回复  更多评论  

re: Android4.3 蓝牙BLE初步2014-03-29 10:37xchen

楼主 我用Android 设备作为中心设备 ,作为一个GATT Client端,去连接Ble设备。第一次是可以成功的,但是蓝牙断开后再次重连,发现连不上,从打印的状态看是已绑定状态。  回复  更多评论  

re: Android4.3 蓝牙BLE初步[未登录]2014-04-02 14:58zh.weir

@xchen

这个应该是你程序逻辑的问题了。应该在蓝牙关闭时将ble设备断开。你可以看看onDisconnect回调是否有被正常调起。另外,一些Android手机在这一块确实存在系统稳定性的问题。  回复  更多评论  

re: Android4.3 蓝牙BLE初步2014-04-15 22:46xchen

@zh.weir
一直没解决 是协议层的问题 。谢谢了  回复  更多评论  

re: Android4.3 蓝牙BLE初步2014-04-30 16:00cjolinss

请问 yusy 后来搞定了吗 我遇到同样问题能连上,但是不知道该法什么命令@zh.weir  回复  更多评论  

新用户注册   刷新评论列表  

6000+互联网公司高薪职位,等你来投!
 
   
 博客园  博问  IT新闻  Java程序员招聘
标题
姓名
主页 
验证码*   
内容(请不要发表任何与政治相关的内容)
  登录      
 
 
 
网站导航:
博客园   IT新闻   知识库   C++博客   程序员招聘   管理
 
 
 
 

公告

大家好!欢迎光临我的 Android 技术博客!



本博客旨在交流与 Android 操作系统相关的各种技术及信息。

博客内的文章会尽量以开源的形式提供给大家,希望我们能相互交流,共同提高!

有不足之处,请不吝赐教!

我的邮箱:zh.weir@gmail.com
我的新浪微博:@囧虎张建伟

 

导航

  • BlogJava
  • 首页
  • 新随笔
  • 联系
  • 聚合
  • 管理
<2013年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

  • 随笔 - 18
  • 文章 - 1
  • 评论 - 262
  • 引用 - 0

留言簿(18)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类(24)

  • Android应用秘技(4) (rss)
  • Android框架研究(1) (rss)
  • Android盈利模式(2) (rss)
  • Android网络编程(2) (rss)
  • Android软件安全(7) (rss)
  • Android项目源码(2) (rss)
  • Java的深入理解(5) (rss)
  • 成长历程 (rss)
  • 敏捷开发 (rss)
  • 科技随笔(1) (rss)

随笔档案(18)

  • 2014年2月 (1)
  • 2013年12月 (2)
  • 2013年9月 (1)
  • 2013年8月 (1)
  • 2013年7月 (1)
  • 2012年3月 (1)
  • 2011年10月 (1)
  • 2011年7月 (2)
  • 2011年6月 (1)
  • 2011年5月 (1)
  • 2011年3月 (1)
  • 2011年2月 (1)
  • 2010年5月 (2)
  • 2010年1月 (2)

文章档案(1)

  • 2014年2月 (1)

搜索


  •  

最新评论

  • 1. re: Android4.3 蓝牙BLE初步
  • 请问 yusy 后来搞定了吗 我遇到同样问题能连上,但是不知道该法什么命令@zh.weir
  • --cjolinss
  • 2. re: APK Crack
  • 博主,我想知道破解的出处或者说参考文献,能和我说说么?
  • --孙海祥
  • 3. re: Android4.3 蓝牙BLE初步
  • @zh.weir
    一直没解决 是协议层的问题 。谢谢了
  • --xchen
  • 4. re: Android4.3 蓝牙BLE初步[未登录]
  • 评论内容较长,点击标题查看
  • --zh.weir
  • 5. re: Android平台下SeeJoPlayer视频播放器(功能介绍及源码解析,附源码)
  • 程序在打开时明显很慢,甚至卡死的情况都有。不过只要在getgetVideoFile()里面用启动线程的方式。这样程序就打开得更快了。基本上就不会卡死,放上phonegap的效果更明显
  • --jemc

阅读排行榜

  • 1. Android平台下SeeJoPlayer视频播放器(功能介绍及源码解析,附源码)(42447)
  • 2. 微信5.0 Android版飞机大战破解无敌模式手记(37096)
  • 3. Android APK 签名比对(23928)
  • 4. Java反射机制的学习(19665)
  • 5. Android类动态加载技术(18992)
  • 6. APK Crack(15092)
  • 7. Android之基于HTTP协议的下载(14148)
  • 8. Android应用开发中如何使用隐藏API(9120)
  • 9. Java内存泄露的理解与解决(9032)
  • 10. 开始Android应用程序国内广告盈利模式(8618)

评论排行榜

  • 1. Android平台下SeeJoPlayer视频播放器(功能介绍及源码解析,附源码)(98)
  • 2. 微信5.0 Android版飞机大战破解无敌模式手记(65)
  • 3. Android类动态加载技术(25)
  • 4. Java反射机制的学习(16)
  • 5. APK Crack(11)

这篇关于Android4.3 蓝牙BLE初步的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/312735

相关文章

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

Java springBoot初步使用websocket的代码示例

《JavaspringBoot初步使用websocket的代码示例》:本文主要介绍JavaspringBoot初步使用websocket的相关资料,WebSocket是一种实现实时双向通信的协... 目录一、什么是websocket二、依赖坐标地址1.springBoot父级依赖2.springBoot依赖

开放式耳机好用?平价开放式耳机推荐?四款开放式的蓝牙耳机推荐

开放式耳机好用吗?有平价些的开放式耳机推荐吗?那这两个问题的回答当然是肯定的。 首先开放式耳机好不好用取决于对耳机的需求,因为开放式耳机其实是比较适用于需要注意周围环境、需要‌长时间佩戴舒适以及需要频繁与人交流的场景中,在这些场景下使用开放式耳机的话就会比较有优势。就例如跑步骑行健身等运动的时候,能够兼得佩戴舒适度的同时,增加一定的安全性;还有在办公学习的时候,会很适合长时间佩戴,能够方便和

初步学习Android的感想

之前在学习java语言的时候就经常听说过Android这门语言,那时候感觉Android有些神秘感,再加上Android是用来开发移动设备的一门语言,所以一直对Android抱有一种兴奋的心情。 在我开始接触 Android之后,感觉超好玩,因为可以在自己的手机设备上开发一些我喜欢的小应用,再想想之前说学习Android应该会很难,但是如果你真的接触了,而且有JAVA的功底,我想学习Androi

初步了解VTK装配体

VTK还不太了解,根据资料, vtk.vtkAssembly 是 VTK库中的一个重要类,允许通过将多个vtkActor对象组合在一起来创建复杂的3D模型。 import vtkimport mathfrom vtk.util.colors import *filenames = ["cylinder.stl","sphere.stl","torus.stl"]dt = 1.0renW

Flutter 中的低功耗蓝牙概述

随着智能设备数量的增加,控制这些设备的需求也在增加。对于多种使用情况,期望设备在需要进行控制的同时连接到互联网会受到很大限制,因此是不可行的。在这些情况下,使用低功耗蓝牙(也称为 Bluetooth LE 或 BLE)似乎是最佳选择,因为它功耗低,在我们的手机中无处不在,而且无需连接到更广泛的网络。因此,蓝牙应用程序的需求也在不断增长。 通过阅读本文,您将了解如何开始在 Flutter 中开

开放式蓝牙耳机哪个品牌好用?盘点五款超优秀的开放式耳机!

开放式蓝牙耳机现在挺受欢迎的,它们最大的好处就是不塞耳朵,戴着舒服,特别适合长时间佩戴。而且,这种耳机能让你在听音乐的同时,还能听到周围的环境声,这样在外面运动或者骑车的时候就更安全。音质方面,现在的开放式耳机也做得越来越好,有些高端款式还有特别的技术来减少漏音,保护你的隐私。但是现在市场上的开放式耳机品牌太多了,很多人不知道怎么选?为了帮助您在众多选项中做出选择,我根据个人经验挑选了一些表现良好

Anroid BLE蓝牙(手机分别作为中心设备和外围设备)

蓝牙是一种短距的无线通讯技术,可实现固定设备、移动设备之间的数据交换。一般将蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙,而将蓝牙4.0规范下的LE蓝牙称为低功耗蓝牙。  BLE蓝牙模块主要应用领域     1、移动扩展设备     2、汽车电子设备     3、健康医疗用品:心跳带、血压计等     4、定位应用:室内定位、井下定位等     5、近距离数据采集:无线

BLE 数据传输的一些名词

 1、 Profile Profile 可以理解为一种规范,一个标准的通信协议,Profile 存在于从机中。蓝牙组织规定了一些列的标准 Profile, 例如 HID OVER GATT、 防丢器、 心率计等。 每个 Profile 中会包含多个 Service,每个 Service 代表从机的一种能力。 2、 Service Service 可以理解为一个服务,在 ble 从机中,通

两个 BLE实现数据传输

 通过TI BLE 1.3.2 协议栈安装后的主从通信实验,实现两个 BLE节点的通信,主机向 BLE 从机发送一个字节,然后再把写入的字节读回来,以测试主从之间的通信。 SimpleBLECentral 主机编程: 在 Bluetooth-LE 低功耗蓝牙中有四种设备类型:Central 主机、Peripheral 从机、Observer 观察者、Broadcaster 广播者。通