Android中的蓝牙开发

要说到蓝牙,小伙伴们听到的可能有蓝牙1.0、蓝牙2.0、蓝牙3.0、蓝牙4.0之类的以数字结尾的蓝牙版本号,而实际上,在最新的标准中,已经不再使用数字版本号作为蓝牙版本的区分了,取而代之的是经典蓝牙与低功耗蓝牙(BLE)这两种区别。

这里提到的低功耗蓝牙也会有很多人会误解为就是蓝牙4.0,但是完整的蓝牙4.0规范中实际上包括有经典蓝牙和低功耗蓝牙这两个部分,小伙伴们看看如下这张分类表就能够明白这其中的关系了。

如表中所述,咱们现在的蓝牙实际上分为了三类:单模、双模和经典。那么,最官方的蓝牙版本称呼就是,单模蓝牙、双模蓝牙和经典蓝牙。

在这其中,最前沿的当属单模蓝牙了,也就是低功耗蓝牙。这个蓝牙标准和经典蓝牙区别极大,在最初甚至考虑过加入WIFI阵营,但是因为蓝牙阵营这边条件较为优厚(比如授权费用极低)才并入了蓝牙标准。

那么,低功耗蓝牙和经典蓝牙的区别究竟在哪里呢?

要是仅仅从两者的通信方式上来说,可以说除了名字叫蓝牙外,完全可以当做两个东西。这也就为很多搞过经典蓝牙以为就可以很轻松的接着搞低功耗蓝牙的人埋下了一个大坑。

不过,两者在总体上的流程却也是相似的(好吧,无线通信貌似也都是这么个流程),那就是:

  • 发现设备->配对/绑定设备->建立连接->数据通信

经典蓝牙和低功耗蓝牙除了配对/绑定这个环节是一样的之外,其它三个环节都是不同的。

1. 发现设备

经典蓝牙设备发现其它经典蓝牙设备的方式是调用BluetoothAdapter的startDiscovery()方法,这个方法只能够发现经典蓝牙设备。

低功耗蓝牙中则有一个主设备(Central)和从设备(Peripheral,也叫外围设备)的概念。主设备作为发现方,调用发现设备的方法,通过BluetoothAdapter的startLeScan()方法实现。从设备则作为被发现方,发出广播,以供发现。同样,这个startLeScan()方法也仅能够发现低功耗蓝牙从设备。

不过,在Android系统蓝牙搜索界面,两种蓝牙设备都是可以被发现的。只有当两种蓝牙设备被某设备(包括当前的设备)配对/绑定后,才不会再被扫描到。

2. 配对/绑定

有很多小伙伴都不太理解配对和绑定究竟有什么区别,或者它们根本就是同一个东西。好吧,严格说配对和绑定是有区别的,也就是不是指的同一件事情。但是这两者的区别比较模糊,也不好解释。目前JACK的机器人的理解是,配对是建立两者的对应关系,而绑定则把这层关系保存固定下来并进行了强化,暂时这么理解着吧。

不管是经典蓝牙还是低功耗蓝牙,绑定方法都是通用的,可以调用相同的绑定方法。

3. 建立连接

在建立连接的方式上,两者就千差万别了。

——蓝牙小知识——

在蓝牙设备中,存在着物理地址,我们也叫作蓝牙的MAC地址,这个地址是唯一的,就像咱们网络上的IP地址。同时还存在着一个叫做UUID的东西,可以把它理解为是IP地址中的端口号。正如知道了IP地址和端口号,就知道了怎么链接到目标网络服务器位置,知道了蓝牙设备的MAC地址和UUID也就能够确定到具体是哪一台蓝牙设备了,这两者合起来就是蓝牙的唯一身份标识。

经典蓝牙建立连接的方式实际上就是Socket的连接的建立。只不过这里不是直接用Socket,而是BluetoothSocket。获取BluetoothSocket的方式也很简单,利用搜索找到的BluetoothDevice,调用其方法createRfcommSocketToServiceRecord(UUID)。最后,使用获取到的BluetoothDevice调用其方法connect()就建立了经典蓝牙设备之间的连接通道。

低功耗蓝牙则用了一种看起来比较怪异的方式建立连接(JACK的机器人被这种建立连接的方式折腾了好久)。

——关于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。

