共用方式為


發佈 NFP 訊息

發行集會以驅動程式內的唯一開啟句柄表示。 使用中的發行集必須同時具有型別和數據緩衝區。 類型是在 「Pubs」 命名空間中開啟檔名來設定。 數據緩衝區是透過傳送 IOCTL_NFP_SET_PAYLOAD來設定。

嘗試傳輸的回呼是透過已完成 的IOCTL_NFP_GET_NEXT_TRANSMITTED_MESSAGE來提供。

您可以透過 IOCTL_NFP_DISABLE暫時停用發行集。

您可以透過 IOCTL_NFP_ENABLE重新啟用發行集。

處理

想要發佈訊息的用戶端會先開啟驅動程式的新句柄。 無法重複使用先前發行集、訂閱等的句柄。 如果不再需要它們,則會由行為良好的客戶端關閉。

用戶端會在 「Pubs/<Protocol>」中開啟檔案句柄。<SubType>“ 裝置相對命名空間。 以下是完整的範例。

\\?\root#ContosoProx#0000#{FB3842CD-9E2A-4F83-8FCC-4B0761139AE9}\Pubs\Windows.windows.com/SD
<---------------Device Interface Symbolic Link-----------------> <------File Name---------->
    <--------------------><------------------------------------> <--> <-----> <------------>
          DeviceID          NearFieldProximity Interface Class     *  Protocol   SubType

開啟句柄之後,客戶端應該接著設定訊息的承載,以 IOCTL_NFP_SET_PAYLOAD發佈。

在發行集類型) (,沒有可讀取指定的檔名。

檔案名稱

在驅動程式的 CreateFile 處理程式中,裝置介面 符號連結 將會移除,而且只會保留裝置相對檔名。 這個檔名會是 null 終止區分大小寫的 UTF-16LE 字串緩衝區,表示發行集的類型 (或訂閱) 。 此緩衝區的大小上限為 502 個字元,包括 NULL 終止符。 驅動程式必須將此路徑剖析成三個組成元件:“Pubs\”、通訊協定和子類型。

必要動作

  • 驅動程式必須在第一個 『.』 之前剖析通訊協定元件 (。) 。 任何無法辨識的通訊協議都必須完成STATUS_OBJECT_PATH_NOT_FOUND
  • 如果字串在緩衝區長度內不是以 NULL 終止,驅動程式必須以 STATUS_INVALID_PARAMETER完成 IOCTL。
  • 如果通訊協定需要子類型,且字串緩衝區的子類型元件小於 1 (1) 字元或超過 250 個字元,則驅動程式必須完成具有STATUS_INVALID_PARAMETER的 IOCTL。
  • 如果字串緩衝區的通訊協定元件超過 250 個字元,驅動程式必須以STATUS_INVALID_PARAMETER完成 IOCTL。
  • 驅動程式必須將第一個NULL解譯為字串結尾。
  • 驅動程式可以辨識發行集的「配對:藍牙」類型。 驅動程式可以辨識此類型,以保留相容性。 (記下冒號的使用,而不是使用period.)
  • 驅動程式必須辨識 「WindowsUri」 類型。
  • 驅動程式只能辨識訂用帳戶的 “DeviceArrived” 類型。
  • 驅動程式只能辨識訂用帳戶的 “DeviceDeparted” 類型。
  • 驅動程式只能辨識訂用帳戶的「WindowsMime」類型。
  • 驅動程式必須辨識 「WindowsMime.」 類型。
  • 如果只能辨識訂用帳戶的通訊協定,而 IOCTL 會指定 “Pubs\”,驅動程式必須完成具有 STATUS_OBJECT_PATH_NOT_FOUND 的 IOCTL。
  • 如果只能辨識發行集的通訊協定,且IOCTL指定 「Subs\」,驅動程序必須完成具有STATUS_OBJECT_PATH_NOT_FOUND的IOCTL。
  • 相同類型的兩個開啟句柄必須代表兩個不同的實體。
  • 保留某些通訊協定 (命名空間) 。 除非在本文件中明確指定,否則驅動程式不得辨識開頭為下列任何通訊協定:
    • "Windows"
    • “Device”
    • “Pairing”
    • “NDEF”
    • “NFC”
    • “Iso14443Dep”
    • “Iso14443TypeA”
    • “Iso14443TypeB”
    • “Iso15693Vicinity”
    • “MifareClassic”
    • “MifareUltralight”
    • “FeliCa”

取消發行

當用戶端不再需要發佈訊息時,它會關閉發行集句柄。 這表示不應該再傳輸訊息。 如果客戶端進程終止,系統會代表用戶端關閉所有開啟的檔案句柄。

必要動作

  • 當句柄關閉 (IRP_MJ_CLOSE) 時,驅動程式:
    • 必須回收發行集所使用的所有記憶體 (類型與訊息數據) ,但此發行集進行中傳輸的緩衝區除外。
    • 如果裝置在未來變成同位,則不得傳輸訊息。
    • 不得中斷發行集的任何進行中傳輸。
  • 驅動程式可能會忽略IRP_MJ_CLEANUP。

驅動程式應該假設用戶端發佈訊息兩次,這是因為用戶端想要在裝置鄰近時傳輸兩次訊息。

必要動作

驅動程式必須接受並傳輸重複的已發佈訊息,即使由相同的用戶端發佈也一樣。

必要動作

如果用戶端尚未在 IOCTL 完成的 10 - 20 秒內傳送取代 IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE ,則驅動程式必須移除 (的所有訊息,並從「已接收」佇列回收這些) 資源。

沒有回應或錯誤用戶端

如果客戶端無法在 10 到 20 秒 [10-20sec] 期間傳送必要的 IOCTL_NFP_GET_NEXT_TRANSMITTED_MESSAGE 要求,則驅動程式應該假設用戶端已消失。 在正常情況下,客戶端應該在一秒 [1s] 內重新整理其要求。 如果發生這種情況,驅動程式必須將 「CompleteEventImmediately」 計數器設定為零,而且在用戶端喚醒並傳送必要的 IRP 之前,不得遞增計數器。

必要動作

驅動程式必須將 「CompleteEventImmediately」 計數器設定為零,如果用戶端尚未在 IOCTL 完成的 10 - 20 秒內傳送取代 IOCTL_NFP_GET_NEXT_TRANSMITTED_MESSAGE ,則不得遞增計數器。