Подписки на сообщения NFP
Подписка представлена в виде уникального открытого дескриптора в драйвере. Подписка становится активной, открыв дескриптор в пространстве имен "Subs\" устройства. Тип подписки определяется как все, что следует за префиксом Subs\.
Обратный вызов при получении сообщения предоставляется через завершенный IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE.
Подписку можно временно отключить с помощью IOCTL_NFP_DISABLE.
Подписку можно повторно включить с помощью IOCTL_NFP_ENABLE.
Маркеры
Клиент, который хочет подписаться на тип сообщения, сначала откроет новый дескриптор для драйвера. Дескриптора из предыдущих публикаций, подписок и т. д. нельзя использовать повторно. Если они больше не нужны, они будут закрыты клиентом с надлежащим поведением.
При открытии дескриптора клиент задает тип подписки на сообщение. Это тот же механизм, что и при публикации, за исключением того, что тип имеет префикс "Subs\" вместо "Pubs\".
Нет возможности считывать тип обратно.
Необходимые действия
- Драйвер ДОЛЖЕН проанализировать компонент протокола (перед первым "."). Любой нераспознанный протокол ДОЛЖЕН комплектуться с STATUS_OBJECT_PATH_NOT_FOUND
- Если строка не заканчивается значением NULL в пределах длины буфера, драйвер должен завершить IOCTL с STATUS_INVALID_PARAMETER.
- Если протоколу требуется подтип, а компонент подтипа буфера строки содержит менее одного (1) символа или длиннее 250 символов, драйвер должен завершить IOCTL с STATUS_INVALID_PARAMETER.
- Если длина компонента протокола в строковом буфере превышает 250 символов, драйвер должен завершить IOCTL с STATUS_INVALID_PARAMETER.
- Драйвер ДОЛЖЕН интерпретировать первое значение NULL как конец строки.
- Драйвер может распознать тип "Связывание:Bluetooth" для подписок.
- Драйвер ДОЛЖЕН распознавать тип WindowsUri.
- Драйвер ДОЛЖЕН распознавать тип DeviceArrived только для подписок.
- Драйвер ДОЛЖЕН распознавать тип DeviceDeparted только для подписок.
- Драйвер ДОЛЖЕН распознавать тип "WindowsMime" только для подписок.
- Драйвер ДОЛЖЕН распознавать тип "WindowsMime.".
- Если протокол должен распознаваться только для подписок, а В IOCTL указано "Pubs\", драйвер ДОЛЖЕН завершить IOCTL с STATUS_OBJECT_PATH_NOT_FOUND.
- Если протокол должен распознаваться только для публикаций, а В IOCTL указано "Subs\", драйвер должен завершить IOCTL с STATUS_OBJECT_PATH_NOT_FOUND.
- Некоторые протоколы (пространства имен) зарезервированы. Если в этом документе явно не указано, драйвер НЕ ДОЛЖЕН распознавать протоколы, начинающиеся с:
- "Windows"
- "Устройство"
- Связывание
- "NDEF"
- Два открытых дескриптора одного типа ДОЛЖНЫ представлять две отдельные сущности.
- Если createFile завершается успешно, дескриптор теперь является "дескриптором подписки" и НЕ ДОЛЖЕН быть изменен на любой другой тип дескриптора.
- После успешного завершения IOCTL и до закрытия дескриптора каждый раз при получении сообщения с помощью технологии близкого взаимодействия, соответствующего типу этой подписки, данные этого сообщения ДОЛЖНЫ быть прикреплены к дескриптору файла для доставки клиенту.
Unsubscribe (отмена подписки).
Клиент закроет дескриптор подписки, чтобы прекратить получение сообщений. Если клиентский процесс завершается, система закроет все открытые дескрипторы файлов от имени клиента.
Необходимые действия
При закрытии дескриптора драйвер ДОЛЖЕН освободить всю память, используемую подпиской:
- Драйвер ДОЛЖЕН освободить строковые данные типа.
- Полученная очередь ДОЛЖНА быть очищена и восстановлена.
- Все поданные IOCTL должны быть заполнены STATUS_CANCELLED.
Вредоносные одноранговые узлы
Если вредоносное одноранговое устройство пытается атаковать отказ в обслуживании (DOS) с помощью технологии близкого взаимодействия, возможно, клиенту не удастся достаточно быстро очистить очередь "Получено", чтобы предотвратить чрезмерное использование памяти драйвером.
Необходимые действия
Драйвер НЕ ДОЛЖЕН ставить в очередь или доставить заданное сообщение клиенту, если это сообщение получено, если в настоящее время в очереди "Получено" находится 50 сообщений (самые новые сообщения удаляются).
Клиенты, не отвечающие или неправильное поведение
Если клиент прекращает очистку очереди "Получено", не отправляя необходимый запрос IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE в течение периода от десяти до двадцати секунд [10–20 секунд], драйвер должен предположить, что клиент исчез. В обычных условиях клиенты должны обновлять свои запросы в течение одной секунды [1s]. В этом случае драйвер должен задать для счетчика CompleteEventImmediately нулевое значение и не увеличивать счетчик до тех пор, пока клиент не проснется и не отправит необходимый IRP.
Необходимые действия
Драйвер должен задать для счетчика CompleteEventImmediately нулевое значение и не должен увеличивать счетчик, если клиент не отправил замену IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE в течение 10–20 секунд после завершения IOCTL.
Сообщения с неправильным форматом
Клиент, скорее всего, будет удалять или игнорировать все ошибки (за исключением STATUS_BUFFER_OVERFLOW), возвращаемые IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE. Таким образом, драйвер не должен завершать их с ошибками только из-за того, что было получено сообщение неправильного формата.
Необходимые действия
Драйвер НЕ ДОЛЖЕН доставлять клиенту сообщения, размер которых превышает максимально допустимый.
Драйвер НЕ ДОЛЖЕН доставлять клиенту сообщения нулевой длины.
Драйвер НЕ ДОЛЖЕН доставлять частичные сообщения подписчикам.
Драйвер НЕ ДОЛЖЕН доставлять клиенту сообщения, которые не смогли выполнить надежный CRC.
Примечание Сертификация NFC Forum гарантирует это для поставщиков NFP с поддержкой NFC.
Драйвер ДОЛЖЕН использовать надежный транспорт и (или) пытаться повторно передавать сообщения, которые не выполняют надежный CRC.
Примечание Сертификация NFC Forum гарантирует это для поставщиков NFP с поддержкой NFC.
Дублирующиеся подписки
Драйвер должен предположить, что если клиент подписывается на тип сообщения дважды, это связано с тем, что клиент хочет получить сообщение дважды при получении сообщения.
Необходимые действия
Драйвер ДОЛЖЕН принимать и сообщать о повторяющихся подписках, даже если они подписаны тем же клиентом.