帶響應的周期性廣播(PAWR) 是藍牙 5.4的一項新功能。它擴展了藍牙 5.0 中的周期性廣播協(xié)議。周期性廣播是指設備以確定的時間發(fā)送廣播數(shù)據(jù),現(xiàn)在可以進行雙向通信。接收器可將響應有效載荷傳送回advertiser。有了 PAwR,現(xiàn)在就可以建立一個超大型的一對多雙向網(wǎng)絡,并以極低的功耗運行。在許多應用中,人們必須通過雙向通信管理成百上千個能源受限的設備,例如電子貨架標簽(ESL)、傳感器網(wǎng)絡、倉庫管理等。讓我們深入了解這項非常有趣的新技術。
1. PAwR 如何工作
1.1 廣播類型
藍牙 5.4 在邏輯傳輸層上定義了三種主要的廣告類型: 廣播(Advertising Broadcast, ADVB), 周期性廣播(Periodic Advertising Broadcast, PADVB), 和帶響應的周期性廣播 (Periodic Advertising with Responses, PAwR)。這些廣播協(xié)議允許advertiser向周圍任意數(shù)量的scanner廣播數(shù)據(jù),僅受advertiser射頻范圍的限制。
藍牙 LE 傳統(tǒng)廣播和藍牙 LE 擴展廣播都屬于 ADVB。在這些模式中,廣播是不規(guī)則的,數(shù)據(jù)只向一個方向發(fā)送。在大多數(shù)情況下,scanner需要有充足的電源,因為scanner和broadcaster之間沒有時間同步。此外,為避免advertiser之間的定時碰撞,廣播間隔會有 0-10 毫秒的隨機延遲。這就要求scanner具有較大的 RX 窗口,因此需要消耗更多的電流。
與 ADVB 不同,周期性廣播(PADVB)進行定期且精確的定時廣播。scanner和advertiser之間有時間同步。PADVB 不使用 ADVB 的 0-10 毫秒隨機延遲。因此,scanner只需監(jiān)聽一段非常短且可預測的時間。利用周期性廣播建立一個大型的一對多低功耗網(wǎng)絡是可能的,例如音頻廣播、測向、物聯(lián)網(wǎng)網(wǎng)絡等。然而,缺少的是低功耗scanner只能接收數(shù)據(jù),而不能將數(shù)據(jù)發(fā)送回advertiser。
PAwR 的推出就是為了解決這個問題。它允許advertiser發(fā)送精確的常規(guī)廣播數(shù)據(jù),同時允許scanner向advertiser發(fā)送響應有效載荷。此外,在需要更高的吞吐量時,它還為advertiser提供了與scanner建立藍牙(Bluetooth LE)連接的機制。
1.2 時間
與其他類型的廣播類似,PAwR 的運行間隔稱為周期性廣播間隔(Periodic Advertising Interval)。它在準確的時間間隔內發(fā)生,沒有隨機延遲。每個 PAwR 事件都會有多個子事件。這與 PADVB 不同,在 PADVB 中,每個事件只有一個周期性廣播數(shù)據(jù)包。重要的是,同步到 PAwR 的scanner不會監(jiān)聽所有子事件,只會選擇它訂閱/同步到的子事件。多個scanner可以訂閱同一個子事件。這意味著一臺scanner可以訂閱多個子事件。每個廣播事件最多可以有 128 個子事件。
放大其中一個子事件,在事件開始時,有一個來自advertiser的傳輸包。它可以是:
AUX_SYNC_SUBEVENT_IND - 周期性廣播包.
AUX_CONNECT_REQ - advertiser的連接請求.
與該子事件同步的所有scanner都會掃描該數(shù)據(jù)包并處理有效載荷。數(shù)據(jù)包發(fā)出后,會有一列響應槽供scanner將其響應發(fā)送回advertiser。響應槽最多可達 256 個。在哪個響應槽上發(fā)送哪個scanner由應用程序/配置文件決定。為避免碰撞,一個響應槽中只能有一個scanner響應。
這是 PAwR 的 R 部分,是與普通周期性廣播的主要區(qū)別。這樣就能以極低的功耗形成超大型雙向一對多網(wǎng)絡。可以發(fā)現(xiàn),scanner/observer只需在每個周期性廣播間隔喚醒一次,以掃描子事件傳輸包。如果它有數(shù)據(jù)提供給advertiser,就可以在其中一個響應時隙進行傳輸,然后再次休眠。由于并非所有scanner都需要同時發(fā)送數(shù)據(jù),因此一個advertiser可以為大量scanners提供服務。延遲時間很短;可低至周期性廣播間隔,根據(jù)advertiser的配置,間隔時間在 7.5ms 至 81.91875s 之間。
這里的限制是吞吐量。如果scanner需要傳輸或接收大量數(shù)據(jù),可能會受到廣播時間間隔的限制。如上所述,廣播時間間隔最長可達 81.91875 秒,將廣播時間間隔改為更短的時間間隔需要更新所有scanner以同步到新的時間間隔。在大多數(shù)情況下,這是不現(xiàn)實的。
解決這個問題的辦法是在scanner和advertiser之間建立藍牙 LE 連接。PAwR 支持在不使用傳統(tǒng) ADVB 的情況下建立連接。為了啟動連接,advertiser在子事件傳輸包中發(fā)送 AUX_CONNECT_REQ 包,而不是 AUX_SYNC_SUBEVENT_IND 包。AUX_CONNECT_REQ 包含scanner的地址和scanner進入藍牙 LE 連接時應使用的連接參數(shù)。待連接的scanner將以 AUX_CONNECT_RSP 作為回應。該響應應在 AUX_CONNECT_REQ 數(shù)據(jù)包之后立即發(fā)送,無需等待響應時隙。隨后將立即建立藍牙 LE 連接。advertiser將成為中心,scanner將成為外圍。通過這種分離的藍牙 LE 連接,它們可以以更高的吞吐量進行通信。
1.3 同步
要跟蹤周期性廣播并訂閱子事件,scanner需要從advertiser處獲得同步和 PAwR 信息。獲取同步信息的程序與普通周期性廣播PADVB 類似。scanner可以通過掃描擴展廣播數(shù)據(jù)包 ADV_EXT_IND 來獲取信息:
或者通過建立連接并執(zhí)行周期性廣播同步傳輸 (PAST) 程序。
這兩種方法各有利弊。掃描擴展廣播數(shù)據(jù)包 ADV_EXT_IND 不需要連接,但它要求scanner能夠進行連續(xù)掃描以捕捉廣播數(shù)據(jù)包。相比之下,使用 PAST 進行連接并接收定時信息可適用于電源有限的scanner儀,因為它只要求scanner進行正常的藍牙 LE 廣播。不過,這對advertiser的無線電調度要求更高,因為advertiser需要同時進行周期性廣播和掃描以建立藍牙 LE 連接。advertiser可以決定不做 ADV_EXT_IND,只做周期性廣播 AUX_SYNC_SUBEVENT_IND。這是為了減少advertiser的工作量。在這種情況下,PAST 是同步scanner的唯一選擇。
與 PADVB 相比,除了 SyncInfo(周期性廣播間隔、同步Packet Window Offset)外,還有一些專門用于 PAwR 的額外信息需要交換:
ACAD- Additional Controller Advertising Data:
響應訪問地址
子事件數(shù)量
子事件間隔
響應時隙延遲
響應槽間隔
您可能會發(fā)現(xiàn),這些程序中沒有定義scanner應訂閱哪些子事件或響應槽的信息。這就需要應用程序/上層來決定scanner應如何獲取有關子事件和響應槽的信息。例如,在執(zhí)行 PAST 時配置響應槽,或對scanner進行硬編碼,使其根據(jù)自身地址自動選擇響應槽。
2. PAwR 優(yōu)勢和局限
2.1 優(yōu)勢
一對多拓撲結構中的雙向通信. PAwR 為藍牙產(chǎn)品增加了一個重要的缺失部分:大規(guī)模雙向一對多網(wǎng)絡。在藍牙 5.4 之前,常見的藍牙網(wǎng)絡拓撲結構如下:
一對一。一個外設連接一個中心。
一對多,星形網(wǎng)絡。一個中心可以連接多個外圍設備,但鏈接數(shù)量有限,通常每個中心的連接數(shù)少于 20 個。
一對多廣播。一個advertiser可以向許多觀observers廣播數(shù)據(jù)。observers的數(shù)量可以非常多,但數(shù)據(jù)只能單向傳播,即從advertiser到observer。
多對多,mesh。mesh網(wǎng)絡可提供大規(guī)模雙向網(wǎng)絡。不過,它需要由backbone節(jié)點組成的基礎設施來中繼信息。這些backbone節(jié)點通常需要主電源。連接的mesh網(wǎng)絡可以作為一種解決方案,但它可能比較復雜和僵化。
使用 PAwR,只需一個簡單的同步程序,即可建立一個擁有數(shù)百或數(shù)千個節(jié)點的一對多網(wǎng)絡。一個廣告商就可以管理與數(shù)千臺設備之間的數(shù)據(jù)收發(fā)任務。這里的亮點在于,這種雙向通信是以同步方式進行的,沒有泛洪或潛在的碰撞。
廣播數(shù)據(jù)可以頻繁更改。PAwR 允許頻繁更改廣播數(shù)據(jù)。特別是,主機可以精確控制哪個數(shù)據(jù)包將進入哪個廣播子事件。這是 ADVB 和 PADVB 所不具備的。使用 ADVB 和 PADVB 時,您可以隨時間更新廣播數(shù)據(jù),但數(shù)據(jù)是重復發(fā)送的,而且您對廣播進行時如何更新數(shù)據(jù)的控制也很有限。使用 PAwR 時,控制器會請求主機(應用程序)在每次廣播事件中更新數(shù)據(jù)。應用程序可以更新每個廣播事件中的每個子事件廣播數(shù)據(jù)包。
advertiser可與scanner建立藍牙 LE 連接。當對等設備需要傳輸大量數(shù)據(jù),而 PAwR 有限的吞吐量無法滿足要求時,例如向 ESL 標簽傳輸顯示圖像時,就會使用這種連接。它與普通的藍牙 LE 連接略有不同,不是由scanner,而是由周期性advertiser決定與scanner建立連接。它選擇應該連接哪個scanner。這樣做是有道理的,因為這樣可以避免大量節(jié)點同時發(fā)布連接廣播,造成廣播信道擁塞。此外,它還允許advertiser安排新的連接,以免與正在進行的 PAwR 活動相沖突。
低功耗運行,但仍有相對較低的延遲。scanner的功耗與正常藍牙 LE 連接時的功耗相似。這意味著超低功耗。設備可以使用紐扣電池運行數(shù)年,延遲時間等于網(wǎng)絡的周期性廣播間隔。
2.2 局限
該網(wǎng)絡依靠一個advertiser作為網(wǎng)關/接入點。這意味著網(wǎng)絡中的所有節(jié)點都必須在advertiser的覆蓋范圍內。可以通過多個advertiser來擴展網(wǎng)絡,但規(guī)范并沒有定義如何建立這樣的網(wǎng)絡。
吞吐量有限。advertiser需要為大量節(jié)點提供服務,與普通藍牙 LE 連接相比,數(shù)據(jù)吞吐量相對較低,具體取決于廣播間隔和響應槽的大小。
每個scanner可能沒有足夠的響應槽。多個scanner可以同步到同一個子事件,而子事件中的每個節(jié)點往往沒有足夠的響應槽。應用程序需要定義scanner應如何輪流向接入點發(fā)送數(shù)據(jù)。
PAwR 的設計將大部分復雜性放在了advertiser接入點一方。advertiser必須足夠強大,才能同時處理 PAwR 廣告、連接處理和節(jié)點管理任務。
PAwR 只處理堆棧的低端。它沒有規(guī)定網(wǎng)絡的高級功能,如流量控制、數(shù)據(jù)包確認、加密、身份驗證等。上層有責任為應用定制這些功能。
3. 在 nRF Connect SDK 中實現(xiàn)
本節(jié)主要介紹如何在 nRF Connect SDK 中實現(xiàn) PAwR 應用程序。nRF Connect SDK 在 v2.4.0 中添加了兩對示例來演示 PAwR。我們將深入代碼,了解 PAwR 在這些示例中是如何實現(xiàn)的。
帶響應的周期性廣播(PAwR) advertiser和同步 (periodic_adv_rsp& periodic_sync_rsp):
advertiser會定期發(fā)布廣播并掃描 PAST advertiser。建立藍牙 LE 連接后,它將發(fā)送 PAST 信息,然后發(fā)送子事件信息。
開始時,observer/scanner會做廣播以獲取 PAST 信息。同步后,它將收到子事件信息,從而知道應該監(jiān)聽哪個子事件。
周期性廣播連接程序 - 發(fā)起方和響應方 (periodic_adv_conn& periodic_sync_conn):
advertiser只做周期性廣播,不做 PAST。
observer/scanner掃描擴展廣播數(shù)據(jù)包并同步。同步后,它會在 PAwR 響應中向advertiser發(fā)送地址,以便advertiser通過 AUX_CONNECT_REQ 建立連接。有關子事件的信息是硬編碼。
3.1 廣播
讓我們仔細看看 periodic_adv_rsp 示例中是如何設置周期性廣播的:
pei:
#define NUM_RSP_SLOTS 5 #define NUM_SUBEVENTS 5 static const struct bt_le_per_adv_param per_adv_params = { .interval_min = 0xFF, .interval_max = 0xFF, .options = 0, .num_subevents = NUM_SUBEVENTS, .subevent_interval = 0x30, .response_slot_delay = 0x5, .response_slot_spacing = 0x50, .num_response_slots = NUM_RSP_SLOTS, }; struct bt_le_ext_adv *pawr_adv; static const struct bt_le_ext_adv_cb adv_cb = { .pawr_data_request = request_cb, .pawr_response = response_cb, };
配置子事件和響應槽時間參數(shù)時需要格外注意。
廣播間隔應≥ subevent_interval * NUM_SUBEVENTS。
子事件間隔應≥ response_slot_delay + response_slot_spacing*NUM_RSP_SLOT
否則將收到錯誤 12 BT_HCI_ERR_INVALID_PARAM。
設置并開始廣播:
/* Create a non-connectable non-scannable advertising set */ bt_le_ext_adv_create(BT_LE_EXT_ADV_NCONN, &adv_cb, &pawr_adv); /* Set periodic advertising parameters */ bt_le_per_adv_set_param(pawr_adv, &per_adv_params); /* Enable Periodic Advertising */ bt_le_per_adv_start(pawr_adv); /* Start Periodic Advertising */ bt_le_ext_adv_start(pawr_adv, BT_LE_EXT_ADV_START_DEFAULT);
在 bt_le_ext_adv_start() 之后,advertiser將進行擴展廣播和 PAwR。這包括圖 4 所示的數(shù)據(jù)包:ADV_EXT_IND、AUX_ADV_IND 和 AUX_SYNC_SUBEVENT_IND。
如上一節(jié)所述。advertiser可以選擇不做擴展廣播(ADV_EXT_IND 和 AUX_ADV_IND),只做周期性廣播。這將有助于減少advertiser的額外廣播活動,從而為更多連接/響應提供服務。要停止擴展廣播,可在周期性廣播開始后調用 bt_le_ext_adv_stop()。這不會停止周期性廣播。要停止周期性廣播,您需要調用 bt_le_per_adv_stop()。
注意:大多數(shù)嗅探器依靠擴展廣播的 Syncinfo 來跟蹤周期性廣播train。如果關閉擴展廣播,嗅探器就無法找到周期性廣播數(shù)據(jù)包。
周期性advertiser有 2 個回調:
pawr_data_request: 當有緩沖區(qū)可供advertiser更新子事件數(shù)據(jù)包內容時調用。通常,每個要更新的子事件插槽都會收到一個回調。在本例中,代碼只需在每個子事件中將計數(shù)器增加一個即可。
pawr_response: 當某個scanner對某個子事件做出響應時調用。在示例中,scanner只需回傳它在子事件數(shù)據(jù)包中收到的內容。
這些是與普通廣播或周期性廣播的主要區(qū)別。您現(xiàn)在可以控制精確廣播數(shù)據(jù)包(子事件數(shù)據(jù)包)的有效載荷。此外,您還可以從scanner中獲取響應數(shù)據(jù),這在其他類型的廣播中是無法通過掃描請求獲得的。
3.2 同步
要實現(xiàn)同步,需要擴展廣播或 PAST。如果要使用 PAST,則需要掃描普通廣播以建立藍牙 LE 連接,然后再使用 PAST。建立連接后,需要調用 bt_le_per_adv_set_info_transfer()。這將向scanner發(fā)送同步信息和 PAwR 信息。
在 periodic_adv_rsp 示例中,您可以找到一條寫入命令,用于發(fā)送一些有關scanner子事件編號和響應槽編號的專有數(shù)據(jù)(sync_config)。至于如何發(fā)送,則由應用程序自行決定。
以下代碼來自 periorid_adv_rsp。達到同步設備的最大數(shù)量后,advertiser會停止掃描。
while (num_synced < MAX_SYNCS) {
err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, device_found);
if (err) {
printk("Scanning failed to start (err %d)n", err);
return 0;
}
printk("Scanning successfully startedn");
k_sem_take(&sem_connected, K_FOREVER);
err = bt_le_per_adv_set_info_transfer(pawr_adv, default_conn, 0);
if (err) {
printk("Failed to send PAST (err %d)n", err);
goto disconnect;
}
printk("PAST sentn");
discover_params.uuid = &pawr_char_uuid.uuid;
discover_params.func = discover_func;
discover_params.start_handle = BT_ATT_FIRST_ATTRIBUTE_HANDLE;
discover_params.end_handle = BT_ATT_LAST_ATTRIBUTE_HANDLE;
discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC;
err = bt_gatt_discover(default_conn, &discover_params);
if (err) {
printk("Discovery failed (err %d)n", err);
goto disconnect;
}
printk("Discovery startedn");
err = k_sem_take(&sem_discovered, K_SECONDS(10));
if (err) {
printk("Timed out during GATT discoveryn");
goto disconnect;
}
sync_config.subevent = num_synced % NUM_SUBEVENTS;
sync_config.response_slot = num_synced / NUM_RSP_SLOTS;
num_synced++;
write_params.func = write_func;
write_params.handle = pawr_attr_handle;
write_params.offset = 0;
write_params.data = &sync_config;
write_params.length = sizeof(sync_config);
err = bt_gatt_write(default_conn, &write_params);
if (err) {
printk("Write failed (err %d)n", err);
num_synced--;
goto disconnect;
}
printk("Write startedn");
err = k_sem_take(&sem_written, K_SECONDS(10));
if (err) {
printk("Timed out during GATT writen");
num_synced--;
goto disconnect;
}
printk("PAwR config written to sync %d, disconnectingn", num_synced - 1);
disconnect:
err = bt_conn_disconnect(default_conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN);
if (err) {
return 0;
}
k_sem_take(&sem_disconnected, K_FOREVER);
}
發(fā)送傳輸信息后,advertiser 會直接斷開連接。它不知道scanner是否與 PAwR 列車同步。可以通過在斷開連接前添加延遲或最好在斷開連接前收到scanner的響應來改善這種情況。您可以在本指南末尾提供的代碼中找到添加的延遲。
在scanner方面,如果查看 perioridc_sync_conn 樣本,就會發(fā)現(xiàn)它是如何注冊 PAwR 并掃描包含同步和 PAwr 信息的擴展廣播數(shù)據(jù)包的。
bt_le_scan_cb_register(&scan_callbacks);
bt_le_per_adv_sync_cb_register(&sync_callbacks);
err = bt_le_scan_start(BT_LE_SCAN_ACTIVE, NULL);
if (err) {
printk("failed (err %d)n", err);
return 0;
}
請注意,在捕獲擴展廣播數(shù)據(jù)包后,您需要創(chuàng)建同步對象,以便scanner可以開始跟蹤周期性廣播數(shù)據(jù)包。要創(chuàng)建同步對象,需要調用 bt_le_per_adv_sync_create()。這將允許您在scanner同步到周期性廣播(而非 PAwR)時接收 bt_le_per_adv_sync_cb.synced 回調:
{
struct bt_le_per_adv_sync_subevent_params params;
uint8_t subevents[1];
char le_addr[BT_ADDR_LE_STR_LEN];
int err;
bt_addr_le_to_str(info->addr, le_addr, sizeof(le_addr));
printk("Synced to %s with %d subeventsn", le_addr, info->num_subevents);
params.properties = 0;
params.num_subevents = 1;
params.subevents = subevents;
subevents[0] = 0;
err = bt_le_per_adv_sync_subevent(sync, ?ms);
if (err) {
printk("Failed to set subevents to sync to (err %d)n", err);
}
k_sem_give(&sem_per_sync);
}
正如您在代碼中發(fā)現(xiàn)的,同步后,如果您想接收 PAwR 子事件數(shù)據(jù)包,您需要調用 bt_le_per_adv_sync_subevent() 來訂閱一個或多個子事件。在本示例中,要訂閱的子事件被硬編碼為子事件 0,該子事件中的響應槽也被硬編碼為 0(參見 recv_cb 函數(shù))。
樣本將設備地址發(fā)送給advertiser,然后等待advertiser的連接(通過 AUX_CONNECT_REQ 連接 v2)。這是本應用程序特有的功能。調用 bt_le_per_adv_set_response_data(),其中包含要發(fā)送數(shù)據(jù)的子事件和響應槽。
static void recv_cb(struct bt_le_per_adv_sync *sync, const struct bt_le_per_adv_sync_recv_info *info, struct net_buf_simple *buf) { int err; struct bt_le_oob oob; char addr_str[BT_ADDR_LE_STR_LEN]; if (default_conn) { /* Only respond with address if not already connected */ return; } if (buf && buf->len) { /* Respond with own address for the advertiser to connect to */ net_buf_simple_reset(&rsp_buf); rsp_params.request_event = info->periodic_event_counter; rsp_params.request_subevent = info->subevent; rsp_params.response_subevent = info->subevent; rsp_params.response_slot = 0; err = bt_le_oob_get_local(BT_ID_DEFAULT, &oob); if (err) { printk("Failed to get OOB data (err %d)n", err); return; } bt_addr_le_to_str(&oob.addr, addr_str, sizeof(addr_str)); printk("Responding with own addr: %sn", addr_str); net_buf_simple_add_u8(&rsp_buf, sizeof(bt_addr_le_t)); net_buf_simple_add_u8(&rsp_buf, BT_DATA_LE_BT_DEVICE_ADDRESS); net_buf_simple_add_mem(&rsp_buf, &oob.addr.a, sizeof(oob.addr.a)); net_buf_simple_add_u8(&rsp_buf, oob.addr.type); err = bt_le_per_adv_set_response_data(sync, &rsp_params, &rsp_buf); if (err) { printk("Failed to send response (err %d)n", err); } } else if (buf) { printk("Received empty indication: subevent %dn", info->subevent); } else { printk("Failed to receive indication: subevent %dn", info->subevent); } }
3.3 連接 v2
當 PAwR advertiser 需要以更高的吞吐量或更低的延遲與scanner通信時,可以決定連接到同步scanner。為此,advertiser 需要獲得scanner設備的地址和scanner監(jiān)聽的子事件。要建立連接,需要調用 bt_conn_le_create_synced():
bt_addr_le_to_str(&peer, addr_str, sizeof(addr_str));
printk("Connecting to %s in subevent %dn", addr_str, info->subevent);
synced_param.peer = &peer;
synced_param.subevent = info->subevent;
/* Choose same interval as PAwR advertiser to avoid scheduling conflicts */
conn_param.interval_min = SUBEVENT_INTERVAL;
conn_param.interval_max = SUBEVENT_INTERVAL;
/* Default values */
conn_param.latency = 0;
conn_param.timeout = 400;
err = bt_conn_le_create_synced(adv, &synced_param, &conn_param, &default_conn);
if (err) {
printk("Failed to initiate connection (err %d)", err);
}
在進行連接 v2 時,沒有掃描超時的概念,bt_conn_le_create_synced() 命令的結果會在下一個周期性廣播間隔中返回回調。
注意:建議選擇連接時間間隔等于或大于子事件時間間隔。這將減少調度配置,從而提高吞吐量。
4. 低功耗示例
附件是稍作修改的 periodic_adv_rsp 和 periodic_sync_rsp 示例。advertiser 將掃描并建立藍牙 LE 連接,以發(fā)送 PAST 信息和子事件信息。scanner與advertiser 同步后,將在每個廣播間隔發(fā)送數(shù)據(jù)。
主要修改是關閉scanner上的 UART 日志記錄,并在響應中添加更多有意義的數(shù)據(jù)。scanner會在每個響應槽發(fā)送其內部溫度。advertiser 略有改動,使其在更長的廣播間隔時間內更加穩(wěn)健。代碼的主要目的是展示scanner(傳感器)在不同周期性廣播間隔下的低功耗。
您可以在此處下載演示源代碼(在 nRF Connect SDK v2.5.0 上進行了測試): 8562.PAwR_Demo.zip
運行示例時,您將在advertiser 一側看到每個scanner的溫度報告:

與 periodic_adv_rsp 相同,advertiser 只支持每個子事件一個scanner。但可以修改代碼,使每個子事件支持更多scanner或增加子事件的數(shù)量。您需要決定同一子事件中的scanner應如何發(fā)送響應的邏輯;通常情況下,每個子事件的響應槽數(shù)量小于scanner數(shù)量。
以下是scanner在不同周期性廣播間隔(從 100 毫秒到 1 秒再到 10 秒)下的功率測量結果。這就改變了scanner的延遲時間。延遲時間越長,功耗越低。
每隔 100 毫秒輸出 80uA 電流,每個子事件有 4 個字節(jié)的響應。
每個子事件以 1 秒間隔 15uA 響應 4 個字節(jié)。
7.3uA 間隔 10 秒,每個子事件響應 4 個字節(jié)。
在相對較低的 1 秒延遲時間內,可以實現(xiàn) 15uA 的超低功耗。我們可以使用容量為 250mAh 的 CR2032 電池進行粗略計算。如果我們能將 70% 的容量用于藍牙 LE,那么它的壽命為 250mAh * 70% / 15uA = 12500 小時 = 520 天。
5. 總結
PAwR 是藍牙 LE 的一項令人興奮的新功能。它增強了周期性廣播協(xié)議,可能會為藍牙 LE 技術在新的商業(yè)垂直領域打開大門。藍牙 LE 和 PAwR 使許多曾經(jīng)無法實現(xiàn)或過于復雜的應用變得可行。我們很高興看到它將如何實施,并隨時準備幫助您將這項技術推向市場。
審核編輯 黃宇
-
藍牙
+關注
關注
119文章
6312瀏覽量
178690 -
低功耗
+關注
關注
12文章
3438瀏覽量
106691 -
藍牙5.0
+關注
關注
9文章
89瀏覽量
28742
發(fā)布評論請先 登錄
KT6368A藍牙芯片在廣播間隙導致的電源抖動引起mcu被喚醒說明
RTC Alarm組件在設定新時間后周期性分鐘和小時鬧鐘無響應是怎么回事?
藍牙 v5.4 概述 (PAwR, EAD, ESL, LE Gatt)
高溫振動傳感器在600°C環(huán)境下工作時,輸出信號出現(xiàn)周期性噪聲干擾,可能的原因有哪些?如何解決?
STM32G474進入Fault3中斷沒辦法設置成周期性觸發(fā)嗎?
學校SIP廣播對講解決方案
學校做廣播對講系統(tǒng)干貨分享
什么是藍牙BLE5.4
為什么使用評估板EVAL-AD7760收集的數(shù)據(jù)中會出現(xiàn)周期性毛刺?
藍牙 v5.4 概述 (PAwR, EAD, ESL, LE Gatt)
帶響應的周期性廣播 (PAwR):實用指南
評論