这里举个例子,例如现在需要使用一个智能手机作为主设备去连接一个作为从设备的智能手环,那么,此时这个作为主设备的智能手机连接过程中实际是一个客户端(Client),而作为从设备的智能手环在此过程中则是服务端(Server)。这里的主设备和从设备,客户端和服务端一定要区分清楚。

想要和一台BLE从设备建立连接,一般是某个智能设备,例如智能手环、智能灯泡之类的。如果使用智能手机作为测试平台,其硬件条件是,蓝牙得至少是低功耗蓝牙版本,然后安卓系统的话,至少得是Android 4.3以上系统才行,因为Google在Android 4.3以上才做了BLE主设备的支持,如果想将智能手机作为BLE从设备,则必须在Android 5.0以上才行。

具体建立GATT连接的顺序则是,首先通过BluetoothAdapter的getRemoteDevice(address)方法获取大相应BLE从设备的BluetoothDevice,其中的address为目标蓝牙设备MAC地址。然后通过此BluetoothDevice的connectGatt(this, false, mGattCallback)方法获取设备连接。

此时的连接,只能够进行监听,也就是获取到当前BLE从设备广播出来的数据。

4. 数据通信

经典蓝牙中,当建立连接后,就可以直接使用BluetoothSocket的getOutputStream()方法获取输出流写入需要发送的数据。读取发送回来的数据,则是调用BluetoothSocket的getInputStream()方法获取输入流读取。这点和Java中的Socket通信几乎是一模一样。

而在低功耗蓝牙中,想要实现主设备对从设备的数据发送,则需要直接读取获取到的从设备的Characteristic,而Characteristic又是Service下面的一层,所以操作顺序是:

(1)通过BLE从设备相应的Service_UUID获取对应的BluetoothGattService,获取方法是:使用BluetoothDevice的connectGatt(this, false, mGattCallback)方法返回的BluetoothGatt对象,调用BluetoothGatt的方法getService(Service_UUID)获取相应的BluetoothGattService;

(2)调用BluetoothGattService和对应的Characteristic的写入UUID获取相应的BluetoothGattCharacteristic,获取方法是:调用BluetoothGattService的getCharacteristic(Characteristic_UUID)方法获得;

(3)设置需要发送的命令值,调用BluetoothGattCharacteristic的方法setValue(value)进行设置,其中value一般为byte[];

(4)最后,使用BluetoothGatt的写入方法writeCharacteristic(TxChar)完成命令发送。

可以看到,想要实现BLE的数据通信,步骤相当繁琐,这里只是做一个简单的概念理解,如果想要获取到BLE从设备的返回值,还需要设置Notification,然后调用BluetoothGatt的readCharacteristic(characteristic)方法进行数据的读取,这里不做详细说明了,放在以后详细说明BLE通信的时候再做解释。

最后奉上Google的官方蓝牙演示DEMO源码,来自Android官方网站,小伙伴们可以参考源码再看看JACK的机器人的说明对比,这样相信会更加利于理解。

https://pan.baidu.com/share/init?surl=eQVRrQ6

百度网盘提取码:1qyp

此源码压缩包中包括三个工程,都需要使用Android Studio打开进行编译安装,具体说明如下:

(1)BluetoothAdvertisements.zip是Android智能设备作为从设备的DEMO,需要在Android 5.0以上真机运行。

(2)BluetoothLeGatt.zip是Android智能设备作为主设备的DEMO,需要在Android 4.3以上真机运行。

(3)BluetoothChat.zip是一个蓝牙聊天室,两台具备蓝牙的Android智能设备即可安装运行,可以实现经典蓝牙通信方式的数据发送与显示。

欢迎关注技术公众号,微信号搜索ColorfulCode 代码男人

分享技术文章,投稿分享,不限技术种类,不限技术深度,让更多人因为分享而受益。

