构建安全、低功耗的蓝牙集线器和传感器网络
投稿人:DigiKey 北美编辑
2018-07-31
移动设备普遍提供蓝牙功能,蓝牙非常适合消费者以无线方式轻松访问智能产品。然而,对于物联网开发人员而言,构建蓝牙连接的传感器网络存在一些挑战,例如实现电池寿命最大化、优化蓝牙协议以及确保设备之间安全连接等。
本文将说明,使用 Cypress Semiconductor 提供的先进蓝牙器件和相关开发环境,开发人员可以加快解决这些问题,并快速实现安全的蓝牙集线器传感器网络。
为什么使用蓝牙?
智能手机和其他移动设备广泛支持蓝牙,这使其成为将消费者与可穿戴设备和医疗设备等个人电子设备连接起来的首选无线技术。随着蓝牙 5 的出现,物联网开发人员既可利用这些优势,又能满足传感器网络和其他物联网应用对更长通信距离和更高数据速率不断增长的需求。
为了构建针对这些应用的设计,开发人员可以借助越来越多的支持蓝牙 5 的器件。这些器件结合了完整的 RF 子系统和处理器内核,能够执行与蓝牙通信相关的低级事务。然而,物联网网络需要维持低功耗并确保安全连接,这样一来,在这些应用中部署蓝牙会更加复杂。
集成解决方案
Cypress Semiconductor CYW20719 经过专门设计,可满足物联网、可穿戴设备、个人电子产品和其他低功耗应用对电池供电型蓝牙连接设计不断增长的需求。除了功耗低之外,它还支持先进的蓝牙 5 特性,包括自适应跳频,这在与此类应用相关的繁忙无线电环境中是一个重要优势。
该器件集成了低功耗蓝牙无线电子系统、带浮点单元 (FPU) 的 Arm® Cortex®-M4 内核及多个外设块(图 1)。此外,片载安全引擎可加速公钥加密,并提供所需的关键加密功能来帮助确保蓝牙操作的安全性。最后,片载电源管理单元 (PMU) 为开发人员提供了一种灵活的机制来满足蓝牙设备日益增长的超低功耗运行要求。
图 1:Cypress Semiconductor CYW20719 结合了 Arm® Cortex®-M4、完整的蓝牙子系统和内置软件服务,为低功耗设计提供完整的支持蓝牙 5 的无线 MCU。(图片来源:Cypress Semiconductor)
CYW20719 无线电子系统包括完整的 2.5 GHz RF 信号路径,用于发射 (Tx) 和接收 (Rx) 操作。对于 Rx 信号路径,此器件会衰减带外信号,实现 -95.5 dBm Rx 灵敏度,且在需要时,开发人员无需额外的片外滤波器即可使用该器件。Tx 信号路径包括一个集成功率放大器 (PA),旨在支持从 -24 dBm 到最大 +4 dBm 的可配置发射功率等级。除了集成物理层 (PHY) 之外,该器件还包括一个完整的片载蓝牙 5 介质访问控制 (MAC) 层。凭借优化的 Rx 和 Tx 信号路径,该器件仅消耗 5.9 mA Rx 电流或 5.6 mA (@ 0 dBm) Tx 电流。
为了进一步降低功耗,该器件提供由集成电源管理单元 (PMU) 管理的多种功率模式。PMU 设计用于提供独立的 RF 和数字功率域,结合了一个集成降压稳压器、一个用于数字电路的低压差稳压器 (LDO) 和一个用于 RF 电路的独立 LDO(图 2)。此外,PMU 还包括一个独立的旁路 LDO (BYPLDO),如果电源 VBAT 电压低于 2.1 V,它会自动旁路降压稳压器,为数字和 RF LDO 供电。
图 2:Cypress CYW20719 PMU 管理独立的多个功率域,在不同低功耗模式下可以选择性地禁用功率域,以降低低功耗设计的电流消耗。(图片来源:Cypress Semiconductor)
在运行中,PMU 根据选定的功率模式(包括完全活动模式、空闲模式和三种休眠模式)调整功率域。在功耗最低的关断休眠 (SDS) 模式下,除 I/O 电源、实时时钟 (RTC)、专用低功耗振荡器(用作某些块和唤醒定时的时钟源)之外,PMU 关闭所有器件块。
即使只使用最少量的资源,SDS 模式下的 CYW20719 也能与另一个先前配对的蓝牙设备保持连接,在此过程中消耗的电流小于 70 微安 (μA)。但是,该模式下的器件不会保留存储器内容,需要热启动恢复状态后才能继续执行更复杂的操作。另外两种休眠模式是省电休眠 (PDS) 和休眠状态,可维持包括存储器内容保留在内的较高器件活动水平,而功耗则相应地递增。即便如此,功率预算有限的开发人员可以利用 PDS 模式进行低功耗蓝牙广告(约 125 μA)和支持活动连接(约 170 μA)。通过管理器件功率模式,开发人员可以轻松实现超低功耗运行而不影响功能。
系统集成
虽然 CYW20719 有灵活的工作模式和丰富的功能,但它仍需要少量额外元器件来完成系统设计中的硬件集成。由于其集成了片载关键元器件,开发人员只需添加几个电阻器、耦合电容器、2.2 μH 电感(如 Murata LQH2MCN2R2M52L)及铁氧体磁珠(如 Murata BLM15AG601SN1D)(图 3)。此外,最好在 CYW20719 和天线匹配元件之间放置一个带通滤波器以减少谐波。
图 3:Cypress CYW20719 集成了所有关键功能,因此开发人员只需添加几个元器件(包括推荐的带通滤波器以减少谐波)即可完成硬件集成。(图片来源:Cypress Semiconductor)
该器件拥有丰富的片载存储器,包括 1 MB 闪存、512 KB RAM 和 2 MB ROM,因此亦有助于简化软件集成。闪存和 RAM 为开发人员提供应用程序存储区域,片载 ROM 则保留用于器件固件和蓝牙配置文件。为了在需要时支持固件补丁,该器件提供了补丁 RAM——一个通过补丁控制逻辑连接的 RAM 区域(参见上图 1)。最后,该器件提供一个不间断存储器 (AON) 区域,让器件即使在低功耗模式下也能存储数据(如 SDS,会关闭易失存储器)。
与其他先进器件相比,该器件芯片上提供的 RAM 和闪存看起来可能很有限,但 ROM 内置的广泛软件支持可确保典型应用有充足的内存可用。Cypress 为片载 ROM 配置了一个全面的软件堆栈,从最低的硬件抽象层 (HAL) 一直到用于 WICED(嵌入式设备无线互联网连接)环境的应用程序编程接口 (API)(图 4)。
图 4:Cypress CYW20719 的 2 MB ROM 固件提供包括实时操作系统在内的完整软件堆栈,降低了开发人员应用程序代码的复杂度和占用空间。(图片来源:Cypress Semiconductor)
以 HAL 为基础,ROM 固件执行内置实时操作系统并处理与 CYW20719 硬件的所有交互。同时,ROM 固件包含全套蓝牙服务层,包括支持基本蓝牙通用属性配置文件 (GATT) 和通用访问配置文件 (GAP) 的服务层。
对于典型应用,开发人员代码从 RAM 运行,使用 WICED API 访问 RTOS、外设和其他特性。虽然 RAM 需求可能有很大差异,但 CYW20719 的大多数应用程序代码通常会为数据或工作内存留下充足的可用 RAM。例如,后面描述的 hello_sensor 应用程序留下了大约 240 KB 的可用 RAM。
但对于代码库特别大的应用程序,开发人员可以利用 CYW20719 的一项特性 — 从片载闪存就地执行 (XIP) 应用程序代码。这种情况下,WICED 环境将开发人员指定的代码和只读数据部分加载到片载闪存中,并将其余部分放入 RAM 中。这种方法固然会减少应用程序的 RAM 占用空间,但可能会影响性能。因此,开发人员在指定 XIP 代码部分时需要小心,确保将时间关键型功能置于 RAM 中。
应用开发
尽管 CYW20719 简化了设计集成,但专注于安全低功耗蓝牙应用的开发人员仍可能在完成硬件设计和应用开发时面临严重延迟。Cypress CYW920719Q40EVB-01 评估套件旨在演示基于 CYW20719 的应用,可与 Cypress WICED 软件环境配合使用,为创建符合蓝牙 5.0 标准的物联网应用提供参考设计和综合开发平台。
评估套件围绕一个载波模块构建,载波模块包括图 3 设计中的 CYW20719,外加一个 Torex Semiconductor XC6119N 测压器,后者连接到 CYW20719 的 RST_N 引脚以执行复位。载波模块焊接到套件基板,基板包括 STMicroelectronics LSM9DS1TR 9 轴运动传感器、Murata NCU 系列 NTC 热敏电阻、CYW20719 GPIO 端口、调试连接、Arduino 兼容扩展针座,以及用作简单用户界面的开关和 LED(图 5)。
图 5:Cypress CYW920719Q40EVB-01 评估套件将载波模块上的 CYW20719 与多个基板元器件结合在一起,可支持典型物联网应用。(图片来源:Cypress Semiconductor)
Cypress 示例软件使用 CYW20719 和其他元器件,广泛演示由多个传感器和一个中央集线器组成的代表性物联网网络中的安全蓝牙连接(图 6)。通过此示例应用,开发人员可以探索传感器和集线器配对的不同安全级别,并评估这些不同安全级别对数据交换的影响。
图 6:Cypress 示例应用设计用于配合多个 CYW920719Q40EVB-01 套件和 Cypress WICED 开发环境使用,可在代表性物联网应用中演示安全蓝牙连接。(图片来源:Cypress Semiconductor)
关于应用的硬件,开发人员将一个单独的 CYW920719Q40EVB-01 套件配置为安全集线器,并将其他套件配置为网络中的传感器。一台 PC 串行连接到各套件,为设置参数、查看数据、打印调试消息及与示例应用的其他交互提供一个控制台。
此类典型应用唯一剩下的要素是连接到移动设备以执行应用监测和控制功能,不过本示例应用中未包括此项。这里,串行连接的 PC 基本上就是起这个作用。
Cypress 将此示例应用的软件捆绑在 WICED 开发环境下的 CYW20917 BLE Secure Hub C 语言包中。在本例中,该软件包有两个项目,对应于示例应用中的两个独立角色。一个项目 (secure_hub) 设计为在指定为安全集线器的套件上运行,它使集线器能够支持多种蓝牙协议角色。具体而言,集线器软件旨在以不同安全级别与作为从设备运行的不同套件进行配对。
配置为从设备的套件运行传感器项目 (hello_sensor),用于演示以配对期间建立的安全级别进行数据收集和通信。每个项目都包含若干头模块和代码模块以支持相应的功能角色。在这些文件中,secure_hub 和 hello_sensor 项目各包含通用属性配置文件 (GATT) 头文件 (gatt_db.h) 和代码文件 (gatt_db.c)。
在蓝牙协议中,一个称为 GATT 数据库 (DB) 的查找表通过一组已定义服务来定义蓝牙连接的属性和功能,每个服务包括一组支持的特征。例如,蓝牙规范包括预定义的 GATT 服务,范围从提醒通知和设备信息等实用功能到血压和脉搏血氧仪服务等专用功能。设备的蓝牙通用访问配置文件 (GAP) 所起的作用比 GATT 服务更为基础,其定义设备如何在网络中宣传自己的存在,以及设备经发现后如何建立连接。
secure_hub 项目和 hello_sensor 项目中的 gatt_db.h 头文件和 gatt_db.c 代码文件分别定义配置为安全集线器和传感器的套件的 GAP 和 GATT 服务。对于此演示应用,每个项目根据其角色定义一个定制 GATT 服务。例如,hello_sensor 项目头文件包含一个定义强制性 GATT 和 GAP 服务句柄的 C enum 类型,以及用于传感器服务的定制 GATT 定义(列表 1a)。该项目的 gatt_db.c 文件进而使用这些定义来构建蓝牙协议所需的 GATT DB(列表 1b)。
副本
typedef enum
{
HANDLE_HSENS_GATT_SERVICE = 0x1, // service handle
HANDLE_HSENS_GAP_SERVICE = 0x14, // service handle
HANDLE_HSENS_GAP_SERVICE_CHAR_DEV_NAME, // characteristic handl
HANDLE_HSENS_GAP_SERVICE_CHAR_DEV_NAME_VAL, // char value handle
HANDLE_HSENS_GAP_SERVICE_CHAR_DEV_APPEARANCE, // characteristic handl
HANDLE_HSENS_GAP_SERVICE_CHAR_DEV_APPEARANCE_VAL,// char value handle
HANDLE_HSENS_SERVICE = 0x28,
HANDLE_HSENS_SERVICE_CHAR_UART, // characteristic handl
HANDLE_HSENS_SERVICE_CHAR_UART_VAL, // char value handle
HANDLE_HSENS_SERVICE_CHAR_CFG_DESC, // charconfig desc handl
HANDLE_HSENS_SERVICE_CHAR_BLINK, // characteristic handl
HANDLE_HSENS_SERVICE_CHAR_BLINK_VAL, // char value handle
HANDLE_HSENS_SERVICE_CHAR_TEMP, // characteristic handl
HANDLE_HSENS_SERVICE_CHAR_TEMP_VAL, // char value handle
HANDLE_HSENS_SERVICE_CHAR_TEMP_CFG_DESC, // charconfig desc handl
(A)
副本
/* Permissions for custom characteristics */
#define LED_BLINK_CHAR_PERMISSION LEGATTDB_PERM_WRITE_REQ | LEGATTDB_PERM_AUTH_WRITABLE | LEGATTDB_PERM_READABLE
#define TEMP_CHAR_PERMISSION LEGATTDB_PERM_READABLE
#define UART_CHAR_PERMISSION LEGATTDB_PERM_READABLE
uint8_t paired_security_level;
static void temp_notificaition_timeout( uint32_t count );
const uint8_t hello_sensor_gatt_database[]=
{
// Declare mandatory GATT service
PRIMARY_SERVICE_UUID16( HANDLE_HSENS_GATT_SERVICE, UUID_SERVICE_GATT ),
// Declare mandatory GAP service.Device Name and Appearance are mandatory
// characteristics of GAP service
PRIMARY_SERVICE_UUID16( HANDLE_HSENS_GAP_SERVICE, UUID_SERVICE_GAP ),
// Declare mandatory GAP service characteristic: Dev Name
CHARACTERISTIC_UUID16( HANDLE_HSENS_GAP_SERVICE_CHAR_DEV_NAME, HANDLE_HSENS_GAP_SERVICE_CHAR_DEV_NAME_VAL,
UUID_CHARACTERISTIC_DEVICE_NAME, LEGATTDB_CHAR_PROP_READ, LEGATTDB_PERM_READABLE ),
// Declare mandatory GAP service characteristic: Appearance
CHARACTERISTIC_UUID16( HANDLE_HSENS_GAP_SERVICE_CHAR_DEV_APPEARANCE, HANDLE_HSENS_GAP_SERVICE_CHAR_DEV_APPEARANCE_VAL,
UUID_CHARACTERISTIC_APPEARANCE, LEGATTDB_CHAR_PROP_READ, LEGATTDB_PERM_READABLE ),
// Declare proprietary Hello Service with 128 byte UUID
PRIMARY_SERVICE_UUID128( HANDLE_HSENS_SERVICE, UUID_HELLO_SERVICE ),
// Declare characteristic used to notify/indicate change
CHARACTERISTIC_UUID128( HANDLE_HSENS_SERVICE_CHAR_UART, HANDLE_HSENS_SERVICE_CHAR_UART_VAL,
UUID_HELLO_CHARACTERISTIC_NOTIFY, LEGATTDB_CHAR_PROP_READ | LEGATTDB_CHAR_PROP_NOTIFY | LEGATTDB_CHAR_PROP_INDICATE, UART_CHAR_PERMISSION ),
// Declare client characteristic configuration descriptor
// Value of the descriptor can be modified by the client
// Value modified shall be retained during connection and across connection
// for bonded devices.Setting value to 1 tells this application to send notification
// when value of the characteristic changes.Value 2 is to allow indications.
CHAR_DESCRIPTOR_UUID16_WRITABLE( HANDLE_HSENS_SERVICE_CHAR_CFG_DESC, UUID_DESCRIPTOR_CLIENT_CHARACTERISTIC_CONFIGURATION,
LEGATTDB_PERM_READABLE | LEGATTDB_PERM_WRITE_REQ ),
// Declare characteristic Hello Configuration
// The configuration consists of 1 bytes which indicates how many times to
// blink the LED when user pushes the button.
CHARACTERISTIC_UUID128_WRITABLE( HANDLE_HSENS_SERVICE_CHAR_BLINK, HANDLE_HSENS_SERVICE_CHAR_BLINK_VAL,
UUID_HELLO_CHARACTERISTIC_LED_BLINK,
LEGATTDB_CHAR_PROP_READ | LEGATTDB_CHAR_PROP_WRITE,
LED_BLINK_CHAR_PERMISSION ),
CHARACTERISTIC_UUID128( HANDLE_HSENS_SERVICE_CHAR_TEMP, HANDLE_HSENS_SERVICE_CHAR_TEMP_VAL,
UUID_HELLO_CHARACTERISTIC_TEMP, LEGATTDB_CHAR_PROP_READ | LEGATTDB_CHAR_PROP_NOTIFY | LEGATTDB_CHAR_PROP_INDICATE, TEMP_CHAR_PERMISSION ),
// Declare client characteristic configuration descriptor
// Value of the descriptor can be modified by the client
// Value modified shall be retained during connection and across connection
// for bonded devices.Setting value to 1 tells this application to send notification
// when value of the characteristic changes.Value 2 is to allow indications.
CHAR_DESCRIPTOR_UUID16_WRITABLE( HANDLE_HSENS_SERVICE_CHAR_TEMP_CFG_DESC, UUID_DESCRIPTOR_CLIENT_CHARACTERISTIC_CONFIGURATION,
LEGATTDB_PERM_READABLE | LEGATTDB_PERM_WRITE_REQ ),
(B)
列表 1:Cypress BLE Secure Hub 应用的 hello_sensor 项目中包含一个头文件,其为不同特征定义了一个枚举类型 (A),供相应的代码模块用以构建蓝牙运行所需的 GATT 数据库。(代码来源:Cypress Semiconductor)
嵌入在这些定义中的 GATT 传感器服务还定义其底层服务特征是否可以读取、写入、通知或指示信息(使用相连的控制台)。例如,LED 闪烁特征(列表 1a 中声明并在列表 1b 中应用的 HANDLE_HSENS_SERVICE_CHAR_BLINK
)包括位掩码(列表 1b 中的 LEGATTDB_CHAR_PROP_READ | LEGATTDB_CHAR_PROP_WRITE
),指示该特征可读可写。
hello_sensor 项目的 gatt_db.c 文件则将这些定义与实现对该特征的安全访问的代码结合在一起。也就是能让 LED 闪烁,闪烁次数由开发者键入控制台的字符指示。就本示例应用而言,访问此功能要求通过蓝牙中间人 (MITM) 配对,使用配对期间从控制台输入的用户提供的密钥,建立与该传感器套件的连接。
一般而言,当请求调用某一功能时,相应的处理程序执行专用任务,并且同时考虑已定义特征和安全访问要求。对于 LED 闪烁示例,当请求执行 LED 闪烁功能时,用于确保权限和授权访问的实际代码非常简单。
为了更改 LED 闪烁特征值 (HANDLE_HSENS_SERVICE_CHAR_BLINK_VAL
),代码使用一个条件语句来确认写入权限和访问授权(列表 2)。针对写入权限,条件语句将请求的权限 (LEGATTDB_PERM_AUTH_WRITABLE
) 与实际 LED 器件的闪烁权限设置 LED_BLINK_CHAR_PERMISSION
(列表 1b 的顶部定义)进行比较。针对授权,条件语句检查当前配对安全级别 (paired_security_level
) 是否是通过 MITM 配对 (BTM_SEC_LINK_PAIRED_WITH_MITM
) 创建的(列表 2)。
副本
/*
* Process write request or write command from peer device
*/
wiced_bt_gatt_status_t hello_sensor_gatts_req_write_handler( uint16_t conn_id, wiced_bt_gatt_write_t * p_data )
{
wiced_bt_gatt_status_t result = WICED_BT_GATT_SUCCESS;
uint8_t *p_attr = p_data->p_val;
uint8_t sec_flag, key_size;
WICED_BT_TRACE("write_handler: conn_id:%d hdl:0x%x prep:%d offset:%d len:%d\r\n ", conn_id, p_data->handle, p_data->is_prep, p_data->offset, p_data->val_len );
switch ( p_data->handle )
{
.
.
.
case HANDLE_HSENS_SERVICE_CHAR_TEMP_CFG_DESC:
if ( p_data->val_len != 2 )
{
return WICED_BT_GATT_INVALID_ATTR_LEN;
}
WICED_BT_TRACE( "Temp Notif Enabled\r\n");
hello_sensor_hostinfo.temp_characteristic_client_configuration = p_attr[0] | ( p_attr[1] << 8 );
break;
case HANDLE_HSENS_SERVICE_CHAR_BLINK_VAL:
if ( p_data->val_len != 1 )
{
return WICED_BT_GATT_INVALID_ATTR_LEN;
}
if ((!(paired_security_level & BTM_SEC_LINK_PAIRED_WITH_MITM))&& (LED_BLINK_CHAR_PERMISSION & LEGATTDB_PERM_AUTH_WRITABLE))
{
WICED_BT_TRACE("Write Failed: Insufficient Authentication\r\n");
return WICED_BT_GATT_INSUF_AUTHENTICATION;
}
hello_sensor_hostinfo.number_of_blinks = p_attr[0];
if ( hello_sensor_hostinfo.number_of_blinks != 0 )
{
WICED_BT_TRACE( "hello_sensor_write_handler:num blinks: %d\r\n", hello_sensor_hostinfo.number_of_blinks );
wiced_bt_app_hal_led_blink(250, 250, hello_sensor_hostinfo.number_of_blinks );
}
break;
default:
result = WICED_BT_GATT_INVALID_HANDLE;
break;
}
return result;
}
列表 2:在 Cypress BLE Secure Hub 应用的这个代码片段中,当请求执行 LED 闪烁特征时,首先需要通过权限和安全授权检查(突出显示部分)。(代码来源:Cypress Semiconductor)
通过适用于传感器项目和集线器项目的 GATT DB 定义和支持代码,本示例应用为开发人员提供了与三种不同安全级别相关的基本设计模式,包括任何级别的配对、此处描述的 MITM 配对和蓝牙低功耗安全配对。后一种配对方法使用基于椭圆曲线 Diffie-Hellman (ECDH) 密钥交换的验证方法,安全性最高。CYW20719 的集成安全引擎包含 ECDH 加速器,因此开发人员可以运用此方法而不会影响性能。
总结
随着集成式蓝牙无线 MCU 的出现,开发人员争相将此类器件集成到其设计中。然而,为了实现安全的蓝牙网络,开发人员在创建蓝牙兼容服务和编写能够安全使用这些器件的应用程序时面临多重挑战。
Cypress Semiconductor CYW920719Q40EVB-01 蓝牙评估套件和 WICED 开发环境基于 Cypress CYW20719 蓝牙 MCU,为构建这些应用提供了一个综合性平台。将该套件和 WICED 环境与 Cypress BLE Secure Hub 软件包结合使用,开发人员可以快速评估安全蓝牙应用,并将其迅速扩展到能够利用蓝牙 5 的增强速度和范围的定制应用中。
免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。