发布 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 处理程序中,将去除设备接口 SymbolicLink ,并且仅保留与设备相关的文件名。 此文件名将是一个以 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 解释为字符串的末尾。
- 驱动程序可以识别发布的“配对:蓝牙”类型。 驱动程序可以识别此类型,以保持兼容性。 (注意使用冒号而不是句点。)
- 驱动程序必须识别“WindowsUri”类型。
- 驱动程序必须仅识别订阅的“DeviceArrived”类型。
- 驱动程序必须仅识别订阅的“DeviceDeparted”类型。
- 驱动程序必须仅识别订阅的“WindowsMime”类型。
- 驱动程序必须识别“WindowsMime.”类型。
- 如果只应为订阅识别协议,并且 IOCTL 指定了“Pubs\”,则驱动程序必须使用STATUS_OBJECT_PATH_NOT_FOUND完成 IOCTL。
- 如果只应为发布识别协议,并且 IOCTL 指定了“Subs\”,则驱动程序必须使用STATUS_OBJECT_PATH_NOT_FOUND完成 IOCTL。
- 同一类型的两个打开句柄 MUST 表示两个不同的实体。
- 某些协议 (命名空间) 保留。 除非本文档中明确指定,否则驱动程序不得识别以下列开头的任何协议:
- “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 ,则不得递增计数器。