出版物在驅動程式中以一個獨特的開啟句柄表示。 活躍出版物必須同時具有型別和數據緩衝區。 此類型是藉由在 「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 處理程式中,將會移除裝置介面 SymbolicLink ,且只會保留裝置相對的檔名。 此檔名會是以空字符結尾且區分大小寫的 UTF-16LE 字串緩衝區,表示發布(或訂閱)的類別。 此緩衝區的大小上限為 502 個字元,包括 NULL 終止符。 驅動程式必須將此路徑剖析為三個組成元件:“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”
- “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-20 秒] 期間無法傳送所需的 IOCTL_NFP_GET_NEXT_TRANSMITTED_MESSAGE 要求,則驅動程式應該假設用戶端已消失。 在正常情況下,用戶應該在一秒 [1s] 內更新其請求。 如果發生這種情況,驅動程式必須將 「CompleteEventImmediately」 計數器設定為零,而且在用戶端喚醒並傳送必要的 IRP 之前,不得遞增計數器。
必要動作
驅動程式必須將「CompleteEventImmediately」計數器設為零,如果用戶端未在前一次 IOCTL 完成後的 10 到 20 秒內傳送替代的 IOCTL_NFP_GET_NEXT_TRANSMITTED_MESSAGE,則不得遞增計數器。