Android 蓝牙相关协议

  • 1.HCI 协议
  • 2.RFcomm 协议
  • 3.L2CAP 协议
  • 3.SDP 协议
  • 4.ATT_GATT 协议
    • 4.1 GAP
      • 4.1.1. 设备角色
      • 4.1.2 广播机制
      • 4.1.3 广播的网络拓扑结构
    • 4.2 GATT
      • 4.2.1 GATT 通信事务
      • 4.2.2 GATT 结构
      • 4.3.1 通信协议的方法
      • 4.3.2 通信的包格式
  • 5 .HFP 协议
    • 5.1.概述
  • 6 . SPP 协议

适用范围:经典蓝牙模块多用在蓝牙音频模块,大量数据传输,对耗电量没有严苛要求的设备,同时又分为传统蓝牙和高速蓝牙模块。
ble低功耗蓝牙多用在低耗能,数据传输量较小等。
下面来了解几个协议:

1.HCI 协议

HCI 层位于蓝牙高层协议和低层协议之间,提供了对基带控制器和链路管理器的命令以及访问蓝牙硬件的统一接口,它是我们实现自己的蓝牙设备要接触的第一个蓝牙协议,起着承上启下的作用。
HCI通过包的方式来传送数据、命令和事件的,所有在主机和主机控制器之间的通信都以包的形式进行。包括每个命令的返回参数都通过特定的事件包来传输。HCI有数据、命令和事件三种包,其中数据包是双向的,命令包只能从主机发往主机控制器,而事件包始终是主机控制器发向主机的。主机发出的大多数命令包都会触发主机控制器产生相应的事件包作为响应,hci 通常称为驱动或者固件。

HCI 传输层协议
目前,HCI 的传输层主要有:USB,UART,三线串口、SD接口。
不同传输层对HCI 事件处理没有影响。

2.RFcomm 协议

传输协议
RFCOMM提供基于L2CAP协议的串口仿真。
首先啥叫串口:串口就是设备与外界通讯交流的出口,是物理层的,个人理解就是软件和芯片数据交互的桥梁。
RFCOMM是一个简单传输协议,其目的为了解决如何在两个不同设备上的应用程序之间保证一条完整的通信路径,并在它们之间保持通信段的问题。
RFCOMM只针对直接互连设备之间的连接,或者是设备与网络接入设备之间的互连。通信两端设备必须兼容于RFCOMM协议。

3.L2CAP 协议

数据链路层协议
L2CAP-全称是逻辑链路控制与适配层,为两个通信的蓝牙设备提供一个端到端的通道。
L2CAP处于链路控制协议之上,属于数据链路层.其采用协议复用、分段、重组和组抽象功能对上层协议提供面向连接和无连接数据服务.允许高层协议和应用发送和接受最大长度为64k字节的数据分组,也允许通过流控制和重传模式来进行每个信道的流控制和重传.L2CAP提供逻辑信道,叫做L2CAP信道,它通过ACL逻辑传输的支持映射到L2CAP逻辑链路.

3.SDP 协议

SDP全称是Session Description Protocol,翻译过来就是描述会话的协议。主要用于两个会话实体之间的媒体协商,目的就是在媒体会话中,传递媒体流信息,允许会话描述的接收者去参与会话。定义了会话的描述的同意格式。
通俗的讲,两个陌生的设备(之前未有过交互)如何去发现对方支持什么服务呢?很容易想到,我们需要一种协议,这种协议规定了服务在服务器上面是如何存储的以及对方如何能够通过这个协议来获取到数据,以及双方共同遵守的一些规定等等,sdp 就是用来发现服务的机制,每个蓝牙设备都需要一个SDP Service,只做Client的蓝牙设备除外,客户端只有通过服务发现协议才能获得设备信息、服务信息及服务特征,才能在此基础上建立相互间的连接。通过这个协议,应用程序可以发现哪些服务可用以及服务的特性是什么,SDP(服务发现协议)是蓝牙协议体系中的核心协议,是蓝牙系统重要组成部分,是所有用户模式的基础。

4.ATT_GATT 协议

4.1 GAP

了解GATT前先了解GAP,它在用来控制设备连接和广播是用于BLE 蓝牙。GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。例如 Beacon 设备就只是向外广播,不支持连接,小米手环就等设备就可以与中心设备连接。

4.1.1. 设备角色

GAP 给设备定义了若干角色,其中主要的两个是:外围设备(Peripheral)和中心设备(Central)。

  • 外围设备:这一般就是非常小或者简单的低功耗设备,用来提供数据,并连接到一个更加相对强大的中心设备。例如小米手环。
  • 中心设备:中心设备相对比较强大,用来连接其他外围设备。例如手机等

