ble基础

一、蓝牙基础

蓝牙标准profile
bluez linux tools
一文读懂BLE

1.1 蓝牙分类

蓝牙分为经典蓝牙(BT-Bluetooth)和低功耗蓝牙(BLE-Bluetooth Low Energy)。这两套原理和实现都不一样,也无法实现互通。

Basic Rate(BR)/EDR/AMP

最初的蓝牙技术,包括可选的EDR(Enhanced Data Rate)技术和交替使用的MAC层和PHY层扩展 AMP(Alternate MAC and PHY layer extension)【优化传输速度的过程】
蓝牙诞生之初使用的BR技术,传输速率很低,随着发展而变得无法支持,所以引入了EDR,这时还没有修改软硬件架构,但是之后又落伍了,所以直接引入了WiFi的底层协议,也就是MAC/PHY扩展,但这部分的实现就无法直接更替,所以BR/EDR只能与AMP交替使用。
经典蓝牙主要用于数据量较大的传输,如蓝牙电话接听,蓝牙耳机,音箱等。

Low Energy(LE)

蓝牙低功耗,则不关心传输速率,而是从降低功耗的角度实现的另一套技术,跟前面的协议没有丝毫关系。

一般而言,经典蓝牙主要应用在蓝牙电话接听,蓝牙耳机,蓝牙音箱等场合,低功耗蓝牙应用在可穿戴设备,IoT智能设备,健身设备,蓝牙鼠标键盘等电池供电场合。
经典蓝牙和BLE区别
经典蓝牙和BLE

需要引起大家注意的是,经典蓝牙和低功耗蓝牙两者物理层调制解调方式是不一样的,所以低功耗蓝牙设备和经典蓝牙设备两者之间是不能相互通信的,选型的时候千万不要搞混,如果主设备是低功耗蓝牙设备,从设备也必须是低功耗蓝牙设备;同样,经典蓝牙的从设备也只能和经典蓝牙的主设备进行通信。不过市场上还有一种双模蓝牙设备,即同时支持低功耗蓝牙和经典蓝牙,比如我们天天用到的手机,手机可以和经典蓝牙设备通信,也可以和低功耗蓝牙设备通信,如前所述,这不代表低功耗蓝牙设备可以和经典蓝牙设备通信,其实手机使用了分时机制来达到同时和低功耗蓝牙设备以及经典蓝牙设备通信的目的,即手机让双模蓝牙芯片不断地在低功耗蓝牙模式和经典蓝牙模式之间进行切换,以同时支持低功耗蓝牙设备和经典蓝牙设备。低功耗蓝牙方案,经典蓝牙方案,还是双模蓝牙方案,大家选型的时候一定要弄明白他们之间的区别,以选择适合自己的蓝牙方案。

BLE分了很多个版本,现在用的比较多的就是4.2和5.X。那4.2到5.0之间有哪些升级呢?首先,4.2版本传输速度只有1Mbps,广播包最大长度为31字节。而5.0版本开始,传输速度就已经增加到2Mbps了,并且广播包的最大长度也增加为254字节。除此之外,5.X版本还增加了Mesh的功能,且通讯距离也增加至300米以上。

1.2 数据字节序

属性协议中的多字节字段应首先发送最低有效八位字节(小字节序),但属性值字段除外。属性值字段的字节序由更高层规范定义。

1.3 数据完整

BLE所有命令都是“必达”的,也就是说每个命令发出去之后,会立刻等ACK信息,如果收到了ACK包,发起方认为命令发送完成。否则发起方会一直重发该命令,直到超时导致BLE连接断开。换句话说,只要BLE没有断开,那么发送的数据包,一定会被对方收到。

一次事务是一次请求/响应或指示/确认。一次事务应在一次ATT交互中实现,不应被分开到多个交互。事务的超时时间为30s。超时后连接应该断开,数据状态不确定。
An attribute protocol request and response or indication-confirmation pair is considered a single transaction. A transaction shall always be performed on one ATT Bearer, and shall not be split over multiple ATT Bearers.
A transaction not completed within 30 seconds shall time out. Such a transaction shall be considered to have failed and the local higher layers shall be informed of this failure. No more attribute protocol requests, commands, indications or notifications shall be sent to the target device on this ATT Bearer.
Note: To send another attribute protocol PDU, a new ATT Bearer must be established between these devices. The existing ATT Bearer may need to be disconnected or the bearer terminated before the new ATT Bearer is established.
If the ATT Bearer is disconnected during a transaction, then the transaction shall be considered to be closed, and any values that were being modified on the server will be in an undetermined state, and any queue that was prepared by the client using this ATT Bearer shall be cleared.

