清泛IT社区App Inventor 2 中文社区

搜索

扫码访问移动社区 移动社区,您的掌上技术专家

关注我,精彩不错过! 关注我,精彩不错过!

扫码安装最新版AI伴侣 最新版AI伴侣v2.72

Aia Store .aia 源码一站式解决方案 发布日志AI2连接测试ai2Starter模拟器

开通会员送SVIPApp Inventor 2 拓展有奖征文 VIP会员享专有教程,免费赠送基础版*技术支持服务! AI2入门必读中文文档中文教程IoT专题

查看: 5382|回复: 0
打印 上一主题 下一主题

[经验分享] BLE(二)信道&数据包&协议栈格式

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 283 天

    [LV.8]以坛为家I

    527

    主题

    914

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    22441

    AI2中文网VIP弹球达人接水果达人撸猫达人

    跳转到指定楼层
    楼主
    发表于 2024-02-05 11:23:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    文章源自:https://www.gandalf.site/2018/11/ble_23.html


    参考低功耗蓝牙(BLE)安全初探
    0x1 信道BLE的物理通道即“频道,分别是‘f=2402+k*2 MHz, k=0, … ,39’,带宽为2MHz”的40个RF Channel。
    其中,有3个信道是advertising channel(广播通道),分别是37、38、39,用于发现设备(Scanning devices)、初始化连接(initiating a connection)和广播数据(broadcasting date);
    剩下的37个信道为data channel(数据通道),用于两个连接的设备间的通讯。
    0x2 BLE数据包格式在低功耗蓝牙规范中,分广播报文和数据报文这两种。设备利用广播报文发现、连接其它设备,而在连接建立之后,便开始使用数据报文。无论是广播报文还是数据报文,链路层只使用一种数据包格式,它由“前导码”(preamble)、“访问码”(access code)、”有效载荷“和”循环冗余校验“(Cyclical Redundancy Check,CRC)校验码组成。其中,”访问码“有时又称为”访问地址“(access address)


    • Preamble
      1个字节长度,接受中用于频率同步、数据速率同步、自动增益控制调整,固定为01010101或者10101010序列
    • Access Address
      4个字节长度,广播报文接入地址为:0x8E89BED6,数据报文接入地址为:32bits随机数
    • PDU
      • 广播报文(见协议BLUETOOTH SPECIFICATION Version 4.0 [Vol 6] Part B 2.3)

        • PDU Type:有效载荷内容的类型,通过这一字段确定该数据包是一个”通告“还是”扫描请求“或”响应“等

        • RFU 保留位
        • TxAdd:发送地址字段
        • RxAdd:接收地址字段
        • Payload Length:用来表示”有效载荷数据“(payload data)的长度,不包括头部内容
      • 数据报文(见协议BLUETOOTH SPECIFICATION Version 4.0 [Vol 6] Part B 2.4)






      • LLID(逻辑链路ID):0x01表示该数据包是一个帧的延续内容,或者这是一个空的“逻辑链路控制及适配协议”数据包;0x02表示一个“逻辑链路控制及适配协议”数据包的开始;0x03表示这是一个“逻辑链路控制”数据包的内容
      • NESN:下一个期望的序列号,用于对接收到的数据包进行确认
      • MD:更多数据字段,主要是为了说明发送方是否还有要发给接收者的数据
      • RFU 保留位
      • Payload Length:用以表示包含“信息完整性校验码”(Message Integrity Check,MIC)在内的“有效载荷数据”的长




    CRC
    3个字节长度,“循环冗余校验”(Cyclical Redundancy Check,CRC),可检查数据的正确性
    0x3 BLE协议栈BLE协议栈的结构图如下所示:



    各个结构简述:
    • PHY: 使蓝牙可以使用2.4GHz频道,并且能自适应的跳频。
    • LL层: 控制设备处于 准备、广播、监听、初始化、连接等五个状态。
    • HCI层: 向上为主机提供软件应用程序接口,对外为外部硬件提供控制接口。
    • L2CAP层: 对传输数据实行封装。
    • SM层: 提供主机和客机的配对和密钥分发,实现安全连接和数据交换。
    • ATT层: 对数据主机或客机传入的指令进行指令搜索处理,
    • GATT层: 接收和处理主机或客机的指令信息,并将指令打包成合适的profile。
    • GAP层: 向上提供API,向下合理分配各个层工作。
    0x31 Physical Layer任何一个通信系统,首先要确定的就是通信介质(物理通道,Physical Channel),BLE也不例外。在BLE协议中,“通信介质”的定义是由Physical Layer(其它通信协议也类似)负责。
    Physical Layer是这样描述BLE的通信介质的:
    由于BLE属于无线通信,则其通信介质是一定频率范围下的频带资源(Frequency Band);
    BLE的市场定位是个体和民用,因此使用免费的ISM频段(频率范围是2.400-2.4835 GHz);
    为了同时支持多个设备,将整个频带分为40份,每份的带宽为2MHz,称作RF Channel。
    所以经过上面的定义之后,可以推测出BLE的物理通道,即“频道分别是‘f=2402+k*2 MHz, k=0, … ,39’,带宽为2MHz”的40个RF Channel。其中,有3个信道是advertising channel(广播通道),分别是37、38、39,用于发现设备(Scanning devices)、初始化连接(initiating a connection)和广播数据(broadcasting date);剩下的37个信道为data channel(数据通道),用于两个连接的设备间的通讯。


    0x32 Link LayerLink Layer用于控制设备的射频状态,设备将处于Standby(待机)、Advertising(通告)、Scanning(扫描)、Initiating(初始化)、Connection(连接)这五种状态中的一种。



    • 待机状态(Standby State):此时即不发送数据,也不接收数据,对设备来所也是最节能的状态;
    • 通告状态(Advertising State):通告状态下的设备一般也被称为“通告者”(Advertiser),它会通过advertising channel(广播通道)周期性发送数据,广播的数据可以由处于Scanning state或Initiating state的实体接收;
    • 扫描状态(Scanning State):可以通过advertising channel(广播通道)接收数据的状态,该状态下的设备又被称为“扫描者”(Scanner)。此外,根据advertiser所广播的数据类型,有些Scanner还可以主动向Advertiser请求一些额外数据;
    • 初始化状态(Initiating State):和Scanning State类似,不过是一种特殊的状态。Scanner会侦听所有的advertising channel,而Initator(初始化者)则只侦听某个特定设备的的广播,并在接收到数据后,发送连接请求,以便和Advertiser建立连接;
    • 连接状态(Connection State):由Initiating State或Advertising State自动切换而来,处于Connection State的双方,分别有两种角色。其中,Initiater方被称为Mater(主设备),Advertiser方则称作Slave(从设备)。
    0x33 HCI主机控制接口层(Host Controller Interface,简写 HCI):定义Host(主机)和Controller(控制器)之间的通信协议,这一层可以是软件或者硬件接口,如UART、SPI、USB等。
    0x34 Generic Access Profile(GAP)前面Link Layer虽然对连接建立的过程做了定义,但它并没有体现到Application(或者Profile)层面,而GAP则是直接与应用程序或配置文件通信的接口,它实现了如下功能:
    • 定义GAP层的蓝牙设备角色(role)
      • Broadcaster(广播者):设备正在发送advertising events
      • Observer(观察者):设备正在接收advertising events
      • Peripheral(外设):设备接受Link Layer连接(对应Link Layer的slave角色)
      • Central(主机):设备发起Link Layer连接(对应Link Layer的master角色)
    • 定义GAP层的用于实现各种通信的操作模式(Operational Mode)和过程(Procedures)
      • Broadcast mode and observation procedure,实现单向的、无连接的通信方式
      • Discovery modes and procedures,实现蓝牙设备的发现操作
      • Connection modes and procedures,实现蓝牙设备的连接操作
      • Bonding modes and procedures,实现蓝牙设备的配对操作
    • 定义User Interface有关的蓝牙参数,包括蓝牙地址、蓝牙名称、蓝牙的PIN码等
    • Security相关的定义。
    0x35 Logical Link Control and Adaptation Protocol(L2CAP Protocol)逻辑链路控制及自适应协议层(Logical Link Control and Adaptation Protocol):为上层提供数据封装服务,允许逻辑上的点对点数据通信。
    0x36 Security Manager(SM)Security Manager负责BLE通信中有关安全的内容,包括配对(pairing,)、认证(authentication)和加密(encryption)等过程。
    0x37 Attribute protocol(ATT)在BLE协议栈中,Physical Layer负责提供一系列的Physical Channel;基于这些Physical Channel,Link Layer可在两个设备之间建立用于点对点通信的Logical Channel;而L2CAP则将这个Logical Channel换分为一个个的L2CAP Channel,以便提供应用程序级别的通道复用。到此之后,基本协议栈已经构建完毕,应用程序已经可以基于L2CAP欢快的run起来了。
    谈起应用程序,就不得不说BLE的初衷——物联网。物联网中传输的数据和传统的互联网有什么区别呢?抛开其它不谈,物联网中最重要、最广泛的一类应用是:信息的采集。
    这些信息往往都很简单,如温度、湿度、速度、位置信息、电量、水压、等等。
    采集的过程也很简单,节点设备定时的向中心设备汇报信息数据,或者,中心设备在需要的时候主动查询。

    基于信息采集的需求,BLE抽象出一个协议:Attribute protocol,该协议将这些“信息”以“Attribute(属性)”的形式抽象出来,并提供一些方法,供远端设备(remote device)读取、修改这些属性的值(Attribute value)。
    Attribute Protocol的主要思路包括:
    • 基于L2CAP,使用固定的Channel ID
    • 采用client-server的形式。提供信息(以后都将其称为Attribute)的一方称作ATT server(一般是那些传感器节点),访问信息的一方称作ATT client。
    • 一个Attribute由Attribute Type、Attribute Handle和Attribute Value组成。
      • Attribute Type用以标示Attribute的类型,类似于我们常说的“温度”、“湿度”等人类可识别的术语,通过UUID进行区分。
      • Attribute Handle是一个16-bit的数值,用作唯一识别Attribute server上的所有Attribute。Attribute Handle的存在有如下意义:
        • 一个server上可能存在多个相同type的Attribute,显然,client有区分这些Attribute的需要。
        • 同一类型的多个Attribute,可以组成一个Group,client可以通过这个Group中的起、始handle访问所有的Attributes。
      • Attribute Value代表Attribute的值,可以是任何固定长度或者可变长度的octet array。
    • Attribute能够定义一些权限(Permissions),以便server控制client的访问行为,包括:
      • 访问有关的权限(access permissions),Readable、Writeable以及Readable and writable;
      • 加密有关的权限(encryption permissions),Encryption required和No encryption required;
      • 认证有关的权限(authentication permissions),Authentication Required和No Authentication Required;
      • 授权有关的权限(authorization permissions),Authorization Required和No Authorization Required。
    • 根据所定义的Attribute PDU的不同,client可以对server有多种访问方式,包括:
      • Find Information,获取Attribute type和Attribute Handle的对应关系;
      • Reading Attributes,有Read by type、Read by handle、Read by blob(只读取部分信息)、Read Multiple(读取多个handle的value)等方式;
      • Writing Attributes,包括需要应答的writing、不需要应答的writing等。

    0x38 Generic Attribute profile( GATT)ATT之所以称作“protocol”,是因为它还比较抽象,仅仅定义了一套机制,允许client和server通过Attribute的形式共享信息。至于具体共享哪些信息,ATT并不关心,这是GATT(Generic Attribute Profile)的主场。GATT相对ATT只多了一个‘G‘,然含义却大不同,因为GATT是一个profile(更准确的说是profile framework)。



    由上图可知,GATT中的三个要素Profile、Service、Characteristic以及他们的层级关系。值得注意的是,“Profile”是基于GATT所派生出的真正的Profile,乃SIG蓝牙技术联盟对一些同范畴内的Service打包后的集合,如电池、心率、血压等,可参照官方Profiles Overview,对分析并无大用。
    Service和Characteristic则是比较重要的,Service可以理解为PHP中的“类”、功能对象的集合。Characteristic可以理解为PHP的“函数”,是GATT中具体的功能对象,每个Service都可以包含一个或多个Characteristic(特征)。Characteristic是GATT profile中最基本的数据单位,由一个Properties、一个Value、一个或者多个Descriptor组成。
    以上除“Profile”外的每一个定义,Service、Characteristic、Characteristic Properties、Characteristic Value、Characteristic Descriptor等等,都是作为一个Attribute存在的,具备前面所描述的Attribute的所有特征:Attribute Handle、Attribute Types、Attribute Value和Attribute Permissions。
    在理解了GATT后,就已经能够分析或是“黑掉”一些BLE设备了。这里拿小米手环做例子,当LightBlue连上小米手环后,可以看到一个名为FEE7的UUID,如下所示:


    其中,FEE7是一个私有Service的UUID,里面的0xFE**则是私有Characteristic的UUID。下面的Immediate Alert 显示出了名称,代表其不是小米私有的Service,而是官方公开定义的Service。点击进入这个Characteristic,看到它的UUID为2A06。然后我们到蓝牙官网定义的列表Characteristics搜索2A06,进入Characteristic的详情页面。

    于是,该Characteristic操作定义非常明确了。点击“Write new value”,可以写入新的值。若写入1或2,则可以引起手环的震动。


    App Inventor 2 中文网 - MIT同步更新的中文本土化平台!v2.72 支持Android 14 更新日志
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    © 2024 tsingfun.com, Inc.  沪ICP备2020034476号-1  沪公网安备31011702000040号

    GMT+8, 2024-11-24 12:28 , Processed in 0.071495 second(s), 38 queries .