4.1.2 广播机制

在 GAP 中外围设备通过两种方式向外广播数据: Advertising Data Payload(广播数据)和 Scan Response Data Payload(扫描回复),每种数据最长可以包含 31 byte。这里广播数据是必需的,外围设备会设定一个广播间隔,每个广播间隔中,它会重新发送自己的广播数据。广播间隔越长,越省电,同时也不太容易扫描到。让中心设备知道它的存在,扫描回复是可选的,中心设备可以向外设请求扫描回复,这里包含一些设备额外的信息,例如设备的名字。

4.1.3 广播的网络拓扑结构

大部分情况下,外设通过广播自己来让中心设备发现自己,并建立 GATT 连接,从而进行更多的数据交换。也有些情况是不需要连接的,只要外设广播自己的数据即可。用这种方式主要目的是让外围设备,把自己的信息发送给多个中心设备。因为基于 GATT 连接的方式的,只能是一个外设连接一个中心设备。使用广播这种方式最典型的应用就是苹果的 iBeacon。

4.2 GATT

GATT 的全名是 Generic Attribute Profile(姑且翻译成:普通属性协议)通用属性协议,在GATT之上就是应用层程序,通过GATT统一格式属性接口,对APP开发来讲操作对象就变成一个个定义的属性进行读写,它定义两个 BLE 设备通过叫做 Service 和 Characteristic 的东西进行通信。GATT 就是使用了 ATT(Attribute Protocol)协议,ATT 协议把 Service, Characteristic遗迹对应的数据保存在一个查找表中,查找表使用 16 bit ID 作为每一项的索引。

一旦两个设备建立起了连接,GATT 就开始起作用了,这也意味着,你必需完成前面的 GAP 协议。这里需要说明的是,GATT 连接,必需先经过 GAP 协议。实际上,我们在 Android 开发中,可以直接使用设备的 MAC 地址,发起连接,可以不经过扫描的步骤。这并不意味不需要经过 GAP,实际上在芯片级别已经给你做好了,蓝牙芯片发起连接,总是先扫描设备,扫描到了才会发起连接。

GATT 连接需要特别注意的是:GATT 连接是独占的。也就是一个 BLE 外设同时只能被一个中心设备连接。一旦外设被连接,它就会马上停止广播,这样它就对其他设备不可见了。当设备断开,它又开始广播,中心设备和外设需要双向通信的话,唯一的方式就是建立 GATT 连接。
这里很清楚的显示,一个外设只能连接一个中心设备,而一个中心设备可以连接多个外设。ConnectedTopology一旦建立起了连接,通信就是双向的了,对比前面的 GAP 广播的网络拓扑,GAP 通信是单向的。如果你要让两个设备外设能通信,就只能通过中心设备中转。

4.2.1 GATT 通信事务

GATT 通信的双方是 C/S 关系。外设作为 GATT 服务端(Server),它维持了 ATT 的查找表以及 service 和 characteristic 的定义。中心设备是 GATT 客户端(Client),它向 Server 发起请求。需要注意的是,所有的通信事件,都是由客户端(也叫主设备,Master)发起,并且接收服务端(也叫从设备,Slave)的响应。

一旦连接建立,外设将会给中心设备建议一个连接间隔(Connection Interval),这样,中心设备就会在每个连接间隔尝试去重新连接,检查是否有新的数据。但是,这个连接间隔只是一个建议,你的中心设备可能并不会严格按照这个间隔来执行,例如你的中心设备正在忙于连接其他的外设,或者中心设备资源太忙。

4.2.2 GATT 结构

GATT 事务是建立在嵌套的Profiles, Services 和 Characteristics之上的的

  • ProfileProfile 并不是实际存在于 BLE 外设上的,它只是一个被 Bluetooth SIG 或者外设设计者预先定义的 Service 的集合。例如心率Profile(Heart Rate Profile)就是结合了 Heart Rate Service 和 Device Information Service。所有官方通过 GATT Profile 的列表可以从这里找到。

  • Service 是把数据分成一个个的独立逻辑项,它包含一个或者多个 Characteristic。每个 Service 有一个 UUID 唯一标识。 UUID 有 16 bit 的,或者 128 bit 的。16 bit 的 UUID 是官方通过认证的,需要花钱购买,128 bit 是自定义的,这个就可以自己随便设置。

  • Characteristic在 GATT 事务中的最低界别的是 Characteristic,Characteristic 是最小的逻辑数据单元,当然它可能包含一个组关联的数据,例如加速度计的 X/Y/Z 三轴值。
    对于GATT本身,可以简单的理解为一种根据一定格式规范组织的数据表。
    他定义了三种规程:

  • 发现规程:
    1.发现服务:发现所有首要服务,按UUID 发现首要服务,查找包含服务。
    2.发现特性:发现所有特性,发现所有特性描述符。

  • 客户端发起规程:读/写特性值,读/写特性描述符。

  • 服务端发起规程:通知/指示

