移動設備普遍提供藍牙功能,藍牙非常適合消費者以無線方式輕松訪問智能產品。然而,對于物聯網開發人員而言,構建藍牙連接的傳感器網絡存在一些挑戰,例如實現電池壽命最大化、優化藍牙協議以及確保設備之間安全連接等。
本文將說明,使用Cypress Semiconductor提供的先進藍牙器件和相關開發環境,開發人員可以加快解決這些問題,并快速實現安全的藍牙集線器傳感器網絡。
為什么使用藍牙?
智能手機和其他移動設備廣泛支持藍牙,這使其成為將消費者與可穿戴設備和醫療設備等個人電子設備連接起來的首選無線技術。隨著藍牙 5 的出現,物聯網開發人員既可利用這些優勢,又能滿足傳感器網絡和其他物聯網應用對更長通信距離和更高數據速率不斷增長的需求。
為了構建針對這些應用的設計,開發人員可以借助越來越多的支持藍牙 5 的器件。這些器件結合了完整的 RF 子系統和處理器內核,能夠執行與藍牙通信相關的低級事務。然而,物聯網網絡需要維持低功耗并確保安全連接,這樣一來,在這些應用中部署藍牙會更加復雜。
集成解決方案
Cypress SemiconductorCYW20719經過專門設計,可滿足物聯網、可穿戴設備、個人電子產品和其他低功耗應用對電池供電型藍牙連接設計不斷增長的需求。除了功耗低之外,它還支持先進的藍牙 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 電感(如MurataLQH2MCN2R2M52L)及鐵氧體磁珠(如 MurataBLM15AG601SN1D)(圖 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 簡化了設計集成,但專注于安全低功耗藍牙應用的開發人員仍可能在完成硬件設計和應用開發時面臨嚴重延遲。CypressCYW920719Q40EVB-01評估套件旨在演示基于 CYW20719 的應用,可與 Cypress WICED 軟件環境配合使用,為創建符合藍牙 5.0 標準的物聯網應用提供參考設計和綜合開發平臺。
評估套件圍繞一個載波模塊構建,載波模塊包括圖 3 設計中的 CYW20719,外加一個Torex SemiconductorXC6119N測壓器,后者連接到 CYW20719 的 RST_N 引腳以執行復位。載波模塊焊接到套件基板,基板包括STMicroelectronicsLSM9DS1TR9 軸運動傳感器、MurataNCU 系列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 開發環境下的 CYW20917BLE Secure HubC 語言包中。在本例中,該軟件包有兩個項目,對應于示例應用中的兩個獨立角色。一個項目 (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 服務句柄的 Cenum類型,以及用于傳感器服務的定制 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 ", 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 ");
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 ");
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 ", 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 的增強速度和范圍的定制應用中。
-
藍牙
+關注
關注
114文章
5775瀏覽量
169873 -
FPU
+關注
關注
0文章
42瀏覽量
21300 -
PMU
+關注
關注
1文章
108瀏覽量
21571
發布評論請先 登錄
相關推薦
評論