经典蓝牙与低功耗蓝牙的区别相关推荐

  1. 关于经典蓝牙和低功耗蓝牙的区别

    刚开发蓝牙的小伙伴在开发的时候,或许会看到经典蓝牙和低功耗蓝牙这两种,不知道它们之间的区别与联系,今天给大家介绍一下经典蓝牙和低功耗蓝牙(BLE)的区别. 文章转载自: http://www.love ...

  2. 经典蓝牙与低功耗蓝牙的区别(转)

    Android中的蓝牙开发 要说到蓝牙,小伙伴们听到的可能有蓝牙1.0.蓝牙2.0.蓝牙3.0.蓝牙4.0之类的以数字结尾的蓝牙版本号,而实际上,在最新的标准中,已经不再使用数字版本号作为蓝牙版本的区 ...

  3. 经典蓝牙与低功耗蓝牙BLE开发基础知识:服务、特征、属性、UUID

    经典蓝牙和低功耗蓝牙BLE的区别 蓝牙大致被认为是1.0 2.0 3.0 4.0版本,不过现在已经不再用版本号区分蓝牙了,蓝牙1.0~3.0都是经典蓝牙,在塞班系统就已经开始使用了.而蓝牙4.0开始就 ...

  4. Android笔记---蓝牙开发经典蓝牙和低功耗蓝牙

    目录 前言 一般开发步骤 相关API介绍 一.通用API 1.BluetoothAdapter 2.BluetoothDevice 二.经典蓝牙(BT)API 1.BluetoothSocket 2. ...

  5. 传统蓝牙和低功耗蓝牙的分类与区别?

    作者:feasycom 链接:https://www.zhihu.com/question/60824531/answer/181351944 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权 ...

  6. 经典蓝牙和低功耗蓝牙的区别

    蓝牙 SIG 发布新版本的规范时,都会声明一个版本号.蓝牙1.0大约在1999年发布,2004年发布2.0版本,2007年发布2.1版本,2009年发布3.0版本. 打开蓝牙3.0规范,你会发现经典蓝 ...

  7. 经典蓝牙和低功耗蓝牙(BLE)有什么区别?

    蓝牙模块Bluetooth module)是指集成蓝牙功能的芯片基本电路集合,用于短距离2.4G的无线通讯模块.对于最终用户来说,蓝牙模块是半成品,通过在模块的基础上功能再开发.封装外壳等工序,实现能 ...

  8. 网络调试助手:安卓APP集成TCP、UDP、经典蓝牙、低功耗蓝牙的调试demo

    1.前言 我终于不需要调试一个硬件设备装一个APP了,在应用商店下载别人的网络调试助手,又有广告,还不如直接写一个比较完整的网络调试助手.目前支持的功能有tcp客户端和服务端,udp,低功耗蓝牙客户端 ...

  9. BLE广播流程介绍 蓝牙广播 低功耗蓝牙广播的实现流流程介绍 /BLE Advertising flow ----- 蓝牙低功耗协议栈

    零. 概述 主要介绍下蓝牙协议栈(bluetooth stack)低功耗蓝牙广播的流程以及协议栈的实现流程,BLE  Advertising flow btsnoop以及流程在资料中的......\S ...

最新文章

  1. redis 常用配置
  2. Spring Boot 2.x基础教程:JSR-303实现请求参数校验
  3. CentOS6安装MySQL 1 - 更新yum源失败
  4. python 库整理:toolz.curried (整理中)
  5. 链路追踪之zipkin
  6. SpringBoot日志收集-Aop方式-存进数据库一起来和我看看咋收集日志吧!!
  7. MongoDB分布式操作——分片操作
  8. Android开发之WebView加载HTML源码包含转义字符实现富文本显示的方法
  9. mysql切换到使用openssl,MySQL主从复制+OpenSSL
  10. mysql与orancl_清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦
  11. JDK源码解析之 Java.lang.Compiler
  12. java 保存和读取本地文件
  13. pandas小记:pandas高级功能
  14. CFS内网渗透三层内网漫游靶场-2019某CTF案例
  15. Java 垃圾回收机制(GC)简述
  16. dt100g3什么意思_酷黑滑盖风 金士顿DT100G3优盘评测
  17. 功能强大的全新虚拟商品自动发货商城源码
  18. FZU 2219 StarCraft (哈夫曼树)
  19. 数据警务_如何停止网上种族歧视警务
  20. 杭电acm的第1000题c语言解法

热门文章

  1. Hadoop 大数据生态框架--总述
  2. TI低功耗蓝牙(BLE)介绍
  3. ubuntu 12.04英文版设置成中文版
  4. 记一次完整手机APP项目的开发
  5. php仿携程网站,仿携程网手机端
  6. 温度指示报警电路设计报告
  7. MATALB运用——最小二乘法拟合
  8. SQL快速入门、查询(SqlServer)[郝斌SqlServer完整版]
  9. python固定效应模型_panel data做固定效应模型时有下列几种方法
  10. 十字路口的交通灯控制电路