다음을 통해 공유


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 처리기에서 Device Interface SymbolicLink 는 제거되고 디바이스 상대 파일 이름만 유지됩니다. 이 파일 이름은 게시(또는 구독)의 형식을 나타내는 null로 끝나는 대/소문자 구분 UTF-16LE 문자열 버퍼입니다. 이 버퍼의 최대 크기는 NULL 종결자를 포함하여 502자입니다. 드라이버는 이 경로를 "Pubs\", 프로토콜 및 하위 형식의 세 가지 구성 요소로 구문 분석해야 합니다.

필요한 작업

  • 드라이버는 프로토콜 구성 요소(첫 번째 '.'이전)를 구문 분석해야 합니다. 인식할 수 없는 프로토콜은 STATUS_OBJECT_PATH_NOT_FOUND 완료해야 합니다.
  • 문자열이 버퍼 길이 내에서 NULL로 종료되지 않은 경우 드라이버는 STATUS_INVALID_PARAMETER 사용하여 IOCTL을 완료해야 합니다.
  • 프로토콜에 하위 형식이 필요하고 문자열 버퍼의 하위 형식 구성 요소가 1자 미만이거나 250자보다 긴 경우 드라이버는 STATUS_INVALID_PARAMETER 사용하여 IOCTL을 완료해야 합니다.
  • 문자열 버퍼의 프로토콜 구성 요소가 250자보다 긴 경우 드라이버는 STATUS_INVALID_PARAMETER 사용하여 IOCTL을 완료해야 합니다.
  • 드라이버는 첫 번째 NULL을 문자열의 끝으로 해석해야 합니다.
  • 드라이버는 게시에 대한 "페어링:Bluetooth" 유형을 인식할 수 있습니다. 드라이버는 호환성을 유지하기 위해 이 형식을 인식할 수 있습니다. (마침표가 아닌 콜론을 사용합니다.)
  • 드라이버는 "WindowsUri" 형식을 인식해야 합니다.
  • 드라이버는 구독에 대해서만 "DeviceArrived" 유형을 인식해야 합니다.
  • 드라이버는 구독에 대해서만 "DeviceDeparted" 유형을 인식해야 합니다.
  • 드라이버는 구독에 대해서만 "WindowsMime" 형식을 인식해야 합니다.
  • 드라이버는 "WindowsMime" 형식을 인식해야 합니다.
  • 프로토콜이 구독에 대해서만 인식되어야 하고 IOCTL이 "Pubs\"를 지정하는 경우 드라이버는 STATUS_OBJECT_PATH_NOT_FOUND 사용하여 IOCTL을 완료해야 합니다.
  • 프로토콜이 게시에 대해서만 인식되어야 하고 IOCTL이 "Subs\"를 지정하는 경우 드라이버는 STATUS_OBJECT_PATH_NOT_FOUND IOCTL을 완료해야 합니다.
  • 동일한 형식의 열린 핸들 2개는 두 개의 고유 엔터티를 나타내야 합니다.
  • 일부 프로토콜(네임스페이스)은 예약되어 있습니다. 이 문서에서 명시적으로 지정하지 않는 한 드라이버는 다음으로 시작하는 프로토콜을 인식하지 않아야 합니다.
    • "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 요청을 보내지 못하는 경우 드라이버는 클라이언트가 사라졌다고 가정해야 합니다. 정상적인 상황에서 클라이언트는 1초[1초] 이내에 요청을 새로 고쳐야 합니다. 이 경우 드라이버는 "CompleteEventImmediately" 카운터를 0으로 설정해야 하며 클라이언트가 절전 모드를 해제하고 필요한 IRP를 보낼 때까지 카운터를 증가시키지 않아야 합니다.

필요한 작업

드라이버는 "CompleteEventImmediately" 카운터를 0으로 설정해야 하며, 클라이언트가 이전 IOCTL 완료 후 10~20초 이내에 교체 IOCTL_NFP_GET_NEXT_TRANSMITTED_MESSAGE 보내지 않은 경우 카운터를 증가시키지 않아야 합니다.