物联网操作系统Zephyr(蓝牙篇)之6.0 zephyr os中的bt stack概述
时间:2022-09-14 03:00:00
Zephyr物联网操作系统专栏汇总
Zephyr os蓝牙协议栈和完整的蓝牙协议栈BLE和部分 经典蓝牙的host.
1.支持蓝牙features
1.1.Zephyr 蓝牙协议栈与蓝牙5兼容.0.
高度可配置:*功能、缓冲区大小/计数、堆栈大小等。
可移植到由Zephyr所有支持架构(包括大端和小端、对齐风格等)。
支持主机和控制器的所有组合:
- UART、SPI和USB物理传输控制器(HCI)
- 仅限UART、SPI和IPM主机(共享内存)
- 组合(主机 控制器)
1.2.蓝牙-SIG合格
- 在nordic硬件上的控制器
- 一致性测试定期在各层上进行
1.3.支持BLE controller(LE链路层)
- 支持所有角色的无限角色和连接计数
- 并发多协议支持
- 尽量减少智能调度角色的重叠
- 便携式设计到任何开放的BLE目前支持北欧半导体的无线电nRF51和nRF52、专有无线电
- 支持小端和大端环境架构,抽象硬实时细节,以便在特定的硬件模块中包装。
- 控制器用于不同的物理传输(HCI)构建的支持
1.4.支持蓝牙主机
- 一切可能LE角色通用访问配置文件(GAP):外围和中心;观察者和广播
- GATT(通用属性配置文件):服务器(作为传感器)、客户端(如果要连接到传感器)
- 配对支持包括蓝牙4.22提供的安全连接功能
- 非易失性存储支持蓝牙永久存储的特定设置和数据
- -蓝牙网格支持:中继节点,Friend节点,低功耗节点(LPN)和GATT代理功能支持两个供应载体(PB-ADV和PB-GATT);高度可配置,适用于小至16kRAM设备
- IPSP/6LoWPAN,用于蓝牙LE上的IPv6连接
- 基本的蓝牙BR/EDR(经典)支持:通用访问配置文件(GAP)、L2CAP、串口仿真(RFCOMM协议)、服务发现协议(SDP)。
- 清除HCI抽象驱动程序:3线(H:5)和5线(H:4)UART;SPI;作为虚拟控制器,本地控制器支持HCI驱动程序
- 使用多个流行控制器进行验证
2.蓝牙协议栈架构
这部分主要说明zephyr蓝牙协议栈架构。
Zephyr主要支持蓝牙低能耗(BLE),即蓝牙规格的低功耗版本。zephyr对BR/EDR主机部分的支持也非常有限。我们交替使用整个架构文档BLE。
2.1 BLE层
BLE分三层
- Host
- controller
- Radio hardware
Host controller interface蓝牙规范描述了主机必须与控制器通信的格式。称为主控制器接口(HCI)协议。HCI在一系列不同的物理传输中,如UART、SPI或USB。该协议定义了主机可以发送给控制器的命令和预期返回的事件,以及需要无线传输的用户和协议数据的格式。HCI确保不同的主机和控制器能够标准通信,从而将不同供应商的主机和控制器结合起来。
单芯片配置
单个微控制器实现了所有三层和应用程序本身。也可称为片上系统(SoC)实现。在这种情况下,BLE主机和BLE直接通过控制器RAM函数调用和队列通信。蓝牙规范并没有解释如何实现这种单芯片配置HCI,也没有说明HCI如何实现命令、事件和数据流?这种配置非常适合需要较小空间和最低功耗的应用程序和设计,因为所有设备都在单个设备中运行IC上。
双芯片配置:
使用两个独立的配置IC,一个操作应用程序和主机,另一个操作控制器和无线电硬件。有时也叫连接芯片配置。当使用Zephyr OS该配置作为控制器,允许更广泛的主机组合。由于HCI确保了主机和控制器实现之间的互操作性,当然包括Zephyr自己的BLE因此,主机和控制器Zephyr控制器用户可以选择在任何他们喜欢的平台上使用任何主机。例如,主机可以在任何支持下运行Linux在处理器上Linux BLE主机堆栈(BlueZ)。当然,主机处理器也可以运行Zephyr和Zephyr操作系统主机。相反,它也支持运行Zephyr主机的IC与不运行Zephyr的外部控制器相结合。
构建类型
Zephyr作为一个软件栈RTO特别是在施工过程中,高度可配置,BLE子系统可以多种方式配置,包括减少RAM和ROM占用空间和功耗所需的功能和层。
- 仅controller构造:当构造为BLE控制器时,Zephyr包括链接层和特殊应用程序。HCI本应用程序不同于所选物理传输:– hci_uart – hci_usb – hci_spi
应用程序充当UART、SPI或USB监控外围设备与控制器系统之间的桥梁HCI命令,发送应用程序数据,并响应事件和收到的数据。该类型的生成设置如下Kconfig选项值:
– CONFIG_BT =y – CONFIG_BT_HCI =y – CONFIG_BT_HCI_RAW =y – CONFIG_BT_CTLR =y – CONFIG_BT_LL_SW_SPLIT =y (if using the open source Link Layer)
- 仅host构建
一个ZephyrOS主机构建将包括应用程序和BLE主机,还有一个HCI驱动程序(UART或SPI),与外部控制器芯片接口。此类结构将设置如下Kconfig选项值:
– CONFIG_BT =y – CONFIG_BT_HCI =y – CONFIG_BT_CTLR =n
- 组合构建
专门用于单芯片的应用程序、主机和控制器(SoC)配置。这类结构将设置如下Kconfig选项值:
– CONFIG_BT =y – CONFIG_BT_HCI =y – CONFIG_BT_CTLR =y – CONFIG_BT_LL_SW_SPLIT =y (if using the open source Link Layer)
除了控制器构建的样本外,所有位于样本/蓝牙的样本都可以组合构建
该配置不限于使用ZephyrOS主机,如图像右侧所示。我们真的可以使用许多现有的GNU/Linux其中大部分发行版包括Linux自己的BLE主机(BlueZ),通过UART或USB将其连接到ZephyrOS构建控制器的一个或多个例子。BlueZ支持多个控制器作为主机,这些应用程序需要多个控制器BLE无线电同时运行,但共享同一主机堆栈。
HOST
蓝牙主机实现了所有高级协议和配置文件。最重要的是,它为应用程序提供了高级协议API。下图描述了主机的主要协议和配置文件层。
主机堆栈底层有一个所谓的HCI负责抽象驱动程序HCI传输细节。它提供了一个基本的基础API,用于将数据从控制器传输到主机,反之亦然。
可能HCI最重要的块是通用访问配置文件(GAP)。GAP通过定义BLE蓝牙使用的四个不同简化了蓝牙LE访问:
- 面向连接的角色
- 外围设备(如智能传感器,通常有有限的用户界面)
- 中心设备
无连接角色
- 广播员(发送BLE广播)
- 观察者(扫描BLE广告)
每个角色在构建时都有自己的配置选项:CONFIG_BT_PERIPHERAL、CONFIG_BT_CENTRAL、CONFIG_BT_BROADCASTER和CONFIG_BT_OBSERVER。对于面向连接的角色,中央设备隐观察者角色,而外围设备隐藏支持广播者角色。通常,创建应用程序的第一步是决定需要哪些角色并从那里开始。蓝牙网是一种略显特殊的情况,至少需要观察者和广播员的角色,或者外围设备的角色
外围角色
大多数基于Zephyr的BLE设备很可能是外围角色设备。这意味着他们执行可连接的广告并公开一项或多项GATT服务。使用bt\u gatt\u service\u register()API注册服务后,应用程序通常会使用bt_le_adv_start()API启动可连接广告。
树中有几个外围示例应用程序,例如samples/bluetooth/peripheral\u hr。
中心角色
对于基于Zephyr的设备来说,中心角色可能不像外围角色那样常见,但它仍然是一个合理的角色,并且在Zephyr中同样得到了很好的支持。中心角色设备不接受来自其他设备的连接,而是扫描可用的外围设备并选择一个连接。一旦连接,中央服务器通常将充当GATT客户端,首先执行可用服务的发现,然后访问一个或多个受支持的服务。
要最初发现要连接到应用程序的设备,可能会使用bt_le_scan_start()API,等待找到合适的设备(使用扫描回调),使用bt_le_scan_stop()停止扫描,然后使用bt_conn_create_le()连接到该设备。如果中央服务器想要继续自动重新连接到外围设备,那么它应该使用bt_le_set_auto_conn()API。
树中提供了一些有关中心角色的示例应用程序,例如samples/bluetooth/central_hr。
观察者角色
观察者角色观察者角色设备将使用bt_le_scan_start()API来扫描设备,但它不会连接到其中的任何一个设备。相反,它将简单地利用已找到的设备的广告数据,可选地将其与接收到的信号强度(RSSI)相结合。
广播员角色
设备将使用bt_le_adv_start()API来宣传特定的广告数据,但广告的类型将是不可连接的,即其他设备将无法连接到它。
连接
连接处理和相关的api可以在连接管理部分中找到。