1.4 数据安全

设备间要安全通信,最重要的就是双方要共享一把密钥,在BLE就是LTK(Long Term Key)。Security Manager安全管理定义了一系列复杂的机制来完成LTK的实现:配对和密钥分发方法,这些方法的一套协议SMP,以及密码工具箱等。SM是利用密钥分发方式去完成通信的身份认证和加密功能。该安全架构设计的优点是:响应设备(responding device)对内存和处理能力的要求比初始化设备(initiating device)低。
The Bluetooth security model includes five distinct security features: pairing, bonding, device authentication, encryption and message integrity.

二、数据包

2.1 数据包格式(PACKET FORMAT)

The Link Layer has only one packet format used for both advertising channel packets and data channel packets.Core_v4.2 page2582
packet format1
广播报文报头
广播报文
广播报文:长度域包含6个bit,有效值范围6~37. (相比数据报文,广播报文必须包含6个字节的广播设备地址
数据报文:长度域包含5个bit,有效值范围0~31.
广播数据格式

2.2 wireshark抓包

wireshark安装USBpcap的拓展插件,而非直接选择“蓝牙网络连接”,参考:浅谈蓝牙流量捕获分析
USBPcap 是一个专为Windows操作系统设计的开源USB数据包捕获工具,它允许开发者和高级用户监控并记录USB设备的所有通信流量。该项目提供了驱动程序和一个简单的用户空间应用USBPcapCMD,方便用户进行数据分析和调试。
usbpcap安装完成后,如果wireshark没有找到USBPcap相关的接口,需要拷贝USBPcapCMD.exe到wireshark\App\Wireshark\extcap中,然后wireshark重新搜索接口。

bluetoothusb.src == "host"
usb.dst == "2.5.0"
frame.len == 36_ws.cl.info == "GET DESCRIPTOR Request DEVICE"
_ws.col.protocol == "USB"组合条件
usb.src == "2.5.0" && _ws.col.protocol == "USB"抓到的报文,可以过滤显示,当前usb设备 地址
usb.device_address==5(1 2 3 ...)

三、蓝牙协议

ble_frame
ble_profile

UUID

UUID(universally unique identifier,通用唯一识别码)是一个软件构建标准,并非BLE独有的概念,一个合法的UUID,一定是随机的,全球唯一的,不应该出现两个相同的UUID。但是在一个GATT表中可能有许多属性,这些属性可能有相同的UUID。
UUID即可以是2字节也可以是16字节。因为一些常用的UUID,为了减少传输的数据量,BLE协议做了一个转换约定。给定一个固定的16字节模板,只设置2个字节为变化量,其他为常量。2字节的UUID在系统内部会被替换,进而转换成保准的16字节的UUID。

0x1800 – 0x26FF :服务项类型
0x2700 – 0x27FF :单位
0x2800 – 0x28FF :属性类型
0x2900 – 0x29FF :描述符类型
0x2A00 – 0x7FFF :特征值类型

为了明确标准的蓝牙服务,蓝牙技术联盟SIG定义UUID共用了一个基本的UUID模板:0x0000xxxx-0000-1000-8000-00805f9b34fb
而2字节的UUID则替代上边的XXXX。例如心率测量特性使用0X2A37作为它的16位UUID,因此它完整的16字节的UUID为:0x00002A37-0000-1000-8000-008005F9B34FB。

蓝牙技术联盟所用的基本UUID不能用于任何定制的属性、服务和特性。对于定制的属性,必须使用完整的16字节UUID。

属性ATT

属性协议(Attribute Protocol)简称ATT。是GATT和GAP的基础。
一个属性其实就是一条数据,属性是BLE数据提供单元,也是蓝牙空中传播数据的最上层。

特征Characteristic

一个特征至少包含2个属性:一个属性用于声明,一个属性用于存放属性的值。

所有通过GATT服务传输的数据必须映射成一系列的特征,可以把特征中的这些数据看成是一个个捆绑起来的数据。每个特征就是一个自我包容而独立的数据点。例如,如果几个数据总是一起变化,那么可以把它们集中在一个特性里。

如何使用特征(characteristic)依据他的性质(property),特性的性质包括:

写 和 没有回应的写:允许GATT客户端写一个值到GATT服务端的一个特征中。
他们之间不同的地方在与没有回应的写事件没有任何应用层上的确认或回应。

读:一个GATT客户端可以读取在GATT服务端中特性的值。

通知:客户端发请求服务端,不需要服务端回复一个响应
指示:客户端发请求给服务端,需要服务端回复一个响应。
通知和指示性质允许GATT服务端在其某个特征改变的时候对GATT客户端进行提醒。通知和指示之间不同之处在与指示有应用层上的确认,而通知没有。

注:Client和Server之间是通过ATT PDU来通讯的,ATT PDU主要包括4类:读、写、通知和指示。如果一个命令需要response,那么会在相应的指令后面加上request。如果一个命令只需要ACK而不需要response,那么后面就不会带request。这里要特别强调一点,BLE所有命令都是“必达”的,也就是说每个命令发出去之后,会立刻等ACK信息,如果收到了ACK包,发起方认为命令发送完成。否则发起方会一直重发该命令,直到超时导致BLE连接断开。换句话说,只要BLE没有断开,那么发送的数据包,一定会被对方收到。

那既然每个ATT命令都必达对方,那么为什么还需要request呢?如果一个命令带有request后缀,那么发起方就可以收到命令的response包,这个response包在应用层是有回调事件的,而ACK包在应用层是没有回调事件的。所以采用request/response方式,应用层可以按顺序地发送一些数据包,这个在很多应用场景中是非常有用的。相反,如果对应用层数据包的顺序没有要求,那么就可以不使用request/response形式。另外request/response有一个副作用:大大降低通信的吞吐率。因为request/response必须在不同的连接间隔中出现。也就是说,如果在间隔1中发送了一个request命令,那么response包必须在间隔2或者稍后间隔中回复,而不能再间隔1中回复。这就导致两个连接间隔最多只能发一个数据包,而不带quest后缀的ATT命令就没有这个问题,在同一个连接间隔中,可以同时发送多个数据包,这样就大大提供数据的吞吐率。

常用的带request的命令:所有读命令,写,指示等。而常用的不带request的命令有没有回应的写,通知等。

描述符

任何在特征中的属性不是定义为属性值,就是为描述符。描述符是一个额外的属性以提供更多的特征信息。它提供一个人类可识别的特性描述的实例。

有一个特别的描述符需要特别注意:客户端特性配置表述符(Client Characteristic Configuration Descriptor,CCCD),这个描述符是给任何支持通知和指示功能的特性额外增加的。在CCCD中写入"1"使能通知功能,写入"2"使能指示功能,写入"0"同时禁止通知和指示功能。

服务service

一个服务包含一个或多个特性,这些特性是逻辑上相关的集合体。

GATT服务一般包含几块具有相关性的功能,比如特定传感器的读取和设置,人机接口的输入和输出。组织具有相关的特性到服务中即实用又有效。因为它使得逻辑上和用户数据上的边界变得更加清晰,同时它也有助于不同应用程序间代码的重用。GATT基于SIG蓝牙技术联盟官方设计,SIG建议根据用户自己的规范设计自己的profile。

profile(数据配置文件)

一个profile文件可以包含一个或多个服务,一个profile文件包含需要的服务信息或者是与设备如何交互的配置文件选项信息。设备的GAP和GATT的角色都可能在数据的交换过程中改变,因此,这个文件应该包含广播的种类、所使用的连接间隔、所需的安全等级等信息。

注:一个Profile中的属性表不能包含另一个属性表。

GAP

GAP定义了四个角色:广播者,扫描者,外围设备,中央设备。
GAP is an acronym for the Generic Access Profile, and it controls connections and advertising in Bluetooth. GAP is what makes your device visible to the outside world, and determines how two devices can (or can't) interact with each other.

GATT

GATT-Generic Attribute profle-通用属性配置文件。GATT层是传输真正数据所在的层。包括了一个数据传输和存储架构以及其基本操作。GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。
GATT定义了两类角色:服务端(server)和客户端(client),GATT角色无需和GAP角色绑定,但是可能由更高层的规范进行指定。

ATT协议层

ATT协议数据包格式(来自Bluetooth specification Version 4.2)
Attribute opcode + Parametes (不同操作码参数不同)
ATT PDU
ATT prot1
ATT prot2

协议数据

广播

0x020A000B096D696E695F3030303000
0x020A000C09426C75655A20352E353500

参考

  1. 蓝牙ble学习--概述
  2. 低功耗蓝牙和经典蓝牙概述
  3. 蓝牙BLE学习-GATT和ATT
  4. 深入理解Bluez协议栈之“好用的小工具”
  5. 一文读懂BLE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857010.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬取小说案例-BeautifulSoup教学篇

@目录前言导航BeautifulSoupBeautifulSoup介绍BeautifulSoup的使用1. 导入库2. 实例化对象3. 提取数据成果共勉博客 前言 当我们进行爬取各种资源,拿到源码进行解析数据的时候,会用到各种解析方式,本文介绍的爬取小说的一个案例,使用比较受欢迎的python第三方库BeautifuSou…

vue基础指令示例

1、vue基础示例<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>基础指令</title><script src="../vu/js/vue.js"></script><style>.box1{width: 150px;height: 1…

楚慧杯Misc—复现

gza_CrackerCrack_me 追踪tcp流量找到字典保存字典,上流量一把梭base64解密特殊流量2 一把梭出个www.zip打开,是个RSA <?php $cmd = @$_POST[ant]; $pk = <<<EOF -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfhiyoPdM6svJZ+QlYywklwVcx…

INFINI Labs 产品更新 | Console/Gateway/Agent 等产品开源发布首个版本

INFINI Labs 产品又更新啦~,包括 Easysearch v1.9.0、Gateway、Console、Agent、Loadgen v1.27.0。本次各产品更新了很多亮点功能,如 Easysearch 优化了多版本兼容配置;Console/Gateway/Agent/Loadgen 及 Framework 开源后,发布首个重大更新版本,支持过期元数据删除,指标…

JVM简介—1.Java内存区域

大纲 1.运行时数据区的介绍 2.运行时数据区各区域的作用 3.各个版本内存区域的变化 4.直接内存的使用和作用 5.站在线程的角度看Java内存区域 6.深入分析堆和栈的区别 7.方法的出入栈和栈上分配、逃逸分析及TLAB 8.虚拟机中的对象创建步骤 9.对象的内存布局 10.对象的访问定位 …

鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】

鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析 万物智联,打造无缝智能生态 在科技不断迭代更新的今天,每一次技术的飞跃都是对未来的深刻探索。华为,这个始终站在科技前沿的企业,再次以HarmonyOS 5.0(Next)这一操作系统的新篇章,向我们展示了科技如…

EVM介绍及字节码简单逆向

什么是EVM 以太坊是一个分布式的状态机,其中的状态不仅包含所有的账户和余额,还有EVM和EVM状态(可以被预先定义的规则所改变的东西); EVM是以太坊中的虚拟机,可以允许不被信任的代码执行;它是一个基于栈的虚拟机,有一个短暂的内存和一个永久存储的状态;PC:类似计算机中的…

HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】

HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】 一、HarmonyOS 5.0美学与科技的完美融合 在科技飞速发展的今天,每一个细微的创新都可能引领一场变革。华为,作为科技领域的领航者,再次以HarmonyOS 5.0(Next)这一里程碑式…

fellyfin 开启硬件加速 Ubuntu 安装硬件驱动

需要 root 权限。在主机系统上安装该intel-gpu-tools包,用于在 Linux 上调试英特尔显卡驱动程序。不同发行版的名称不同。在 Debian 和 Ubuntu 上:sudo apt update && sudo apt install -y intel-gpu-tools在 Jellyfin 网络客户端中播放视频,并通过设置较低的分辨率…

开箱即用的个人主页页面开发实战—基于HarmonyOS 5.0 (Next)和ArkTS的实现【HarmonyOS 5.0(Next)】

开箱即用的个人主页页面开发实战—基于HarmonyOS 5.0 (Next)和ArkTS的实现【HarmonyOS 5.0(Next)】 一、HarmonyOS 5.0(Next)革新设计理念,打造和谐美学 在科技日新月异的今天,操作系统作为智能设备的灵魂,正不断推动着数字生活的变革。华为,作为全球领先的科技企业,…

数据结构期末复习

武汉理工大学数据结构期末复习数据结构期末复习 By Persona_owl 第一章 绪论 1. 基本概念和术语数据:计算机操作的对象的总称,是信息的符号表示形式。数据元素: 数据的基本单位,通常作为一个整体进行处理,由更小的数据项组成。数据项是数据不可分割的最小单位。数据结构: 存…