蓝牙mesh

蓝牙mesh学习笔记
2f24ffd299c4002f71725f15f0378e78.png
主机:就绪态,扫描态,发起态,连接态
从机:就绪态,广播态,连接态
5994d2eb4ec2df9352b027a0e05f1c3b.png
前导:
    训列序列,防止白化。
接入地址:
广播接入地址:广播信道接入地址为0x8E89BED6
    数据接入地址:数据信道接入地址为随机值
广播报文报头:
9baf99e6ecbf58cb5cd0852f82cf6282.png

长度:
广播报文6 bits:6~37(6字节广播设备地址+31字节数据)
数据报文5 bits:0~31(无论加密与否,最多使用27字节)

HCI信道

一旦控制器与其他设备建立了连接,控制器的底层HCI接口就创建一个HCI信道,使用一个连接句柄(connection handle)来标识这个HCI信道
连接句柄:标识主机交给控制器并准备发往对端的数据;标识控制器从对端收到的准备交给主机的数据。
HCI命令数据包格式:1d65958b2aef58c23b80f2011c14600e.png
三种基本命令类型:

  • 配置控制器的状态
  • 请求执行特定的操作
  • 管理连接

属性协议(ATT)
请求,响应;命令;指示,确认;通知;
cbbc0420a7e69bd8b9efef926943ea8f.png

  • 交换MTU请求 ATT_XCNHG_MTU_REQ

  • 查找信息请求 ATT_FIND_INFO_REQ(唯一能让客户端发现任意属性类型的消息)a1e0ebb6bbc8d8d52f38ed7b28e3ec17.png

  • 按类型值查找请求(ATT_FIND_BY_TYPE_VAL_REQ)

  • 按类型读取请求(ATT_READ_BY_TYPE_REQ)

  • 读取请求(ATT_READ_REQ)、

  • 大对象读取请求(ATT_READ_BLOB_REQ)

  • 多重读取请求(ATT_READ_MULTIPLE_REQ)

  • 按组类型读取请求(ATT_READ_BY_GROUP_REQ)

  • 写入请求(ATT_WRITE_REQ)

  • 写入命令(ATT_WRITE_CMD)

  • 签名写入命令(ATT_SIGNED_WRITE_CMD)

  • 准备写入请求(ATT_PREPARE_WRITE_REQ)

  • 执行写入请求(ATT_EXECUTE_WRITE_REQ)

  • 句柄值通知(ATT_HANDLE_VALUE_NTF)

  • 句柄值指示(ATT_HANDLE_VALUE_IND)

  • 错误响应(ATT_ERROR_RSP)
    一.层次结构.
        ![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_1.PNG)

重点关注了GAP/GATT/ATT/SMP/L2CAP/HCI

底层(控制器controller)

物理信道

![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_2.PNG)

  37/38/39为广播信道,其余为数据信道。
  频段:![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_3.PNG)

发射功率

  Max值为+10dBm.发射距离和接收机的灵敏度以及发射功率有关.
  ![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_4.PNG)

链路层的5种状态

![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_5.PNG)

主机:就绪态,扫描态,发起态,连接态
从机:就绪态,广播态,连接态
4. 链路层报文结构
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_6.PNG)

前导:
    训列序列,防止白化。
接入地址:
广播接入地址:广播信道接入地址为0x8E89BED6
    数据接入地址:数据信道接入地址为随机值
广播报文报头:
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_7.PNG)

长度:
广播报文6 bits:6~37(6字节广播设备地址+31字节数据)
数据报文5 bits:0~31(无论加密与否,最多使用27字节)
5.扫描和广播
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_8.PNG)

设备在3个广播信道上发送相同的报文,广播时间可以选择.
扫描仅可以单信道扫描,扫描间隔也是可以选择的。

连接

![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_9.PNG)

连接请求包括:接入地址、CRC初始值、发送窗口大小、窗口偏移量、连接间隔、从设备延迟、监控超时、自适应跳频信道图、跳频算法增量、休眠时钟精度。

![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_10.PNG)

总结:

从底层上了解了蓝牙技术的基本状态,以及一些蓝牙技术基本的行为.从硬件信号交互方面,对蓝牙通信有了实质化了解。

信号Idle时间段可以进行shut down模式.

HCI层

一旦连接确认,HCI层就会创建一个HCI信道(逻辑信道),使用连接句柄(connection
handle)来标识HCI信道.

命令数据包

   ![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_11.PNG)

主机和链路层的交互

   以广播为例子,参考simple code:
   sample_project_adv
   初始化部分:
  
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_12.PNG)

   广播部分:
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_13.PNG)

代码中的广播参数配置:
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_14.PNG)

参考函数文档btle_sp_api.chm可以知道配置的意义.
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_15.PNG)

总结:

学习了HCI层的特性,配合simple code代码学习了HCI层的一些基本操作。

了解一些代码中的函数用法:
BT_hci_le_set_scan_parameters
BT_hci_le_set_scan_enable
BT_hci_read_transmit_power_level
BT_hci_le_create_connection
BT_hci_le_connection_update…

L2CAP层

1.能够让蓝牙复用信道,支持数据的分割和重组。
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_16.PNG)

L2CAP数据包格式

![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_17.PNG)

对于低功耗蓝牙,payload最大传输单元为23字节。(MTU)
信道标识符:
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_18.PNG)

关于命令数据包格式.

