Publicando mensagens NFP
Uma publicação é representada como um identificador aberto exclusivo dentro do driver. As publicações ativas devem ter um tipo e um buffer de dados. O tipo é definido abrindo um nome de arquivo no namespace "Pubs". O buffer de dados é definido enviando IOCTL_NFP_SET_PAYLOAD.
Um retorno de chamada na tentativa de transmissão é dado por meio de um IOCTL_NFP_GET_NEXT_TRANSMITTED_MESSAGE concluído.
Uma publicação pode ser temporariamente desabilitada por meio de um IOCTL_NFP_DISABLE.
Uma publicação pode ser habilitada novamente por meio de um IOCTL_NFP_ENABLE.
Alças
Um cliente que deseja publicar uma mensagem abrirá primeiro um novo identificador para o driver. Identificadores de publicações anteriores, assinaturas e assim por diante, não podem ser reutilizados. Se eles não forem mais necessários, eles serão fechados por um cliente bem comportado.
O cliente abrirá um identificador de arquivo no "Pubs/<Protocol>.<SubType>" namespace relativo ao dispositivo. O exemplo a seguir é um exemplo completo.
\\?\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
Depois de abrir o identificador, um cliente deve definir o conteúdo da mensagem a ser publicada com o IOCTL_NFP_SET_PAYLOAD.
Não há nenhum recurso para ler o nome de arquivo especificado (o tipo de publicação).
Nome do Arquivo
No manipulador CreateFile de um driver, o SymbolicLink da Interface do Dispositivo será removido e somente o Nome de Arquivo relativo ao dispositivo permanecerá. Esse Nome de Arquivo será um buffer de cadeia de caracteres UTF-16LE que diferencia maiúsculas de minúsculas terminada em nulo que indica o tipo da publicação (ou assinatura). O tamanho máximo desse buffer é de 502 caracteres, incluindo o terminador NULL. O driver deve analisar esse caminho em três componentes constituintes: "Pubs\", protocolo e subtipo.
Ações necessárias
- O driver DEVE analisar o componente de protocolo (antes do primeiro '.'). Qualquer protocolo não reconhecido DEVE ser concluído com STATUS_OBJECT_PATH_NOT_FOUND
- Se a cadeia de caracteres não for terminada em NULL dentro do comprimento do buffer, o driver DEVERÁ concluir o IOCTL com STATUS_INVALID_PARAMETER.
- Se o protocolo exigir um subtipo e o componente de subtipo do buffer de cadeia de caracteres for menor que um (1) caractere ou maior que 250 caracteres, o driver DEVERÁ concluir o IOCTL com STATUS_INVALID_PARAMETER.
- Se o componente de protocolo do buffer de cadeia de caracteres tiver mais de 250 caracteres, o driver DEVERÁ concluir o IOCTL com STATUS_INVALID_PARAMETER.
- O driver DEVE interpretar o primeiro NULL como o final da cadeia de caracteres.
- O driver PODE reconhecer o tipo "Emparelhamento:Bluetooth" para publicações. O driver PODE reconhecer esse tipo para preservar a compatibilidade. (Observe o uso de dois-pontos em vez do uso de um ponto.)
- O driver DEVE reconhecer o tipo "WindowsUri".
- O driver DEVE reconhecer o tipo "DeviceArrived" somente para assinaturas.
- O driver DEVE reconhecer o tipo "DeviceDeparted" somente para assinaturas.
- O driver DEVE reconhecer o tipo "WindowsMime" somente para assinaturas.
- O driver DEVE reconhecer o tipo "WindowsMime".
- Se o protocolo só deve ser reconhecido para assinaturas e o IOCTL especifica "Pubs\", o driver DEVE concluir o IOCTL com STATUS_OBJECT_PATH_NOT_FOUND.
- Se o protocolo só deve ser reconhecido para publicações e o IOCTL especifica "Subs\", o driver DEVE concluir o IOCTL com STATUS_OBJECT_PATH_NOT_FOUND.
- Dois identificadores abertos para o mesmo tipo DEVEM representar duas entidades distintas.
- Alguns protocolos (namespaces) são reservados. A menos que explicitamente especificado neste documento, o driver NÃO DEVE reconhecer nenhum protocolo que comece com:
- “Windows”
- "Dispositivo"
- "Emparelhamento"
- "NDEF"
- "NFC"
- "Iso14443Dep"
- "Iso14443TypeA"
- "Iso14443TypeB"
- "Iso15693Vicinity"
- "MifareClassic"
- "MifareUltralight"
- "FeliCa"
Cancelar Publicação
Quando um cliente não quiser mais publicar uma mensagem, ele fechará o identificador de publicação. Isso indica que a mensagem não deve mais ser transmitida. Se um processo de cliente for encerrado, o sistema fechará todos os identificadores de arquivo abertos em nome do cliente.
Ações necessárias
- Quando o identificador é fechado (IRP_MJ_CLOSE), o driver:
- DEVE recuperar toda a memória usada pela publicação (dados de tipo e mensagem), exceto para buffers para transmissões contínuas desta publicação.
- NÃO DEVERÁ transmitir a mensagem se um dispositivo se tornar próximo no futuro.
- NÃO DEVE interromper nenhuma transmissão em andamento da publicação.
- O driver pode ignorar IRP_MJ_CLEANUP.
O driver deve assumir que, se o cliente publicar uma mensagem duas vezes, é porque o cliente deseja que a mensagem seja transmitida duas vezes quando um dispositivo estiver próximo.
Ações necessárias
O driver DEVE aceitar e transmitir mensagens publicadas duplicadas, mesmo que publicadas pelo mesmo cliente.
Ações necessárias
O driver DEVERÁ remover todas as mensagens (e recuperar esses recursos) da fila "Recebido" se o cliente não tiver enviado uma IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE de substituição dentro de 10 a 20 segundos após a conclusão do IOCTL anterior.
Clientes sem resposta ou com comportamento inadequado
Se um cliente não enviar a solicitação de IOCTL_NFP_GET_NEXT_TRANSMITTED_MESSAGE necessária por um período de dez a vinte segundos [10-20seg], o driver deverá assumir que o cliente desapareceu. Em circunstâncias normais, os clientes devem atualizar suas solicitações bem dentro de um segundo [1s]. Se isso ocorrer, o driver deverá definir o contador "CompleteEventImmediately" como zero e não deverá incrementar o contador até que o cliente seja ativado e envie o IRP necessário.
Ações necessárias
O driver deve definir o contador "CompleteEventImmediately" como zero e não deve incrementar o contador se o cliente não tiver enviado uma IOCTL_NFP_GET_NEXT_TRANSMITTED_MESSAGE de substituição dentro de 10 a 20 segundos após a conclusão do IOCTL anterior.