BLE协议栈为什么要分层?怎么理解BLE“连接”?如果BLE协议只有ATT层没有GATT层会发生什么? 1. 协议栈框架 一般而言,我们把某个协议的实现代码称为协议栈(protocol stack),BLE协议栈就是实现低功耗蓝牙协议的代码,理解和掌握BLE协议是实现BLE协议栈的前提。 在深入BLE协议栈各个组成部分之前,我们先看一下BLE协议栈整体架构。 ? 最终空中传输的数据包将变成: AAD6BE898E600E3B75AB2A02E102010504FF5900538EC7B2 AA – 前导帧(preamble) D6BE898E – 访问地址(access 0E – 有效数据包长度(payload length) 3B75AB2A02E1 – 广播者设备地址(advertiser address) 02010504FF590053 – 广播数据 8EC7B2
本章介绍蓝牙协议(重点介绍:BLE)的基本特点、版本演进、协议的构成、等基础知识,本章重在了解,目的是对BLE协议有个大概的认知,即了解BLE协议栈的全貌。 我们常说的蓝牙4.0不等同于BLE,BLE只是蓝牙4.0的子集;蓝牙4.0是一个综合性协议规范。 BLE协议栈的实现方式采用分层的思想: 控制器部分包括:物理层(PHY)、链路层(LL)、控制接口层(HCI) 主机部分包括:裸机链路控制及自适应协议层(L2CAP)、安全管理层(SMP)、属性协议层( 图片 03-链路层(LL) 低功耗蓝牙参考 《Core_v5.3.pdf》中 Part B: Link Layer Specification 章节部分,LL层是整个BLE协议栈的核心,也是BLE协议栈的难点和重点 没有GATT,BLE协议栈也能跑,但互联互通就会出问题。
蓝牙BLE组成 BLE由三个主要构建模块组成:应用程序、主机和控制器。顾名思义,应用程序块是与蓝牙协议栈交互的用户应用程序。主机覆盖蓝牙协议栈的上层。控制器覆盖下层。 主机包含以下层: l 通用访问配置文件(GAP) l 通用属性配置文件(GATT) l 逻辑链路控制和适配协议(L2CAP) l 属性协议(ATT) l 安全经理(SM) l 主机控制器接口 现在我们可以转到BLE设备的主机部分。 逻辑链路控制和适配协议(L2CAP) L2CAP负责两项任务:1、它需要来自上层的多个协议,并将它们封装成标准的BLE数据包格式(反之亦然)。 层负责或路由两个主要协议:属性协议(ATT)和安全管理器协议(SMP)。 属性协议(ATT) 属性协议(ATT)是基于设备呈现的属性的简单客户端/服务器协议。客户端从服务器请求数据,然后服务器将数据发送给它的客户端。
环境搭建 上面介绍了数据包和各层协议,接下来我们将使用Ubertooth One来捕获通信过程中的蓝牙数据包。 ? /configure make && make plugins sudo make suidinstall sudo make plugins-install (6)安装BLE解密工具crackle crackle low mtu <value> Exchange MTU for GATT/ATT [ ][1C:96:5A:FF:4B:E7] capture occurs. ubertooth-btle -f -ctest.pcap抓包&保存到本地 使用这条命令我们可以把设备捕获到的数据包保存到本地,完成后可导入wireshark进行数据包、协议分析 使用规则过滤数据包:参考Capturing BLE in Wireshark btle.data_header.length > 0 || btle.advertising_header.pdu_type
因dubbo协议采用单一长连接,假设网络为千兆网卡(1024Mbit=128MByte),根据测试经验数据每条连接最多只能压满7MByte(不同的环境可能不一样,供参考),理论上1个服务提供者需要20个服务消费者才能压满网卡 因dubbo协议采用单一长连接,如果每次请求的数据包大小为500KByte,假设网络为千兆网卡(1024Mbit=128MByte),每条连接最大7MByte(不同的环境可能不一样,供参考),单个服务提供者的 单个消费者调用单个服务提供者的TPS(每秒处理事务数)最大为:7MByte / 500KByte = 14。如果能接受,可以考虑使用,否则网络将成为瓶颈。 为什么采用异步单一长连接? http协议 基于http表单的远程调用协议。 thrift协议 当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,比如service name,magic number等
--- S7Comm S7Comm(S7 Communication)是西门子专有的协议,是西门子 S7 通讯协议簇里的一种。 S7 协议的 TCP/IP 实现依赖于面向块的 ISO 传输服务。 S7 协议被封装在 TPKT 和 ISO-COTP 协议中,这使得 PDU(协议数据单元)能够通过 TCP 传送。 S7Comm 以太网协议基于 OSI 模型,从 wireshark 协议分级可以看出排列。 S7Comm 协议包含三部分: Header Parameter Data 根据实现的功能不同,S7 comm 协议的结构会有所不同。 下一篇文章,我们将继续学习S7comm协议Userdata 协议拓展部分。 --- 本文作者 r0fus0d
前言 在上一篇文章中,我们介绍了S7Comm协议的S7Comm Header和Job 和 Ack_Data机制。 本篇文章,我们将继续介绍S7Comm协议的Userdata 协议拓展并结合pcap流量包实际分析。 --- Userdata 协议拓展 UserData 用于编程/调试、读取 SZL、安全功能、时间设置,循环读取等。 读时间(Read clock); 请求 [13.png] 响应 [14.png] --- 总结 本文,我们分析了S7Comm协议的Userdata 协议拓展部分。 通过与pcap流量包的结合分析,可以更加直观的了解其原理和交互过程,学习S7Comm协议对于工控安全非常重要,在之后的文章里,我们还将继续学习modbus和Ethernet/IP协议相关内容。
基于 UDP 的“城会玩”的五个例子 城会玩 一:网页或 APP 的访问 网页和手机 APP 都是基于 HTTP 协议的,而HTTP 协议是基于 TCP 的,建立连接都需要多次交互,对于时延比较大的移动互联网来讲 “城会玩” 二:流媒体的协议 直播协议多使用 RTMP,这个协议就是基于 UDP 的。TCP 的严格顺序传输要保证前一个收到了,下一个才能确认。 Google 旗下的 Nest 建立 Thread Group,推出了物联网通信协议 Thread,就是基于 UDP 协议的。 “城会玩” 五:移动通信领域 在 4G 网络里,移动流量上网的数据协议 GTP-U 也是基于 UDP 的。因为移动网络协议比较复杂,而 GTP 协议本身就包含复杂的手机上线下线的通信协议。 参考: 百度百科-UDP 词条; 刘超-趣谈网络协议系列课;
对 RxSwift 及 BLE 感兴趣的同学可以看看,或有所得。
核心优势 成熟的技术基础和广泛的市场支持 技术体系:稳定硬件设计、完善软件协议、丰富应用场景。 市场基础:众多设备制造商支持,高普及率和用户基础。 数据包格式 BLE的数据包格式确保了数据传输的完整性和可靠性,其基本结构包括前导序列、访问地址、PDU(Protocol Data Unit,协议数据单元)报头、PDU长度、PDU数据和CRC(Cyclic 简化的协议栈:降低了开发成本和复杂性,提高了设备的兼容性和互操作性。 BLE技术的起源与基础版本 BLE技术起源于蓝牙4.0版本,该版本首次引入了低功耗蓝牙协议栈,旨在降低蓝牙设备的功耗,延长电池寿命。 特点:BLE以其低功耗著称,适用于不需要高数据传输速率但对功耗有严格要求的应用场景,如健康监测设备、智能家居控制等。BLE技术还具备快速连接与断开、短距离通信以及简化的协议栈等优势。 3.2.
Attribute Protocol(ATT)— GATT 在 ATT 协议基础上建立,也被称为 GATT/ATT。ATT 对在 BLE 设备上运行进行了优化,为此,它使用了尽可能少的字节。 // 使用此检查确定 BLE 是否支持在设备上,然后你可以有选择性禁用 BLE 相关的功能 if (! ---- 你的 app 能与 BLE 通信之前,你需要确认设备是否支持 BLE,如果支持,确认已经启用。 如果不支持BLE,那么你应该适当地禁用部分BLE功能。如果支持BLE但被禁用,你可以无需离开应用程序而要求用户启动蓝牙。使用BluetoothAdapter两步完成该设置。 连接到GATT服务端 ---- 与一个BLE设备交互的第一步就是连接它——更具体的,连接到BLE设备上的GATT服务端。
低功耗蓝牙BLE外围模式(peripheral)-使用BLE作为服务端 Android对外模模式(peripheral)的支持 从Android5.0开始才支持 关键术语和概念 以下是关键BLE术语和概念的摘要 : 通用属性简档(GATT) - GATT简档是用于通过BLE链路发送和接收称为“属性”的短数据块的一般规范。 属性协议(ATT) -GATT建立在属性协议(ATT)之上。 这也称为GATT / ATT。 ATT经过优化,可在BLE设备上运行。 为此,它使用尽可能少的字节。 角色和职责 以下是Android设备与BLE设备互动时适用的角色和职责: 中央与外围。 这适用于BLE连接本身。 处于中心角色的设备扫描,寻找广告,并且外围角色中的设备进行广告。 然后在运行时,您可以通过使用PackageManager.hasSystemFeature()确定BLE可用性: // Use this check to determine whether BLE
BLE 考虑功耗, 使用了3个广播信道,顺序广播。 两个蓝牙设备想要建立连接, 第一步是 从机(server) 向外广播, 主机(client) 搜索到后发起请求。 7f223bf9-4d85-4e25-917d-222fb063b540.png 每个包都是 31 字节,数据包中分为有效数据(significant)和无效数据(non-significant)两部分
characteristic的发现、读、写、通知(Notifing)、指示(Indicating) 及配置characteristic的广播 GATT可以被Application或其他Profile使用 其协议栈如下图 判读一个服务是Primary or Secondary Service可通过高层协议强制规定 2.2.2 Included Service 一个Included Service是一种引用已存在服务的方法 高层协议也可以定义协议相关的Characteristic Descriptors Characteristic Descriptors在服务端上是无序的,Client不应该理所当然 Characteristic Descriptors Declarations Permissions由高层协议定义或协议相关的 Client不应该理所当然地认为是可读的 Characteristic Descriptor Declarations Reading a Characteristic Value 7. Writing a Characteristic Value 8.
最早了解 BLE 中继攻击是在 2022 年 3 月份,在网上搜了一堆关于 BLE 攻击方法的介绍,但当时并不知道无钥匙进入系统这么个东西,所以没感觉到中继攻击有什么大用途,当时接触的是些手环、灯泡这类的物联网设备 后来在 5 月份的时候 NCC 发布了 BLE 链路层中继解锁特斯拉的视频(https://youtu.be/5mdU4ksOc2w),发现原来 BLE 中继还挺有用的,就回头看了看之前搜集的资料,尝试搭建了 btlejuice 这个用来 BLE 中继攻击的工具(再吐槽一次 npm 安装东西太难了叭) 先把 btlejuice 以及 gattacker 这些中继攻击思路简单描述一下: 用两台带有蓝牙适配器的电脑 钥匙就无能为力了,与 NCC 发的视频实现的效果差距太大,便没有深入研究了 后来在网上冲浪的时候发现 NCC 在 hardware.io 分享了他们对 BLE 进行链路层中继的实现思路(https:/ 不会嵌入式开发,告辞 后来看到了小米的师傅们要在 KCon 分享他们实现的 BLE 链路层中继,斥巨资买了张门票(真就为了这个议题去的哈哈哈)然后心满意足的听了小米的师傅们对 BLE 攻击的分享(还说工具要在
索尼相机现在支持基于蓝牙低功耗 (BLE) 的控制协议。该接口允许客户端控制以及从支持 BLE 的遥控器获取状态。 遙控器 对于启用了索尼 BLE 的相机,发现过程相当简单。 UUID 唯一的 UUID 也在 a7c 上发送,但不在 a7m4 上。这可能是每个相机独有的。 例如 ILCE-7C 有8E3F7E15-AF80-1567-D946-A9190C2Cf98A 服务 支持的摄像机有多种操作模式,可确定哪些服务可操作。 命令 回应 如果存在协议错误,IRC 将返回 0x0185 GATT 状态。如果拍摄照片或开始录制等过程,将发送各种通知。 原生的遥控器260元,有了协议,几十块钱就可以做一个,而且功能可以做的更多。 至于实现,我应该是写过。大家感兴趣的去翻翻。
打开手机app,扫描周围的设备(从机),支持过滤功能 (2)设备信号强度(RSSI)查看 可以很清晰的观察rssi的变化: (3)连接设备 点击“CONNECT”按钮,即可连接目标设备,这里以“BLE-UART (5)特征读写 ble是通过特征传输数据的,特征又有不同的属性,ff05这个特征只支持写。 (6)修改MTU 通过Request MTU可以修改MTU,提高数据的传输量。 2、BLE调试助手 这个是南京沁恒开发的app,调试起来也比较方便,支持从机模式,用法和nRF Connect差不多。 (3)特征读写 (4)修改MTU 上面3个ble调试app,都可以使用,个人推荐nRF Connect和BLE调试助手。
射频通道,编号0-39,每个2M,分为广播通道和数据通道,广播通道是37,38,39,其余都是数据通道。
引言 本文接着撸Distro协议,上文中分析了在Nacos server启动时会进行全量数据同步和数据校验,具体数据即客户端注册节点信息含命名空间、分组名称、服务名称、节点Instance信息等。 request.getGroupName(), request.getServiceName(), true); switch (request.getType()) { // 注解@7 , String.format("Unsupported request type %s", request.getType())); } } 注解@7
a946c352dd3ad04cf9830d5e72ffb11e", uri="rtsp://192.17.1.63:554/", response="9ea6c2659d3bce8d129ca3549ecc7fbf