对于BLE使用低功耗信令信道,信道标识符为0x0005.
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_19.PNG)

![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_20.PNG)

BLE支持的code值:命令拒绝、连接参数更新请求、连接参数更新响应.
Identifier:标识符,用于匹配请求和响应。请求和响应的标识符必须一致.
可以参考BLUETOOTH SPECIFICATION Version 4.1 [Vol 3](page 59)

总结:
1.了解L2CAP层的作用。
2.学习了L2CAP层的信令信道和数据信道。

ATT层

属性是一条带有标签的、可以被寻址的数据。
数据的提供者为服务器,数据的使用者称为客户端。经典的C/S模式。

属性内容

    属性(Attribute)包括:属性句柄Handle,属性类型Type,属性值Value
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_21.PNG)

Handle: 一台设备可以包含很多Attribute,可以是温度属性,设备名称,电池电量等;属性句柄Handle为16位地址,为不同Attribute提供访问入口。感觉类似内存地址。
Type:可以被公开的数据有多种类型,可以用128位标识属性的类型,这被称为通用唯一识别码(UUID)
    SIG规范使用较短的16位UUID为00000000-0000-1000-8000-00805F9B34FB;
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_22.PNG)

Value: 属性值的长度可以从0字节到512字节
2.属性PDUs
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_23.PNG)

![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_24.PNG)

关于Opcode

参考3.4.8 Attribute Opcode Summary.
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_25.PNG)

属性使用许可包括:可读、可写、可读写。
认证许可包括:需要认证、不需要认证。
接入属性:客户端可以通过任意一种消息类型访问属性数据库的各个属性:寻找请求、读取请求、写入请求、写入命令、通知、指示。
    使用寻找请求寻找数据库中的属性,再使用效率更高的给予句柄的请求。
    发送读取请求读取某个属性值,制定某一个或多个属性句柄,以及属性类型。
    发送写入请求写入某个属性值,使用一个属性句柄和要写入的数值。

总结:

蓝牙协议中,数据交互的关键层,通过句柄定位。

SM层

SM层主要是用于信息加密等操作.
1.临时密钥几种模式(TK)
Just work:TK=0
Passkey entry:TK有显示屏输入值
Out of band:NFC

短期密钥(STK)

来源:TK,rand S和rand M.

长期密钥(LTK)/(IRK)/(CSRK)

来源:EDIV和Rand

配对

  配对信息交换,链路认证,密钥分配。
  参考:3.5 PAIRING METHODS.
  成功后进行绑定。

PDU结构

![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_26.PNG)

总结:
1.该层用于加密数据。用于通信中key的产生和认证.

GATT层

1.服务(Service)
服务等同于一个具有不可变接口的对象,包含一种或多种特性,并能引用其他服务,特性是数据单位。              
2.特性(Characteristic)
特征只是一个数值:包含三个基本要素 声明、数值、描述符
3.操作方式
命令与通知是不可靠的,没有发送次数限制。
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_27.PNG)

参考代码:gatt.c
例子:4.3 SERVER CONFIGURATION
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_28.PNG)

代码:
客户端
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_29.PNG)

服务器
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_30.PNG)

从代码角度来讲,GATT层调用ATT层代码。

![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_31.PNG)

![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_32.PNG)

总结:

GATT层通过规程来进行数据交互。

GAP层

    定义了设备如何彼此发现、建立连接以及如何实现绑定,同时描述设备如何成为广播者和观察者。同时在不同类型地址部分做了说明。

初次发现

多个广播设备向多个扫描设备发送数据包,构成多对多的拓扑结构。广播报文包括数据以及设备是否可发现及可连接。

有限可发现性:用于临时设置为可发现状态,持续30s

一般可发现性:优先级最低的可发现性

GAP定义了公开设备名称的特性,设备名称可以包含在广播数据或扫描相应数据之中。

建立初始连接

向广播报文提供的地址发起一个连接,建立连接。建立连接后可以穷举对端设备的所有服务和特性,或者只查找它感兴趣的服务及其特性。

服务特性

通知和指示可以实现数据的高效率传输。在客户端的特性配置描述符中写入信息,启用所需功能,客户端就会收到某特性的通知或指示。
4.GAP角色
    广播者 Advertiser、观察者 Observer、外围设备 Peripheral、中央设备 Central
可连接性
外围设备可处于1.不可发现模式 2.有限可发现模式 3.一般可发现模式
可连接性
2种可连接广播报文:ADV_IND,ADV_DIRECT_IND
2种不可连接广播报文:ADV_NONCONN_IND,ADV_SCAN_IND

不可连接模式

只允许使用ADV_NONCONN_IND,ADV_SCAN_IND

定向可连接模式

使用ADV_DIRECT_IND广播报文,包含当前外围设备的地址,以及中央设备地址。<1.28s

无向可连接模式

使用ADV_IND广播报文,包含AD信息标识,处于可发现模式及可连接模式。

总结:
    1.GAP层通过规程来进行设备之间的发现、连接、绑定。

代码debug方式

工具

使用keil5进行代码的编译和仿真.
注意点:
安装时候注意keil版本,不同版本的keil不要安装在一起.

debug设置

Debug时候以下几点需要注意:Device配置
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_33.PNG)

Debug配置
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_34.PNG)

![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_35.PNG)

debug界面

9929d0195b98a55f2643125bbc2f7708.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值