zoukankan      html  css  js  c++  java
  • Bluetooth Low Energy介绍

    1. 介绍

    Bluetooth low energy,也称BLE(低功耗蓝牙),在4.0规范中提出

    BLE分为两种设备

     - 单模(single-mode): Logo为「Bluetooth®Smart」
     - 双模(dual-mode):   Logo为「Bluetooth®Smart Ready」

    TIP: 传统蓝牙的Logo为「Bluetooth®」

    BLE与传统蓝牙的兼容性如下图所示

    image

    可以看出他们之间的通信规则如下(Bluetooth指代传统蓝牙,下同)

     - Smart Ready: Smart Ready、Bluetooth、Smart
     - Bluetooth:   Smart Ready、Bluetooth
     - Smart:       Smart Ready、Smart

    2. 协议栈

    BLE协议栈如下图所示

    image

    BLE协议栈由Controller和Host两部分组成;Profile和Service基于GAP和GATT

    协议栈各层次介绍如下

     - PHY:   1Mbps自适应跳频GFSK, 运行在2.4GHz频段
     - LL:    RF控制器, 控制设备的链路状态 
     - HCI:   接口层, 向上为主机提供软件应用程序接口, 对外通过通过串口、SPI、USB实现设备控制 
     - L2CAP: 为上层提供数据封装服务, 允许逻辑上的端到端数据通信 
     - SM:    提供配对和密钥分发服务, 实现安全连接和数据交换 
     - GAP:   直接与应用程序或配置文件通信的接口, 处理设备发现和连接相关服务; 另外还处理安全特性的初始化 
     - ATT:   导出特定的数据(称为属性)到其他设备 
     - GATT:  定义了使用ATT的服务框架和配置文件(Profiles)的结构; BLE中所有的数据通信都需要经过GATT

    3. 链路层

    3.1 链路状态机

    链路层操作可以描述为链路状态机(The Link Layer State Machine)
    链路状态机有如下五种状态

    - Standby State:      准备, 不传输或接受数据包
    - Advertising State:  广播, advertiser, 发送advertising channel packets, 接受来自scanner的响应
    - Scanning State:     监听/扫描, scanner, 监听来自advertiser的advertising channel packets
    - Initiating State:   初始化, initiator, 监听来自特殊设备的advertising channel packets,并进行初始化连接
    - Connection State:   连接, 有两种角色: Master Role(从initiator进入)/Slave Role(从advertiser进入)

    image

    链路状态机只允许处于五种状态之一;链路层可以有多个链路状态机,但至少有一个支持Advertising/Scanning State

    处于Master Role的设备可以和多个Slave Role分时通信;处于Slave Role的设备只能和处于Master Role的设备通信

    下图展示了允许和禁止的链路状态机和角色的组合

    image

    3.2 比特序

    在链路层规范中规定Packet/PDU比特序(Bit Ordering)为Little Endian format;LSB最先发送

    3.3 设备地址

    设备地址(Device Address)可以是公共地址或者随机地址,长度为48 bits

    公共地址采用IEEE 802-2001 standard的48-bit universal LAN MAC addresses,格式如下

    image

    随机地址格式如下

    image

    3.4 物理信道

    BLE RF信道(Physical Channel)被定义为两种: advertising and data

     - advertising信道: 使用3个RF信道用来发现设备, 初始化连接和广播数据
     - data信道:        则使用多达37个RF信道用于两个连接设备间通信

    RF Channel和Advertising/Data channel Index对应关系如下图
    image

    4. BLE报文

    4.1 报文格式

    对于BLE链路层,advertising/data channel packet格式如下

    image

    数据包长度为80~376bits(10~47Byte)

    - Preamble: 前导码, 用于接收方同步频率等 
        advertising channel packet - 10101010b 
        data channel packet        - 10101010b或01010101b 
    - Access Address: 接入地址 
        advertising channel packet - 0x8E89BED6 
        data channel packet        - 每个链路层连接都有其唯一值, 由initiator随机生成, 相关限制可参看规范 
    - PDU: 协议数据单元, 对于advertising和data channel packet, 有各自的格式要求 
    - CRC: 由PDU计算得到

    4.2 RFU

    Reserved For Future Use,留待后用,设置为0,接收后被忽略

    4.3 Advertising Channel PDU

    PDU格式如下
    image
    Header部分格式如下
    image

    Header各字段含义如下

     - PDU Type: 定义PDU类型 
     - TxAdd/RxAdd: 由PDU类型决定,若未定义,则认为是RFU 
     - Length: 定义Payload的字节数(octets),有效范围是6~37Bytes 
     - Payload: 由PDU类型决定

    其中PDU类型如下
    image

    在Adv PDUs中,AdvData/ScanRspData指来自Host的数据

    4.3.1 Advertising PDUS

    Advertising PDUS包含下面几种类型

    - ADV_IND: 表明自己是可以被连接的 
        Payload - AdvA(6 octets) + AdvData(0~31 octets) 
            AdvA字段为advertiser的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址)
    
    - ADV_DIRECT_IND: 向特定设备建立连接 
        Payload - AdvA(6 octets) + InitA(6 octets) 
            AdvA字段为advertiser的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址) 
            InitA字段为initiator(接收方)的地址(RxAdd=0表示公共地址, Rxadd=1表示随机地址)
    
    - ADV_NONCONN_IND: 用于广播信息 
        Payload - AdvA(6 octets) + AdvData(0~31 octets) 
            AdvA字段为advertiser的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址)
    
    - ADV_SCAN_IND: scannable undirected advertising event 
        Payload - AdvA(6 octets) + AdvData(0~31 octets) 
            AdvA字段为advertiser的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址)

    这些PUDs的数据流向为 advertiser->scanner/initiator

    4.3.2 Scanning PDUS

    Scanning PDUS包含下面几种类型

    - SCAN_REQ: 数据流向为 scanner->advertiser 
        Payload - ScanA(6 octets) + AdvA(6 octets) 
            ScanA字段为scanner的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址) 
            AdvA字段为advertiser的地址(RxAdd=0表示公共地址, Rxadd=1表示随机地址)
    
    - SCAN_RSP: 数据流向为 advertiser->scanner 
        Payload - AdvA(6 octets) + ScanRspData(0~31 octets) 
            AdvA字段为advertiser的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址)

    4.3.3 Initiating PDUS

    Initiating PDUS包含下面的类型

    - CONNECT_REQ: 数据流向为 initiator -> advertiser 
        Payload - InitA(6 octets) + AdvA(6 octets) + LLData(22 octets) 
            InitA字段为scanner的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址) 
            AdvA字段为advertiser的地址(RxAdd=0表示公共地址, Rxadd=1表示随机地址) 
            LLData字段如下,详细信息请参看规范

    image

    4.4 Data Channel PDU

    Data Channel PDU格式如下
    image

    4.4.1 Header

    Header部分格式及字段含义如下
    DataHeader

    4.4.2 Payload

    Payload格式(Opcode[1 octet] + CtrData[0~22 octets])由LLID字段决定,有下面两种类型

     - LL Data PDU: 用来发送L2CAP数据, LLID为01b/10b 
     - LL Control PDU: 用来控制链路层连接, 详细信息请参考规范

    image

    4.4.3 MIC

    MIC(Message Integrity Check)

    - 不存在的情况 
       ~ 在非加密连接中 
       ~ 加密连接, Payload为空 
    - 存在的情况 
       ~ 加密连接, Payload不为空
  • 相关阅读:
    WCF 第十三章 可编程站点 为站点创建操作
    WCF 第十三章 可编程站点 所有都与URI相关
    WCF 第十二章 对等网 使用自定义绑定实现消息定向
    WCF 第十三章 可编程站点 使用WebOperationContext
    Using App.Config for user defined runtime parameters
    WCF 第十三章 可编程站点
    WCF 第十三章 可编程站点 使用AJAX和JSON进行网页编程
    WCF 第十二章 总结
    WCF 第十三章 可编程站点 使用WebGet和WebInvoke
    WCF 第十三章 可编程站点 URI和UriTemplates
  • 原文地址:https://www.cnblogs.com/hzl6255/p/4127138.html
Copyright © 2011-2022 走看看