物联网操作系统Zephyr(蓝牙篇)之6.0 zephyr os中的bt stack概述

 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.2提供的安全连接功能 
  • 非易失性存储支持,以永久存储蓝牙特定的设置和数据
  • -蓝牙网格支持:中继节点、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访问:

  1. 面向连接的角色
  2. 外围设备(如智能传感器,通常具有有限的用户界面)
  3. 中心设备

无连接角色

  1. 广播者(发送BLE广播)
  2. 观察者(扫描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可以在连接管理部分中找到。

猜你喜欢

转载自blog.csdn.net/dop102/article/details/124936652
今日推荐