2017-06-12 26 views
0

我有一個專有設備的自定義配置文件(我的智能手機應用程序將是唯一與我的外設通信),其中包括兩個簡單的服務。每項服務都允許客戶端在外設上讀取和寫入一個字節的數據。我想添加在單個事務中讀取和寫入兩個字節的功能。服務中的「包含服務」有用嗎?

我試圖添加第三個服務,只包括兩個現有的單字節服務,但所有似乎要做的是分配一個UUID,結合現有服務的UUID,我看不到如何使用組合的UUID,因爲它沒有任何特徵值。

我正在考慮的替代方案是爲兩個字節做一個單獨的服務並將它們的效果合併到我的服務器上,或者我可以用包含兩個字節的單個服務替換所有這些服務,同時包含一個布爾標誌每個字節指示是否應寫入關聯的字節。

第一個選擇似乎過於複雜,第二個選項將排除對單獨字節的通知和指示的單獨控制。

有沒有辦法使用包含的服務來實現我的目標?

回答

0

這是一個相當古老的問題,但如果有其他人遇到它,我在這裏留下評論。

這裏有兩部分。其中一個是Lance F的遲到答案:您對BLE設計原則有錯誤的理解。服務在BLE堆棧的主機級別上定義。並且您從應用程序級別的角度考慮了您的問題,希望原子事務爲您提供兩個不同實體的複合對象。否則,爲什麼你會定義兩個服務?

第二部分回答Kevin Townsend等人,O'Reilly,2014年,第58頁: 的「藍牙低功耗入門」中引用的實際問題。包含的服務可以幫助避免重複數據在GATT服務器中。如果服務將被其他服務引用,則可以使用此機制來節省內存並簡化GATT服務器的佈局。在前面類與對象的類比中,可以將包含定義看作指針或對現有對象實例的引用。

這是我回答的更新,以澄清爲什麼沒有必要在一個問題由Lance F.表示

我大多熟悉醫療器械BLE使用附帶的服務,讓我簡要地勾勒出SIG定義的葡萄糖配置文件作爲一個例子來繪製你的問題的一些類比。

讓我們想象一個具有2種定義特徵的葡萄糖服務的服務器設備:葡萄糖測量和葡萄糖測量上下文。客戶可以訂閱這些特徵中的任何一個或兩個的通知。在一段時間之後,客戶端設備可以通過簡單地寫入相應特徵的客戶端配置特徵描述符來改變其訂閱。

服務器還具有特殊的強制性特徵 - 記錄訪問控制點(RACP),客戶用它來檢索或更新葡萄糖測量歷史記錄。

如果客戶想要獲取一些存儲的歷史記錄,它將寫入RACP {操作碼:4(報告存儲記錄數),操作員:1(所有記錄)}。然後服務器從RACP {OpCode:5(存儲的記錄響應的數量),運營商:0(空),操作數:17(某個數量)}發送指示。(OpCode:1(報告存儲記錄),操作員:4(在範圍內,包含範圍內),操作數:[13,14](例如,記錄13和14)}。作爲響應,服務器逐個發送所請求的記錄作爲葡萄糖測量和葡萄糖測量上下文特徵的通知,然後從RACP特徵發送指示以報告操作的狀態。因此,葡萄糖測量和葡萄糖測量背景是您的模式和速率特性,那麼您還需要一個更多的控制特性 - RACP的一個模擬。現在您需要定義一些代碼,運算符和操作數。創建一個最適合您的結構,例如,代碼:1 - 更新,操作員:1 - 僅限模式,操作數:實際編號。客戶端將其寫入控制點特徵。服務器在寫入時收到通知,解釋它並按照您的自定義配置文件定義的方式運行。

+0

感謝您的回覆,但我很難理解您的答案WRT第1部分。我提供了兩種服務,原因有兩個:1)我需要能夠更改服務器中的任一局部變量而不影響其他變量,2 )我希望能夠獨立地允許通知對本地變量進行本地更改。我認爲這兩個局部變量的每一個都需要單獨的服務。而且你的觀點是正確的,即我希望在單一交易中寫入兩個特徵的方法源於有時需要從客戶端進行原子級更新。 –

+0

WRT第2部分,您的回答確實說明了我對包含服務的預期用途的困惑。我最終創建了寫入(或讀取)兩個局部變量的第三個服務。似乎繁瑣,但它完成了我所需要的。你能否提出一個更好的選擇? –

+0

您爲概念上相似的事物定義服務。如果只打開/關閉通知或指示,則無需定義兩項服務。您爲此目的獲取客戶端配置特徵描述符來取消/訂閱特定特徵的通知/指示。 – mench