訂閱會在驅動程式內表示為唯一的開啟句柄。 開啟一個句柄到「Subs\」裝置命名空間,即可啟用訂閱。 訂用帳戶的類型被定義為「Subs\」字首後面的所有內容。
訊息接收的回呼會透過已完成的 IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE來提供。
您可以透過 IOCTL_NFP_DISABLE暫時停用訂用帳戶。
您可以透過 IOCTL_NFP_ENABLE重新啟用訂用帳戶。
把手
想要訂閱訊息類型的用戶端會先開啟驅動程式的新句柄。 無法重複使用先前發行集、訂閱等的句柄。 如果不再需要它們,行為良好的用戶端將會關閉它們。
在開啟句柄時,用戶端會設定訊息訂閱的類型。 這是與發行一樣的機制,不同之處在於類型前面加上 “Subs\” 而不是 “Pubs\”。
無法回讀類型的機制。
必要動作
- 驅動程式必須剖析通訊協定元件(在第一個 '.' 之前)。 任何無法辨識的通訊協定必須以 STATUS_OBJECT_PATH_NOT_FOUND 結束
- 如果字串在緩衝區長度內不是以 NULL 結尾,驅動程式必須以狀態碼 STATUS_INVALID_PARAMETER 完成 IOCTL。
- 如果通訊協定需要子類型,且字串緩衝區的子類型元件小於一個 (1) 個字元或超過 250 個字元,驅動程式就必須使用 STATUS_INVALID_PARAMETER完成 IOCTL。
- 如果字串緩衝區的通訊協定元件長度超過 250 個字元,驅動程式就必須使用 STATUS_INVALID_PARAMETER完成 IOCTL。
- 驅動程式必須將第一個NULL解譯為字串結尾。
- 驅動程式可能會辨識「配對:藍牙」的訂閱類型。
- 驅動程式必須辨識 「WindowsUri」 類型。
- 驅動程式必須只辨識訂用帳戶的“DeviceArrived” 類型。
- 驅動程式必須只辨識訂用帳戶的「DeviceDeparted」類型。
- 驅動程式必須只辨識訂用帳戶的 「WindowsMime」 類型。
- 驅動程式必須辨識 「WindowsMime.」 類型。
- 如果該通訊協定應僅辨識訂閱,而IOCTL指定「Pubs\」,則驅動程式必須以 STATUS_OBJECT_PATH_NOT_FOUND 完成 IOCTL。
- 如果協定僅應辨識為發行集,並且 IOCTL 指定為「Subs\」,則驅動程式必須以 STATUS_OBJECT_PATH_NOT_FOUND 完成該 IOCTL。
- 保留某些通訊協定(命名空間)。 除非在本文件中明確指定,否則驅動程式不得辨識任何以以下開頭的協議:
- “Windows”
- 裝置
- “配對”
- “NDEF”
- 相同類型的兩個開啟句柄必須代表兩個不同的實體。
- 如果 CreateFile 成功,句柄現在是「訂用帳戶句柄」,且「不可」變更為任何其他類型的句柄。
- 此 IOCTL 成功且在控制代碼關閉之前,每次透過符合此訂閱類型的鄰近技術收到訊息時,該訊息的數據都必須附加到檔案控制代碼,以傳遞給用戶端。
取消訂閱
客戶端會關閉訂閱處理程式來停止接收訊息。 如果客戶端進程終止,系統會代表用戶端關閉所有開啟的檔案句柄。
必要動作
當句柄關閉時,驅動程式必須回收訂用帳戶所使用的所有記憶體:
- 驅動程式必須回收類型字串數據。
- 接收到的佇列必須清除並回收。
- 任何掛起的 IOCTL 必須以 STATUS_CANCELLED 完成。
惡意對等
如果惡意對等裝置嘗試透過鄰近技術進行阻斷服務 (DOS) 攻擊,則用戶端可能無法快速清空「已接收」佇列,以防止驅動程式過度使用記憶體。
必要動作
當「已接收」佇列中已有 50 則訊息時,如果收到新的訊息,驅動程式不得將該訊息排入佇列或傳遞給用戶端(最多只能保留最新 50 則訊息)。
無回應或運作異常的客戶端
如果用戶端在 10 到 20 秒 [10-20 秒] 期間內無法傳送所需的 IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE 要求,而停止清空「已接收」佇列,則驅動程式應該假設用戶端已消失。 在正常情況下,用戶應該在一秒 [1s] 內更新其請求。 如果發生這種情況,驅動程式必須將 「CompleteEventImmediately」 計數器設定為零,而且在用戶端喚醒並傳送必要的 IRP 之前,不得遞增計數器。
必要動作
驅動程式必須將「CompleteEventImmediately」計數器設為零,而且如果用戶端未在前一次 IOCTL 完成後的 10 到 20 秒內傳送新的IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE,則計數器不得遞增。
格式不正確的訊息
客戶端可能會卸除或忽略從 IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE 傳回的所有錯誤(除 STATUS_BUFFER_OVERFLOW 外)。 因此,驅動程式不應僅僅因為收到格式不正確的訊息而處理這些錯誤狀況。
必要動作
驅動程式「不得」將大於允許訊息大小上限的訊息傳遞給用戶端。
驅動程式「不應該」將長度為零的訊息傳遞至用戶端。
驅動程式「不得」將部分訊息傳遞至訂閱者。
驅動程式不得將通過強 CRC 檢查失敗的訊息傳遞給用戶端。
注意 NFC 論壇認證可保證此功能適用於已啟用 NFC 的 NFP 提供者。
驅動程式必須使用高度可靠的傳輸機制,並嘗試重新傳輸未通過強式 CRC 檢驗的訊息。
注意 NFC 論壇認證可保證此功能適用於已啟用 NFC 的 NFP 提供者。
重複的訂閱
驅動程式應該假設,如果用戶端訂閱訊息類型兩次,這是因為用戶端想要在收到訊息時收到訊息兩次。
必要動作
驅動程式必須接受並報告重複的訂閱,即使相同客戶端訂閱也一樣。