所以说GATT协议就是我们在ble 中调用的BluetoothGatt ,的实际应用,他为我们提供了ble 相关的接口,(包括读,写,通知及读写的确认等)。
##4.3 ATT协议

ATT,Attribute Protocol,用于发现、读、写对端设备的协议(针对BLE设备)
ATT允许设备作为服务端提供拥有关联值的属性集
让作为客户端的设备来发现、读、写这些属性;同时服务端能主动通知客户端,ATT处于LaCAP 协议层与GATT 之间的一层属性协议。
ATT定义了两种角色: 服务端(Server)和客户端(Client)
属性协议规定了客户端(Client)和服务器(Server)之间通信的方式,共六种:

  • Request(请求)
  • Response(响应)
  • Command(命令)
  • Indication(指示)
  • Confirmation(确认)
  • Notification(通知)
    1.客户端发送Request,服务器需要返回一个Response,表明服务器收到了。
    2.服务器发送Indication,客户端需要返回一个Confirmation,表明客户端收到了。
    以上两种方式,均是单线程操作,即下一个Request/Indication操作需要在上一个操作收到Response/Confirmation之后才能开始。
    3.客户端发送Command,服务器无需任何返回。
    4.服务器发送Notification,客户端无需任何返回。
    因此Command和Notification是不可靠的通信。当通信环境不佳,客户端频繁发送Command,可能发生服务器接收不到或丢弃的情况,Notification也类似。

4.3.1 通信协议的方法

借用别人的一张图了解下:

其实就是上边描述的六种方法,通过具体的六中方法来实现通信。

4.3.2 通信的包格式

上边的六种方式是具体的方法,现在我们需要关心,如何将他们打包,发送到链路中。
PDU 与 MTU

  • PDU :协议的数据单元,是指在分层网络结构,例如在开放式系统互联(OSI)模型中,在传输系统的每一层都将建立协议数据单元(PDU),回到ATT 协议中,就是 ATT 协议的协议数据单元。
  • MTU :最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据报大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。

GATT通过ATT 的 PDU 规范进行数据协议的交互,ATT PDU 是 GATT 消息的载体。
同时 ATT_MTU定义了Client和Server之间数据包的最大值;其默认值由高层协议来定义
Client和Server可通过Exchange MTU Request and Response PDUs来交换最大数据包
然后均使用交换值中的最小值进行通信,同时作为Server和Client的设备应该使用相同的Client Rx MTU和Server Rx MTU ,每个ATT Bearer均有其ATT_MTU;当一个设备拥有多个ATT Bearer时,不同ATT Bearer的ATT_MTU可能不同。

梳理下GATT_ATT 数据流程:
GATT 通过—>GAP---->连接GATT—>通过 ATT PDU 传输数据单元(具体的,比如写入,读等)---->ATT MTU 发送数据单元----->L2CAP

5 .HFP 协议

5.1.概述

HFP(Hands-free Profile),蓝牙电话HFP,可以让蓝牙设备可以控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要视蓝牙耳机及电话是否支持。

HFP定义了音频网关(AG)和免提组件(HF)两个角色:
AG–该设备为音频(特别是手机)的输入/输出网关。
HF–该设备作为音频网关的远程音频输入/输出机制,并可提供若干遥控功能。
AG和HF均可以通过内部或者用户事件发起Service Level连接建立。Service Level Connection建立的前提是RFCOMM已经建立。同样RFCOMM的建立发起者可以是AG或者HF。

6 . SPP 协议

蓝牙协议栈(bluetooth stack) 串口协议(bluetooth SPP)Serial Port Profile 协议,简称SPP,其定义了使用蓝牙进行RS232(或类似)串行电缆仿真的设备应使用的协议和过程。简单来说就是在蓝牙设备之间建立虚拟的串口进行数据通信。说白了就是可以两个设备对端发送自定义数据。
Android 蓝牙协议两种分类是SPP 和 BLE 协议。
spp协议是传统蓝牙面向应用层的协议,可以通过该协议实现大流量的数据传输。

最后借用别人一张图,整个蓝牙模块交互图:

Android 蓝牙开发底层的几种协议介绍相关推荐

  1. Android蓝牙开发 — 经典蓝牙BLE蓝牙

    一,前期基础知识储备 1)蓝牙是一种支持设备之间短距离通信的无线电技术(其他还包括红外,WIFI): 支持移动电话.笔记本电脑.无线耳机等设备之间进行信息的交换: Android支持的蓝牙协议栈:Bl ...

  2. Android - 蓝牙开发

    文章目录 科普 SIG 类型 制式 选择 逻辑链路控制适配协议 (L2CAP) L2CAP的功能 蓝牙框架和 RFCOMM 协议 蓝牙安全 白名单机制 编程 蓝牙权限 Classic Bluetoot ...

  3. Android 蓝牙开发(一) -- 传统蓝牙聊天室

    Android 蓝牙开发(一) – 传统蓝牙聊天室 Android 蓝牙开发(三) – 低功耗蓝牙开发 项目工程BluetoothDemo 一.蓝牙概览 以下是蓝牙的介绍,来自维基百科: 蓝牙(英语: ...

  4. Android蓝牙开发BLE-读写数据

    上一篇:Android蓝牙开发BLE-蓝牙连接 上一篇写了BluetoothGattCallback的一个方法,判断了蓝牙是否连上.他还有好几个方法,读写就是在这里面进行,读写操作都在Bluetoot ...

  5. Android蓝牙开发系列文章-蓝牙音箱连接

    经过一段时间的折腾,我的Android Studio终于可以正常工作了,期间遇到的坑记录在了文章<创建Android Studio 3.5第一个工程遇到的坑>. 我们在<Androi ...

  6. Android蓝牙开发(一)蓝牙模块及核心API

    本文主要介绍Android蓝牙开发中基础知识:蓝牙模块及核心API. 关于蓝牙的连接及通讯功能实现,欢迎查阅下一篇文章:Android蓝牙开发(二)蓝牙消息传输实现. 蓝牙模块 从蓝牙4.0开始包含两 ...

  7. Android蓝牙开发系列文章-其实你的手机可以变成一个蓝牙音箱

    本文是蓝牙音频相关的第3篇文章,查阅其他内容,请点击<Android蓝牙开发系列文章-策划篇>. 目前a2dp相关的内容有: <Android蓝牙开发系列文章-AudioTrack播 ...

  8. Android蓝牙开发系列文章-玩转BLE开发(一)

    我们在<Android蓝牙开发系列文章-策划篇>中计划讲解一下蓝牙BLE,现在开始第一篇:Android蓝牙开发系列文章-玩转BLE开发(一).计划要写的BLE文章至少分四篇,其他三篇分别 ...

  9. Android 蓝牙开发(三) -- 低功耗蓝牙开发

    Android 蓝牙开发(一) – 传统蓝牙聊天室 Android 蓝牙开发(三) – 低功耗蓝牙开发 项目工程BluetoothDemo 前面已经学习了经典蓝牙开发,学习了蓝牙的配对连接和通信,又通 ...

最新文章

  1. Python将小于0的书数换成0的几种方式
  2. 最大矩形面积_JAVA
  3. 项目管理一般知识:典型的信息系统项目的生命周期模型
  4. 2017年11月1号复习
  5. C语言 删除文件 M,最全的C盘可删除文件清单
  6. android区域截图app,【干货】最新App应用市场截图尺寸大全
  7. dz开启php5.5,Discuz5.5.0代码高亮显示+运行代码框合成插件 下载第2/4页
  8. Oracle查询一个范围,oracle字段范围查询
  9. 一个人能否成为大老板,赚大钱发大财
  10. php html转ubb,php ubb转换成html,html转换成ubb代码
  11. msm8937 bootloader流程分析
  12. Js判断数组中是否有某值
  13. 算法学习 | 期望dp+概率dp
  14. Windows下智能卡开发
  15. 外贸B2C系列:facebook使用教程
  16. uniapp文档常用整理
  17. 关于ssl证书:pem转成crt文件的最简单方法:直接改后缀名!
  18. 尚学堂JAVA基础学习笔记_2/2
  19. el-input输入字母转化大写字母
  20. 数独小项目开篇:DFS解决数独难题

热门文章

  1. 需求:在微信h5页面中下载第三方app —— 安卓, 直接下载apk文件包;iphone,跳转AppStore
  2. 投票系统源码--微信投票系统开发功能介绍以及源码分享
  3. BAT/头条/小米/京东/滴滴/美团...互联网大厂员工一年究竟能挣多少钱?
  4. 【迅为iMX6Q】开发板 Linux 5.15.71 RTL8211E 以太网驱动适配
  5. 查看服务器cpu和内存信息
  6. 【C语言程序】圆柱形粮仓
  7. python中pandas读文件,有中文字符
  8. 计算机网络项目教程,计算机网络 项目教程
  9. 幼儿卡通算术 v3.1 怎么用
  10. 大一c语言实践报告怎么写,c语言实践报告范文