IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 蓝牙开发底层的几种协议介绍 -> 正文阅读

[移动开发]Android 蓝牙开发底层的几种协议介绍


适用范围:经典蓝牙模块多用在蓝牙音频模块,大量数据传输,对耗电量没有严苛要求的设备,同时又分为传统蓝牙和高速蓝牙模块。
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协议是传统蓝牙面向应用层的协议,可以通过该协议实现大流量的数据传输。
在这里插入图片描述
最后借用别人一张图,整个蓝牙模块交互图:
在这里插入图片描述

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:35:55  更:2021-12-24 18:37:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:46:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码