Bluetooth: Архитектура — Host Controller Interface (HCI)
Общее описание
HCI представляет собой командный интерфейс контроллера Baseband и менеджера связи, а так же предоставляет доступ к параметрам конфигурации устройства Bluetooth . Этот интерфейс предоставляет единообразный способ доступа к параметрам Baseband.

Нижние программные уровни стека Bluetooth
Хост – устройство, к которому подключен модуль Bluetooth.
На рисунке изображен обзор нижних программных уровней. Аппаратное ПО (микропрограмма) HCI преобразует команды интерфейса контроллера хоста в команды для физического оборудования Bluetooth (для Baseband и менеджера связей), а так же управляет статусными регистрами, регистрами управления и регистрами событий.
Между драйвером HCI и аппаратным ПО HCI могут существовать несколько слоев. Эти промежуточные слои не контролируют данные, передаваемые транспортным уровнем хост контроллера.
Драйвер HCI осуществляет обмен данными и командами с аппаратным ПО HCI. Для обеспечения передачи этих данных служит драйвер транспортного уровня хост контроллера (драйвер физической шины).
Хост получает асинхронные уведомления о событиях HCI независимо от того, как используется транспортный уровень. Когда хост обнаруживает, что произошло событие, он анализирует пакеты полученных событий для того, чтобы определить, какое событие произошло.
Транспортный уровень контроллера хоста
Стек драйверов хоста имеет транспортный уровень между драйвером контроллера хоста и хостом. Транспортный уровень прозрачен для передачи данных. Драйвер контроллера хоста, являющийся интерфейсом к контроллеру, должен быть независимым от способа передачи данных. К способу передачи данных не должны предъявляться требования знания данных, передаваемых драйвером контроллера самому контроллеру. Это позволяет изменять интерфейс (HCI) или контроллер, не влияя на транспортный уровень.
Обзор команд и событий HCI
Общие события — события могут возникать от команд или других событий, возникающий в любое время.
Установка устройства — команды используются для переключения контроллера в определенное состояние.
Контроллер управления потоком — эти команды совместно с событиями используются для управления потоком от хоста к контроллеру.
Информация контроллера — эти команды позволяют хосту обнаруживать локальную информацию об устройстве.
Конфигурация контроллера — эти команды совместно с событиями позволяют настраивать общие конфигурационные параметры.
Обнаружение устройств — эти команды совместно с событиями позволяют устройству обнаруживать другие устройства.
Установка соединения — эти команды совместно с событиями позволяют устройству подключаться к другому устройству.
Информация о другом устройстве — эти команды совместно с событиями позволяют обнаруживать информацию о других устройствах.
Синхронные соединения — эти команды совместно с событиями позволяют создавать синхронные соединения.
Состояние соединения — эти команды совместно с событиями позволяют настраивать связь, преимущественно для операций, уменьшающих энергопотребление.
Структура сети Piconet — эти команды совместно с событиями позволяют обнаруживать и настраивать сеть Piconet.
Качество обслуживания — эти команды совместно с событиями позволяют настраивать параметры качества обслуживания.
Физические связи — эти команды совместно с событиями позволяют настраивать физическую связь.
Управление потоком хоста — эти команды совместно с событиями позволяют использовать управление потоком данных совместно с хостом.
Информация о связи — эти команды совместно с событиями позволяют читать информацию о связи.
Аутентификация и шифрование — эти команды совместно с событиями позволяют аутентифицировать другое устройство и зашифровать связь с ним.
Тестирование — эти команды совместно с событиями позволяют переводить устройство в тестовый режим.
Управление потоком HCI
Управление потоком от хоста к контроллеру
Управление потоком в этом направлении используется для предотвращения переполнения буфера данных контроллера с данными ACL, направляющимися на другое устройство (используя хендл соединения), которое не отвечает. Хост управляет буферами данных контроллера.
Управление потоком от контроллера к хосту
В некоторых реализациях может быть необходимым управление потоком в направлении от контроллера к хосту. Данный набор команд может использоваться для включения или отключения управления потоком в данном направлении.
Важные функции секретного меню для разработчиков

Секретное меню для разработчиков содержит порядка 90 скрытых настроек в твоем смартфоне. Некоторые из них нужны только опытным пользователям, другие – для проведения тестирования устройства. Разберем только самые полезные из них.
В зависимости от модели вашего смартфона, пункты меню могут немного различаться и находиться в другом порядке.
Как включить меню разработчиков?
На примере Samsung: идем в Настройки – Сведения о телефоне – Сведения о ПО – Номер сборки (жмем несколько раз). Далее в настройках появится пункт “Параметры разработчика”.
На примере Xiaomi: идем в Настройки – О телефоне – Версия MIUI (жмем несколько раз). Далее в расширенных настройках появится пункт “Для разработчиков”.
На примере чистого Android: идем в Настройки – Система – Дополнительно – О телефоне – Номер сборки (жмем несколько раз). Далее в настройках Системы появится новый пункт “Для разработчиков”.
Общие настройки

Пароль для резервного копирования. Защищает ваши локальные копии паролем. Т.е., чтобы сделать резервную копию или восстановиться из нее, нужно будет ввести пароль. Все ваши резервные копии хранятся в папке backup.
Не выключать экран – во время зарядки экран всегда будет включен. Эта настройка удобна, когда снимаешь видео с презентацией смартфона, в остальных случаях – бесполезна.
Пропускать экран блокировки (для Xiaomi) – не включаем, чтобы обезопасить свои данные. Можно активировать специально для пожилых, чтобы не приходилось каждый раз разблокировать смартфон. Перед этим в настройках безопасности отключаем блокировку по паролю и отпечатку.
Включить журнал HCI Bluetooth – используется разработчиками, когда нужно перехватить какие-то данные по Bluetooth между телефоном и умными часами, например.
Заводская (OEM) разблокировка – вы включаете процесс разблокировки загрузчика, например, для установки root и кастомной прошивки.
Сервис WebView – отвечает за отображение контента внутри приложений, а не перекидывает вас в браузер при нажатии по ссылке. Например, удобно просматривать новостную ленту вКонтакте.
Статус Mi Unlock (для Xiaomi) – нужна для разблокировки загрузчика, при установке root.
Автоматические обновления – Android сам обновляется без вашего участия. А все обновления применяются после перезагрузки устройства.
Деморежим – ненужная настройка, отключает все подключения (сеть, wifi, bluetooth). Используют, чтобы делать красивые скриншоты без верхней строки состояния и чтобы показать, что телефон типа ловит сеть, когда на самом деле он нерабочий.
Темная/светлая тема – меняете световую тему на уровне системы.
Плитки быстрых параметров для разработчиков – выводит некоторые настройки из меню разработчиков в Центр управления (шторку).
Агенты доверия – откладывает момент блокировки смартфона при использовании функции Smart Lock Google. Эта функция сама разблокирует/заблокирует телефон в зависимости от привычек поведения пользователя. Лучше не включать для своей же безопасности.
Блокировать экран при утрате доверия. Если телефон был разблокирован “неестественным образом” при включенном агенте доверия, например, в незнакомом месте или чужим голосом, то эта функция сразу блокирует смартфон.
Отладка
Эта часть настроек для отлаживания работы телефона в случае каких-то сбоев через компьютер.
Отладка по USB | Отладка по Wi-Fi – разрешаем отладку телефона по кабелю или WiFi.
Отозвать доступ для USB отладки – запрещаем доступ к USB отладке для всех ПК, которым он был разрешен.
Установка через USB – чтобы ставить приложения на телефон прямо с компьютера.
Приложения для фиктивных местоположений – можно задать любую страну, и все приложения и сервисы будут думать, что вы находитесь там.
Включить проверку атрибутов – будет проводиться проверка атрибутов во время отладки работы телефона с ПК.
Приложение для отладки – выбрать приложение по умолчанию для отладки телефона, если у вас их несколько установлено.
Ждать подключения отладчика – отлаживаемое приложение не будет запускаться до тех пор, пока не запущен отладчик.
Проверять приложения при установке – проверяет все приложения, установленные через ПК антивирусом и другими средствами безопасности, которые стоят в вашем телефоне.
Проверять байт код – настройка ни на что не влияет.
Размер буфера журнала – это размер текстового документа, где хранятся все данные при отладке, сюда записываются ошибки и баги. НЕ ВЛИЯЕТ на производительность смартфона. Можно вообще отключить.
Отладка графического процессора (GPU) – опция для мастеров при решении проблем с видеодрайверами, например.
Настройки GameDriver (Графический драйвер) – выбираем, какой драйвер будет использоваться для работы конкретного приложения. По умолчанию система сама выбирает наилучший драйвер. Настройка только для профи.
Трассировка системы – записывает активность устройства за несколько секунд в отдельном файле. Нужно для разработчиков мобильных приложений. Для остальных бесполезная функция.
Сети
Сертификация беспроводных мониторов – выводит информацию сертификации при подключении к ТВ через Miracast.
Расширение покрытия WiFi – можно расширить зону действия вашего роутера или точки доступа, используя телефон как репитер, т.е. повторитель сигнала.
Ограничения запросов Wi-Fi (Xiaomi) – уменьшает разряд батареи и повышает производительность сети.
Безопасный режим WiFi – приоритет стабильности WiFi над производительностью.
Не отключать мобильный интернет – одновременно работает и WiFi, и мобильный интернет для быстроты. Идет дополнительный расход заряда батареи.
Аппаратное ускорение в режиме модема – улучшает скорость при раздаче интернета с телефона на ПК. Сейчас почти не используется.
Конфигурация USB по умолчанию – устанавливает режим работы телефона при подключении к ПК по кабелю. Это передача файлов, usb-модем, передача изображений или только зарядка.
Отключить абсолютный уровень громкости – нужно, если какие-то проблемы со звуком на Bluetooth колонке или наушниках, либо если на них нельзя выставлять громкость.
Отключить аппаратную загрузку A2DP – если проблемы “заикания” звука на Bluetooth колонке или наушниках. Может пропасть стерео звучание.
Аудиокодек Bluetooth: SBC – самый простой кодек для передачи звука на беспроводные наушники, без улучшений; AAC – лучше качество звука; aptX и LDAC – передача звука очень высокого качества (главное, чтобы наушники поддерживали выбранный кодек).
Частота дискретизации аудио Bluetooth – чем больше значение, тем лучше и качественнее звук в беспроводных наушниках или колонке.
Режим аудиоканала Bluetooth – стерео или моно звучание звука в наушниках.
Ввод
Показывать нажатия – визуализирует ваши нажатия по экрану. Обычно применяют, при записи видео с экрана смартфона.
Место касания – идет запись движения указателя по экрану, плюс координаты X,Y.
Отрисовка
Подсвечивать окна | Показывать обновления поверхности – подсвечивает фиолетовым окно приложения при любом ваше действии.
Показывать границы объектов (элементов) – очерчивает границы всех объектов на странице, кнопки, пункты меню т.д. Нужно для мобильных разработчиков.
Отразить интерфейс – меняет расположение всех меню и кнопок справа налево. Если в Израиль никто не собирается, настройку не активируем ))
Анимация окон – отключаем для ускорения работы телефона.
Анимация переходов – отключаем для ускорение телефона.
Длительность анимации – отключаем, если телефон тормозит.
Эмуляция вторичных (дополнительных) экранов – показывает, как бы выглядел экран смартфона при другом разрешении. Обычно используется разработчиками мобильных приложений.
Минимальная ширина – можно изменить ширину экрана, чтобы на экране поместилось больше/меньше информации. При увеличении значения dpi шрифт уменьшается, а при уменьшении dpi – картинка и шрифт увеличиваются.
Вырез на экране | Симуляция выреза – позволяет эмулировать разные вырезы/челки на экране.
Аппаратное ускорение отрисовки | визуализации
Большинство опций в этом разделе будут полезны только разработчикам и мастерам по ремонту. Простым пользователям они вообще не нужны.
- Включить 4x MSAA – в некоторых играх и анимационных сценах сглаживает картинку, делает ее более приятной на глаз. Быстро разряжает батарею.
- Отключить наложение | Аппаратное наложение – при запуске “тяжелого” приложения часть вычислительных задач перекладывается с центрального процессора (CPU) на графический процессор (GPU). Прирост производительности минимальный, быстрый разряд батареи.
- Имитация аномалии – для людей с нарушениями зрения, кто не различает красный/зеленый, синий/желтый цвета. Включает монохромный режим.
Мультимедиа
Пункт “Отключить передачу аудио” – отключает передачу звука на любое подключенное по USB устройство (ЦАП, усилитель, наушники, звуковая карта, наушники Type-C).
Приложения
Следующие настройки связаны с работой приложений в телефоне. Вот самые полезные из них.
Не хранить Activity – полностью “убивает” запущенные в фоне приложения. Функция неоднозначная, и многие не советуют ее включать – могут быть проблемы с запуском и работой приложений.
Лимит фоновых процессов – сколько приложений могут работать в фоновом режиме, остальные “убиваются”. Не советую сокращать стандартный лимит, т.к. нужное вам приложение может быть принудительно закрыто системой.
Всегда показывать сообщения при сбое приложения | Отображение окна ошибки. Бесполезно для обычного пользователя. Только для тестировщиков.
Показывать все ANR – если приложение зависло, выводит сообщение “Приложение не отвечает”. Если пункт активен, сообщение выводится для всех приложений – запущенных и работающих в фоновом режиме.
Разрешить сохранение на внешние накопители – приложения и кэш можно устанавливать на карту памяти. Очень полезная настройка, когда в телефоне мало памяти.
Изменение размера в многооконном режиме – разрешает открытие окон произвольной формы. Бесполезная сейчас опция.
Ограничение доступа к SMS – доступ к звонкам и сообщениям будут иметь только приложения по умолчанию (Контакты и Вызовы), а все остальные приложения потеряют этот доступ, даже если вы сами им давали этот доступ ранее.
Подводя итоги, хочу сказать: будьте аккуратны с настройками в пункте Для разработчиков. Настраивайте именно те пункты меню, когда вы точно понимаете, за что они отвечают. Иначе придется делать сброс настроек до заводских в некоторых случаях, особенно при изменении разрешения или ширины экрана.
- Топ 5 особенностей Android 8.1 для разработчиков
- Android 9 Pie: новые настройки, функции и дизайн
- Какой защищенный телефон на Андроид выбрать? Меню рекавери
- Как войти в инженерное меню Android
- Инженерное меню Xiaomi
Все о возможностях разработчика вашего телефона

В настройках вашего телефона скрыты (по умолчанию они скрыты ) настройки, используемые для отладки и разработки приложений. В то время как у многих из нас есть возможность переключиться на выполнение ART или включить отладку по USB, существует длинный список опций. Хотя большинство из нас никогда не будут их использовать, всегда приятно знать, что происходит под капотом вашего телефона.
Давайте посмотрим на них и посмотрим, не сможем ли мы расшифровать некоторые из этих настроек, чтобы у всех нас было лучшее понимание того, что происходит, когда вы нажимаете на них. Давай, ты их нажал …
«Разблокировка» настроек параметров разработчика

Как мы уже упоминали, параметры разработчика на вашем телефоне по умолчанию скрыты. Это на самом деле имеет большой смысл, потому что их легко «показать», и большинству людей практически не нужно использовать какой-либо из них. Но все, кто читает это, немного более продвинуты, чем большинство людей, просто потому, что вы читаете сайт энтузиастов Android.
Разблокировать их легко-peasy. Откройте настройки на вашем телефоне и найдите раздел «О программе». Просматривайте его, пока не увидите запись «Номер сборки». Нажмите, если пять раз подряд, и вы увидите небольшой диалог, сообщающий, что вы теперь разработчик. Старайся не ломать вещи, ммк? Или все сломать — в любом случае это хорошо! Действительно, некоторые из этих настроек могут сделать ваш телефон действительно очень плохим.
Давайте посмотрим на них и выясним, почему.
Настройки

- Взять отчет об ошибках: при нажатии этой опции вы получаете текущие файлы журналов на вашем устройстве, упаковывает их в пакеты и подготавливает их для отправки, кому бы вы ни хотели. Это займет минуту или две после того, как вы нажмете на него, и вы увидите уведомление, как только оно будет готово. Нажмите на это уведомление, чтобы отправить его в путь. Проведите пальцем, чтобы отменить.
- Пароль резервного копирования рабочего стола: вы можете использовать ADB для резервного копирования и восстановления таких вещей, как приложения и связанные с ними данные, на ваш компьютер и с него. Эта опция заставляет пароль для этих резервных копий, и они не могут быть восстановлены без этого пароля.
- Бодрствовать: если этот флажок установлен, экран вашего телефона будет оставаться включенным в любое время и каждый раз, когда он подключен. Это работает с настенным зарядным устройством или USB-портом вашего компьютера и является отличным способом записи изображений в свой компьютер. экран. Не используйте этот, если вам не нужно!
- Выберите время выполнения: здесь (на данный момент) вы решили использовать Dalvik или ART. ART все еще экспериментален, и сейчас у нас нет того, что в конечном итоге будет выпущено в Android L. Некоторым телефонам действительно не нравится текущий предварительный просмотр среды выполнения ART, поэтому обратитесь к форуму для вашего конкретного устройства, прежде чем идти туда.
- Включить журнал отслеживания Bluetooth HCI. Иногда разработчику (или специалисту по безопасности) необходимо собирать и анализировать пакеты Bluetooth HCI (интерфейс пользователя контроллера). Включение этого позволит поместить их в файл в хранилище устройства (/sdcard/btsnoop_hci.log) для извлечения. Затем вы можете проанализировать их с помощью такой программы, как Wireshark.
- Статистика процессов: все, что вам когда-либо нужно было знать о запущенных процессах на вашем телефоне. Идите вперед и нажмите его, затем нажмите одну из записей. Для непрофессионала это просто много цифр, но для разработчика, отлаживающего его или ее приложение, эта информация может спасти день.
- Отладка поUSB: это то, что позволяет вашему телефону обмениваться данными через USB-порт компьютера через Android Debug Bridge (ADB). Вы должны включить это, чтобы использовать такие вещи, как DDMS, или использовать команды ADB.
- Отмена авторизации отладки через USB. Когда вы впервые используете компьютер для отладки через USB, вы должны авторизовать его и настроить пару ключей. Этот параметр отменяет все это и заставляет вас сделать это снова.
- Отчеты об ошибках в меню питания: помещает параметр в меню, которое вы видите, когда нажимаете и удерживаете кнопку питания, чтобы собирать и отправлять отчет об ошибках (как показано выше). Очень удобно, если вы что-то тестируете.
- Разрешить фиктивные местоположения: этот параметр позволит вам вручную записывать информацию о местоположении, заставляя ваш телефон думать, что он действительно находится там, где его нет. Помимо обмана на foursquare, это полезно, если приложение использует информацию о местоположении.
- Выбрать приложение для отладки: этот параметр позволяет выбрать приложение для отладки. На самом деле вам не нужно подключать его к отладчику, но если вы это сделаете, это предотвратит появление сообщений об ошибках при остановке на точке останова. Если вы не понимаете, что это значит, вам никогда не понадобится использовать этот параметр, и, вероятно, нет. Он создан для использования с инструментами, используемыми разработчиками приложений, чтобы убедиться, что их приложение работает так, как задумано.
- Ожидание отладчика: этот параметр отображается серым цветом, если только вы не настроили приложение для отладки. При настройке и выборе просто запрещает запуск выбранного приложения до тех пор, пока не будет подключен отладчик. Большинству из нас это больше не нужно для отладки приложений.
- Проверка приложений через USB. Позволяет сканировать приложения Google, установленные вами через ADB, на наличие вредоносных действий. Это хорошая вещь.
- Показывать прикосновения: выберите этот параметр, чтобы увидеть визуальную подсказку на экране, когда и где было зарегистрировано прикосновение.
- Расположение указателя: этот параметр помещает информационную панель в верхней части экрана, сообщающую вам координаты экрана последнего места, к которому был прикоснут экран.
- Показывать обновления поверхности: делает края «оконной» вспышки, когда ее содержимое обновляется. Раздражает, как ад.
- Показать границы макета: отмечает края всех элементов в диалоговом окне, чтобы вы знали, где любое касание активирует их. Попробуйте это, затем быстро выключите его.
- Force RTL layout direction: принудительная ориентация экрана для поддержки языка справа налево.
- Масштаб анимации окна: устанавливает скорость воспроизведения анимации окна. Чем ниже число, тем быстрее.
- Масштаб анимации перехода: задает скорость воспроизведения анимации перехода. Опять ниже, тем быстрее.
- Имитация вторичных дисплеев: этот параметр позволяет разработчикам имитировать экран разных размеров. Это довольно шатко.
- Принудительный рендеринг с помощью графического процессора: заставляет приложения использовать аппаратный 2D-рендеринг, если они были написаны, чтобы не использовать его по умолчанию. Иногда это делает чудеса. В других случаях все идет к черту. Будьте осторожны здесь.
- Показывать обновления представлений графического процессора: с этим параметром любое представление, отображаемое на оборудовании графического процессора, получает красное наложение.
- Показать обновления аппаратного уровня.Прочтите, что Romain Guy говорит об использовании аппаратных уровней для поддержки представлений ваших приложений . Этот параметр сообщит вам, когда обновятся эти слои.
- Отладка GPU overdraw: Overdraw происходит каждый раз, когда приложение просит систему нарисовать что-то поверх чего-то другого. Этот параметр позволяет увидеть, когда и где это происходит, чтобы вы знали, если это проблема.
- Force 4x MSAA: этот параметр активирует сглаживание нескольких образцов (MSAA). Как и любое другое компьютерное графическое оборудование, большее количество АА делает вещи лучше, но производительность поражает.
- Строгий режим включен: этот параметр мигает экран, когда приложение использует основной поток для выполнения долгих, интенсивных операций.
- Показывать использование процессора: помещает крошечное окно в верхнем правом углу экрана с информацией о процессоре и его использовании. Опрятный, чтобы играть с.
- Профиль GPU рендеринга: этот параметр может либо нарисовать график на экране, либо записать его в файл. График представляет собой визуальную визуализацию того, как тяжело работает графический процессор. Это еще один действительно изящный, чтобы попробовать.
- Включить трассировки OpenGL: этот параметр отслеживает ошибки OpenGL и помещает их в файл журнала, который вы выбрали при запуске. Ничего, что большинству пользователей когда-либо нужно будет трогать.
- Не сохранять действия: этот параметр уничтожает (как, например, принудительно закрывает все) любое приложение, как только вы покидаете основной вид. Ничего хорошего из этого не получится, независимо от того, что вы, возможно, слышали в Интернете.
- Предел фонового процесса: позволяет настраивать, сколько процессов может выполняться в фоновом режиме одновременно. С другим большинством из нас не стоит слишком часто возиться.
- Показать все ANR: этот параметр заставляет каждый процесс отображать диалоговое окно «Приложение не отвечает», если оно зависает — даже фоновые процессы, которые пользователь не запустил. Полезно, если одно приложение мешает другому.

Очевидно, что большинству из нас не понадобится большая часть этих настроек. Кроме того, попадание туда и постукивание по вещам ради постукивания может действительно привести к плохим вещам. Но всегда полезно знать, что можно сделать, даже если мы никогда не собираемся этого делать.
Надеюсь, это прояснит несколько вопросов об этих загадочных формулировках и настройках!
Расширения Bluetooth HCI, определенные корпорацией Майкрософт
Bluetooth Host-Controller Interface (HCI) указывает все взаимодействия между узлом и bluetooth-контроллером. Спецификации Bluetooth позволяют определяемым поставщиком командам и событиям HCI обеспечить нестандартное взаимодействие между узлами и контроллерами. Корпорация Майкрософт определяет команды и события HCI для конкретного поставщика, используемые Windows. Разработчики контроллеров Bluetooth могут использовать эти расширения для реализации специальных функций.
Требования
Команды Bluetooth HCI идентифицируются 16-разрядным кодом команды. Организация Bluetooth определяет значения в диапазоне 0x0000 по 0xFBFF. Поставщики определяют значения в диапазоне 0xFC00 по 0xFFFF, что позволяет использовать 1024 различных кодов команд, назначаемых поставщиком.
Поставщик должен выбрать значение кода команды, определенного Корпорацией Майкрософт. Корпорация Майкрософт не может выбрать код команды и предполагает, что ни один другой поставщик не использует этот код для конфликтующих целей. Небезопасно выполнять команду конкретного поставщика и зависеть от контроллера, чтобы отклонить команду, если он не понимает ее. Контроллер может интерпретировать команду как разрушительную операцию, например обновление встроенного ПО контроллера.
Поставщик должен передать выбранное значение с помощью метода, отличного от контроллера. Корпорация Майкрософт не указывает, как получить выбранный код.
Уведомление стека Bluetooth Windows о коде команды конкретного поставщика
Стек Windows Bluetooth считывает код команды конкретного поставщика из раздела VsMsftOpCode реестра .
Раздел VsMsftOpCode реестра имеет тип REG_DWORD, а данные ключа — это код операции конкретного поставщика.
Чтобы указать код операции для конкретного поставщика, используйте директиву AddReg в разделе DDInstall.HW в INF драйвера. Раздел добавления реестра должен содержать:
HKR,,"VsMsftOpCode",0x00010001,
[radio.NTamd64.HW] AddReg=radio.NTamd64.HW.AddReg [radio.NTamd64.HW.AddReg] HKR,,"VsMsftOpCode",0x00010001,
Команды HCI, определяемые корпорацией Майкрософт
| Команды HCI | Описание |
|---|---|
| HCI_VS_MSFT_Read_Supported_Features | Предоставляет растровое изображение, описывающее, какие функции, определенные корпорацией Майкрософт, поддерживает контроллер, и задает префикс для событий, определенных Корпорацией Майкрософт, которые возвращаются контроллером. |
| HCI_VS_MSFT_Monitor_Rssi | Запрашивает, чтобы контроллер начал мониторинг измеряемого RSSI канала для указанного соединения и создает событие, когда rssi измеренного канала подключения выходит за пределы указанных границ. |
| HCI_VS_MSFT_Cancel_Monitor_Rssi | Отменяет ранее выданную команду HCI_VS_MSFT_Monitor_Rssi . |
| HCI_VS_MSFT_LE_Monitor_Advertisement | Запрашивает, чтобы контроллер начал мониторинг объявлений, которые попадают в указанный диапазон RSSI и удовлетворяют другим требованиям. |
| HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement | Отменяет ранее выданную команду HCI_VS_MSFT_LE_Monitor_Advertisement . |
| HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable | Задает состояние фильтров объявлений. |
| HCI_VS_MSFT_Read_Absolute_RSSI | Считывает абсолютное значение RSSI для подключения BR/EDR с контроллера. |
Команда и подкоманды HCI, определяемые Корпорацией Майкрософт
Контроллер понимает, что существует только одна команда HCI майкрософт. Набор команд майкрософт расширяется с помощью кода операции. Первый параметр команды для команды HCI, определяемой Корпорацией Майкрософт, — это код операции, указывающий подкоманду.
Контроллеры должны поддерживать HCI_VS_MSFT_Read_Supported_Features , чтобы поддерживать любые другие подкоманды Microsoft HCI. Поддержка других команд необязательна и зависит от значений, возвращаемых HCI_VS_MSFT_Read_Supported_Features. Windows не отправляет подкоманды, определенные Корпорацией Майкрософт, если контроллер не указывает поддержку подкоманды через ответ на HCI_VS_MSFT_Read_Supported_Features.
HCI_VS_MSFT_Read_Supported_Features
HCI_VS_MSFT_Read_Supported_Features предоставляет растровое изображение, описывающее, какие функции, определенные корпорацией Майкрософт, поддерживает контроллер, и задает префикс для событий, определенных корпорацией Майкрософт, которые возвращаются контроллером.
Контроллер всегда должен быстро выполнять эту команду с событием Command Completed.
| Get-Help | Код | Параметры команд | Возвращаемые параметры |
|---|---|---|---|
| HCI_VS_MSFT_Read_Supported_Features | Выбранный базовый код | Subcommand_opcode | Статус Subcommand_opcode, Supported_features, Microsoft_event_prefix_length, Microsoft_event_prefix |
Command_parameters
Subcommand_opcode (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Код подкоманды для HCI_VS_MSFT_Read_Supported_Features. |
Return_parameters
Состояние (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Команда выполнена успешно. |
| 0x01 0xFF | Команда завершилась сбоем. Дополнительные сведения см. в разделе Коды ошибок в спецификации Bluetooth Core. |
Subcommand_opcode (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Код подкоманды для HCI_VS_MSFT_Read_Supported_Features. |
Supported_features (8 октетов):
| Значение | Описание параметра |
|---|---|
| 0x00000000 00000001 | Контроллер поддерживает функцию мониторинга RSSI для подключений BR/EDR. Кроме того, контроллер поддерживает HCI_VS_MSFT_Read_Absolute_RSSI для чтения абсолютной метрики RSSI подключения BR/EDR. |
| 0x00000000 00000002 | Контроллер поддерживает функцию мониторинга RSSI для подключений LE. |
| 0x00000000 00000004 | Контроллер поддерживает RSSI Мониторинг устаревших объявлений LE. |
| 0x00000000 00000008 | Контроллер поддерживает рекламный мониторинг устаревших объявлений LE. |
| 0x00000000 00000010 | Контроллер поддерживает проверку допустимости общедоступных координат X и Y на кривой во время безопасного простого связывания для P-192 и P-256. Дополнительные сведения см. в статье Bluetooth Core Specification Erratum 10734. |
| 0x00000000 00000020 | Контроллер поддерживает непрерывный рекламный мониторинг объявлений LE, выполняемых одновременно с другими действиями радиосвязи, используя HCI_VS_MSFT_LE_Monitor_Advertisement [v1]. |
| 0x00000000 00000040 | Зарезервировано. |
| 0x00000000 00000080 | Зарезервировано. |
| 0x00000000 00000100 | Зарезервировано. |
| 0x00000000 00000200 | Зарезервировано. |
| 0x00000000 00000400 | Контроллер поддерживает HCI_VS_MSFT_LE_Monitor_Advertisement [версия 2]. Кроме того, контроллер поддерживает непрерывный мониторинг рекламы LE, выполняемой одновременно с другими действиями радиосвязи, используя HCI_VS_MSFT_LE_Monitor_Advertisement [v2]. |
| 0xFFFFFFFF FFFFF800 | Биты, зарезервированные для будущего определения. Должен равняться нулю. |
Microsoft_event_prefix_length (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 0x20 | Число байтов в поле префикса события Майкрософт, указанное в возвращенном Microsoft_event_prefix. Это число байтов константной информации в начале каждого события HCI, указанного Корпорацией Майкрософт. |
Microsoft_event_prefix (переменная длина):
| Значение | Описание параметра |
|---|---|
| Значение префикса события | Константная информация, ожидаемая в начале каждого события, определенного Корпорацией Майкрософт. Эти сведения используются для отличия событий, определяемых корпорацией Майкрософт, от других пользовательских событий. |
HCI_VS_MSFT_Monitor_Rssi
HCI_VS_MSFT_Monitor_Rssi запрашивает, чтобы контроллер начал мониторинг измеряемого канала RSSI для указанного соединения и создает событие, когда rssi измеренного канала подключения выходит за пределы указанных границ.
| Get-Help | Код | Параметры команд | Возвращаемые параметры |
|---|---|---|---|
| HCI_VS_MSFT_Monitor_Rssi | Выбранный базовый код | Subcommand_opcode, Connection_Handle, RSSI_threshold_high, RSSI_threshold_low, RSSI_threshold_low_time_interval RSSI_sampling_period |
Статус Subcommand_opcode |
Контроллер должен уведомлять узел о значении RSSI с помощью периодически создаваемого события (на основе RSSI_sampling_period). Измеренный RSSI канала должен быть абсолютным значением силы сигнала приемника в dBm для соединения BR/EDR.
В ответ на команду HCI_VS_MSFT_Monitor_Rssi контроллер должен создать событие Command Complete с состоянием, равным нулю, если контроллер может начать мониторинг, или ненулевое состояние в противном случае. Если значение состояния не равно нулю, контроллер не должен создавать HCI_VS_MSFT_Rssi_Event в ответ на эту команду.
Контроллер должен отклонить команду, если другая команда HCI_VS_MSFT_Monitor_Rssi с тем же Connection_Handle не выполнена, или если указанный дескриптор подключения недопустим. Контроллер также может отклонить команду по другим причинам, таким как нехватка ресурсов.
На этой схеме состояния показаны состояния перехода на контроллере при мониторинге RSSI для подключения.

Контроллер должен создать HCI_VS_MSFT_Rssi_Event , если полученный RSSI больше или равен указанному RSSI_threshold_high. После создания этого события контроллер не должен создавать новый HCI_VS_MSFT_Rssi_Event , чтобы указать, что RSSI_threshold_high превышен до тех пор, пока не будет создано HCI_VS_MSFT_Rssi_Event , указывающее, что RSSI упал ниже RSSI_threshold_low.
Контроллер должен создать HCI_VS_MSFT_Rssi_Event , когда полученный RSSI равен заданному RSSI_threshold_low или падает ниже указанного RSSI_threshold_low_time_interval. После создания этого события контроллер не должен создавать новый HCI_VS_MSFT_Rssi_Event , чтобы указать, что RSSI упал ниже RSSI_threshold_low , пока не будет создано событие HCI_VS_MSFT_Rssi_Event , указывающее, что RSSI_threshold_high достигнут или превышен.
Если RSSI_sampling_period находится в диапазоне от 0x01 до 0xFE, контроллер должен периодически создавать HCI_VS_MSFT_Rssi_Event каждый RSSI_sampling_period. Это событие должно содержать среднее значение RSSI, вычисленное по RSSI_sampling_period. Если RSSI_sampling_period 0x00 или 0xFF, контроллер не должен периодически уведомлять узел HCI_VS_MSFT_Rssi_Event.
Command_parameters
Subcommand_opcode (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x01 | Код подкоманды для HCI_VS_MSFT_Monitor_Rssi. |
Connection_Handle (2 октета):
| Значение | Описание параметра |
|---|---|
| 0xXXXXX | Дескриптор подключения, rsSI которого необходимо отслеживать. |
RSSI_threshold_high (1 октет):
| Значение | Описание параметра |
|---|---|
| 0xXX | Максимальное ожидаемое значение RSSI. Контроллер создает событие, если наблюдаемый RSSI становится больше или равен этому значению. Единица измерения: dBm Диапазон BR/EDR: от -128 до 127 (целое число со знаком) Диапазон LE: от -127 до 20 (целое число со знаком) |
RSSI_threshold_low (1 октет):
| Значение | Описание параметра |
|---|---|
| 0xXX | Минимальное ожидаемое значение RSSI. Контроллер создает событие, если наблюдаемый RSSI становится меньше или равен этому значению. Единица измерения: dBm Обязательный диапазон BR/EDR: от -128 до 127 (целое число со знаком) Обязательный диапазон LE: от -127 до 20 (целое число со знаком) |
RSSI_threshold_low_time_interval (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Зарезервированное значение. |
| N = 0xXX | Время в секундах, в течение которого значение RSSI должно быть ниже RSSI_threshold_low до создания HCI_VS_MSFT_Rssi_Event . Период времени = N * 1 секунда Обязательный диапазон: 0x01 0x3C |
RSSI_sampling_period (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Зарезервированное значение. |
| N = 0xXX | Интервал выборки в миллисекундах. Период времени = N * 100 миллисекундах Обязательный диапазон: 0x01 0xFE |
| 0xFF | Зарезервированное значение. |
Return_parameters
Состояние (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Команда выполнена успешно. |
| 0x01 0xFF | Команда завершилась сбоем. Дополнительные сведения см. в разделе Коды ошибок в спецификации Bluetooth Core. |
| 0x07 | Контроллер должен вернуть превышение емкости памяти , если у него недостаточно памяти для обработки команды. |
| Код ошибки | Команда завершилась сбоем. Дополнительные сведения см. в разделе Коды ошибок в спецификации Bluetooth Core. |
Subcommand_opcode (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x01 | Код подкоманды для HCI_VS_MSFT_Monitor_Rssi. |
События создаются, если они не маскируются
Контроллер должен незамедлительно создать событие Command Complete при получении команды HCI_VS_MSFT_Monitor_Rssi . Если событие Command Complete возвращает состояние 0, контроллер должен создать HCI_VS_MSFT_Rssi_Event при возникновении одного из следующих условий.
- Наблюдаемое значение RSSI для устройства RSSI_threshold_low_time_interval становится равным или меньше указанного значения RSSI_threshold_low .
- Наблюдаемый RSSI для устройства становится больше или равен указанному RSSI_threshold_high значению.
- RSSI_sampling_period является допустимым и срок действия периода выборки истекает.
Контроллер должен выполнить всю необходимую очистку в случае потери подключения к указанному устройству. В этом случае HCI_VS_MSFT_Cancel_Monitor_Rssi команда не отправляется контроллеру.
HCI_VS_MSFT_Cancel_Monitor_Rssi
HCI_VS_MSFT_Cancel_Monitor_Rssi отменяет ранее выданную команду HCI_VS_MSFT_Monitor_Rssi . Контроллер должен незамедлительно создать событие Command Completed в ответ на эту команду.
| Get-Help | Код | Параметры команд | Возвращаемые параметры |
|---|---|---|---|
| HCI_VS_MSFT_Cancel_Monitor_Rssi | Выбранный базовый код | Subcommand_opcode, Connection_Handle |
Статус Subcommand_opcode |
Command_parameters
Subcommand_opcode (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x02 | Код подкоманды для HCI_VS_MSFT_Cancel_Monitor_Rssi. |
Connection_Handle (2 октета):
| Значение | Описание параметра |
|---|---|
| 0xXXXXX | Дескриптор для подключения, RSSI которого необходимо отменить. |
Return_parameters
Состояние (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Команда выполнена успешно. |
| 0x01 0xFF | Команда завершилась сбоем. Дополнительные сведения см. в разделе Коды ошибок в спецификации Bluetooth Core. |
Subcommand_opcode (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x02 | Код подкоманды для HCI_VS_MSFT_Cancel_Monitor_Rssi. |
События создаются, если они не маскируются
Контроллер должен создать событие Command Complete при получении команды HCI_VS_MSFT_Cancel_Monitor_RSSI .
HCI_VS_MSFT_LE_Monitor_Advertisement
HCI_VS_MSFT_LE_Monitor_Advertisement запрашивает, чтобы контроллер начал мониторинг объявлений, которые попадают в указанный диапазон RSSI, а также удовлетворяют одному из следующих условий:
- Указанный шаблон можно сопоставить с полученным пакетом объявления.
- Указанный UUID можно сопоставить с полученным пакетом объявления.
- Указанный ключ разрешения удостоверений (IRK) можно использовать для разрешения частного адреса устройства, с которого был получен рекламный пакет.
- Указанный адрес Bluetooth можно сопоставить с полученным пакетом объявления.
Команда версии 2 позволяет host сочетать некоторые из указанных выше условий с параметрами, определяющими источник объявления и цель направленной рекламы, чтобы дополнительно уточнить, какие объявления отслеживаются. Команда версии 2 также позволяет узлу фильтровать отслеживаемые объявления, за которые контроллер создает отчеты об объявлении.
| Get-Help | Код | Параметры команд | Возвращаемые параметры |
|---|---|---|---|
| HCI_VS_MSFT_LE_Monitor_Advertisement [версия 2] | Выбранный базовый код | Subcommand_opcode_v2, RSSI_threshold_high, RSSI_threshold_low, RSSI_threshold_low_time_interval, RSSI_sampling_period, Monitor_options, Advertisement_report_filtering_options, Peer_device_address, Peer_device_address_type, Peer_device_IRK, Condition_type, | Статус Subcommand_opcode, Monitor_Handle |
| HCI_VS_MSFT_LE_Monitor_Advertisement [версия 1] | Выбранный базовый код | Subcommand_opcode_v1, RSSI_threshold_high, RSSI_threshold_low, RSSI_threshold_low_time_interval, RSSI_sampling_period, Condition_type, | Статус Subcommand_opcode, Monitor_Handle |
Контроллер должен создать событие Command Complete в ответ на эту команду. Значение состояния должно быть равно нулю, если контроллер может начать мониторинг, или ненулевое состояние в противном случае. Если контроллер не поддерживает мониторинг RSSI для объявлений LE, он должен игнорировать значения параметров RSSI_threshold_high, RSSI_threshold_low, RSSI_threshold_low_time_interval и RSSI_sampling_period .
На этой схеме состояния показаны состояния перехода на контроллере при мониторинге RSSI для объявления.
Контроллер должен начать наблюдение за объявлением только в том случае, если полученный RSSI больше или равен RSSI_threshold_high для конкретного устройства и Monitor_options совпадения (см. ниже). Контроллер должен создать HCI_VS_MSFT_LE_Monitor_Device_Event с Monitor_state значением 1 и Monitor_handle установить дескриптор для этого условия, чтобы уведомить узел о том, что контроллер отслеживает это конкретное устройство для условия. Кроме того, контроллер должен распространять первый отчет о рекламе отслеживаемого объявления на хост только в том случае, если Advertisement_report_filter_options совпадают (см. ниже).
Monitor_options для фильтра считаются совпадением на основе следующей логики (в псевдокоде):
MatchesCondition = (PDU Matches Condition Parameters) IsAdvAMatch = ((Monitor_options bit 0 is set) && ((AdvA == Peer_device_address) && (TxAdd == Peer_device_address_type))) || ((Monitor_options bit 1 is set) && (AdvA resolvable with Peer_device_IRK)) IsDirectedAdvAMatch = (TargetA is permitted based on the Scanning Filter Policy) && (((Monitor_options bit 2 is set) && ((AdvA == Peer_device_address) && (TxAdd == Peer_device_address_type))) || ((Monitor_options bit 3 is set) && (AdvA resolvable with Peer_device_IRK))) IsDirectedTargetAMatch = (Monitor_options bit 4 is set) && (TargetA is permitted based on the Scanning Filter Policy) MonitorOptionsMatch = (MatchesCondition && IsAdvAMatch) || IsDirectedAdvAMatch || IsDirectedTargetAMatch || ((Monitor_options bit 5 is set) && MatchesCondition)
А для отслеживаемого объявления Advertisement_report_filter_options считаются совпадением на основе следующей логики (в псевдокоде):
IsDuplicateFilterSatisfied = (Advertisement_report_filter_options bit 0 is NOT set || PDU is not a duplicate) ShouldGenerateLegacyReport = (Advertisement_report_filter_options bit 1 is set) && (PDU is Legacy) && MonitorOptionsMatch ShouldGenerateExtendedReport = (Advertisement_report_filter_options bit 2 is set) && (PDU is Extended) && MonitorOptionsMatch ShouldGenerateDirectedReport = (Advertisement_report_filter_options bit 3 is set) && (PDU is Directed) && MonitorOptionsMatch AdvertisementReportFilterOptionsMatch = IsDuplicateFilterSatisfied && (ShouldGenerateLegacyReport || ShouldGenerateExtendedReport || ShouldGenerateDirectedReport)
Контроллер должен прекратить мониторинг условия, если RSSI полученных объявлений равен или опускается ниже RSSI_threshold_low по сравнению с RSSI_threshold_low_interval для конкретного устройства. Контроллер должен создать HCI_VS_MSFT_LE_Monitor_Device_Event с Monitor_state значением 0, чтобы уведомить узел о том, что контроллер перестал отслеживать конкретное устройство для условия. После того как контроллер укажет HCI_VS_MSFT_LE_Monitor_Device_Event с Monitor_state значением 0, контроллер не должен разрешать передачу дополнительных рекламных пакетов на узел для устройства, пока контроллер не уведомит узел о том, что RSSI для конкретного устройства поднялся до или выше RSSI_threshold_high для конкретного устройства для условия.
Кроме того, контроллер должен создать HCI_VS_MSFT_LE_Monitor_Device_Event с Monitor_state значение 0, чтобы уведомить узел о том, что контроллер прекратил мониторинг устройства для условия , если срок действия указанного RSSI_threshold_low_time_interval истекает без получения рекламных пакетов от устройства. Если контроллер отслеживает устройство для определенного состояния, выполняются следующие инструкции.
Если контроллер поддерживает мониторинг RSSI расширенных объявлений LE без выборки, контроллер должен распространять анонимные пакеты объявлений на узел, если значение RSSI для пакета больше или равно RSSI_threshold_high. Анонимные объявления не должны отслеживаться, и событие HCI_VS_MSFT_LE_Monitor_Device_Event не должно быть создано.
Если контроллер поддерживает rssi-мониторинг объявлений LE без выборки, он должен создать отчет об усеченной рекламе в случае, когда полученные фрагменты объявления совпадают, но когда объявление не было успешно получено целиком.
Контроллер должен поддерживать не менее 30 одновременных Monitor_handles, как минимум 30 одновременно отслеживаемых устройств и как минимум 20 одновременных отслеживаемых повторяющихся объявлений. Контроллер также должен быть в состоянии выполнять непрерывное сканирование LE при 10% цикле работы.
Если в контроллере включено разрешение адресов и узел намерен отслеживать удаленное устройство с его IRK успешно сохранен в списке разрешения контроллера, узел должен предоставить параметры Peer_Identity_Address и Peer_Identity_Address_Type из записи разрешающего списка удаленного устройства в качестве параметров Peer_device_address и Peer_device_address_type. Соответственно.
| RSSI_sampling_period | Устаревшие объявления | Расширенные объявления (неанонимные) | Расширенные объявления (анонимные) |
|---|---|---|---|
| 0x00 | Контроллер должен распространить все полученные пакеты объявлений на узел для устройства для этого условия , если контроллер ранее не получил команду HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable с параметром Включить для 0x00. Контроллер должен распространить рекламный пакет на узел, даже если полученный RSSI меньше или равен RSSI_threshold_low если срок действия RSSI_threshold_low_time_interval не истек для конкретного устройства для этого условия. Значение RSSI этого пакета объявлений должно быть значением RSSI полученного объявления. | Если контроллер поддерживает rssi-мониторинг расширенных объявлений LE без выборки, поведение того же, что и в столбце Устаревшие объявления , за исключением того, что рекламный пакет определяется как все PKU в рекламной цепочке. | Если контроллер поддерживает rssi-мониторинг расширенных объявлений LE без выборки, контроллер должен распространять все полученные пакеты объявлений на узел для устройства в соответствии с этим условием , если контроллер ранее не получил команду HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable с параметром Включить для 0x00. |
| 0x01 для 0xFE | Контроллер должен распространять устаревшие пакеты объявлений на узел каждый указанный RSSI_sampling_period , если контроллер ранее не получил команду HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable с параметром Включить для 0x00. Значение RSSI, указанное для объявления, должно быть средним значением RSSI, полученным в течение этого интервала выборки. Если контроллер не получает пакет объявления в течение периода выборки, он не должен распространять объявление на узел. Вполне возможно, что RSSI_sampling_period меньше RSSI_threshold_low_time_interval и все объявления, полученные во время RSSI_sampling_period , имеют RSSI ниже RSSI_threshold_low. Контроллер по-прежнему должен распространять объявление со средним значением RSSI, полученным в течение этого интервала выборки. | Если контроллер поддерживает rssi-мониторинг расширенных объявлений LE без выборки, контроллер должен вести себя так, как если бы RSSI_sampling_period был 0x00. | Если контроллер поддерживает rssi-мониторинг расширенных объявлений LE без выборки, контроллер должен вести себя так, как если бы RSSI_sampling_period был 0x00. |
| 0xFF | Контроллер не должен разрешать передачу дополнительных пакетов объявления на узел устройства для условия , пока контроллер не уведомит узел о том, что RSSI конкретного устройства упал ниже RSSI_threshold_low для RSSI_threshold_low_time_interval для конкретного устройства для данного условия. Для этого уведомления создается HCI_VS_MSFT_LE_Monitor_Device_Event с Monitor_state значением 0. | Если контроллер поддерживает rssi-мониторинг расширенных объявлений LE без выборки, то такое же поведение, как в столбце Устаревшие объявления . | Если контроллер поддерживает rssi-мониторинг расширенных объявлений LE без выборки, контроллер должен вести себя так, как если бы RSSI_sampling_period был 0x00. |
Если контроллер ранее получил команду HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable с параметром Enable для 0x00, таймер периода выборки не будет остановлен. Дополнительные сведения см. в разделе Пример. HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable фильтров с периодом выборки. Если контроллер получает неуплицированные рекламные пакеты от одного устройства, он должен соответствовать каждому пакету объявления с условиями, хранящимися на контроллере.
Если контроллер получает от устройства пакет объявления, соответствующий нескольким условиям, контроллер должен создать HCI_VS_MSFT_LE_Monitor_Device_Event для каждого соответствующего условия , при этом Monitor_handle задано соответствующее условие .
Если контроллер не может отслеживать значения RSSI для всех устройств в диапазоне, соответствующих условию, он продолжает отслеживать как можно больше устройств. Решение о том, какие устройства следует отслеживать, будет зависеть от значений RSSI полученных объявлений. Контроллер должен отслеживать устройства с большей силой полученного сигнала.
Если контроллер уведомил узел об определенном устройстве (A) и отслеживает устройства с максимальной аппаратной емкостью, а другое устройство (B) попадает в диапазон с более высоким значением RSSI, контроллер должен уведомить узел о том, что он прекратил мониторинг устройства (A), создав HCI_VS_MSFT_LE_Monitor_Device_Event с Monitor_state значение 0. Контроллер также должен создать HCI_VS_MSFT_LE_Monitor_Device_Event с Monitor_state значением 1, чтобы уведомить узел о том, что устройство (B) в настоящее время отслеживается.
Тип условия и параметры условия
Параметр Condition_type указывает, указывает ли параметр Condition шаблон, UUID, IRK или BD_ADDR.
Если параметр Condition_type указывает шаблон, условие содержит два раздела, которые содержат количество шаблонов, присутствующих в условии, и данные шаблона.

Число шаблонов указывает количество шаблонов, которые должны быть сопоставлены.
Данные шаблона имеют следующий формат.
- Length указывает длину этого шаблона, включая тип данных и начальный байт шаблона.
- Тип AD указывает поле Тип AD.
- Start of Pattern указывает начальную позицию байтов шаблона сразу после типа AD.
- Шаблон имеет размер (Длина — 0x2) и является шаблоном, который должен соответствовать указанному типу AD в пакете объявления из указанного начального байта.
Если указано несколько шаблонов, контроллер должен убедиться, что по крайней мере один шаблон соответствует полученному объявлению.
Если контроллер поддерживает мониторинг RSSI расширенных объявлений LE без выборки:
- Контроллер должен искать шаблон в первых 251 октетах рекламных данных узла и может искать в любых оставшихся октетах рекламных данных узла. Если раздел AD выходит за рамки первых 251 октета рекламных данных узла, контроллер должен искать шаблон в части раздела AD, которая находится в первых 251 октете рекламных данных узла, и может искать в любых оставшихся октетах рекламных данных узла. Примечание. В зависимости от фрагментации рекламодателем первые 251 октет рекламных данных узла могут распространяться на AdvData нескольких рекламных PKU. Сканеры должны позаботиться о том, чтобы ограничить количество AuxPtrs, которые они следуют, чтобы избежать следовать за чрезмерно длинными цепочками PKU.
- Контролер должен отслеживать данные на основе адреса каждого устройства на основе каждого рекламного набора. Контроллер должен распространять HCI_VS_MSFT_LE_Monitor_Device_Event для каждого рекламного набора, соответствующего шаблону, даже если реклама поступает с того же адреса устройства.
Если параметр Condition_type указывает UUID, параметр Condition содержит тип UUID и UUID. Тип UUID указывает, является ли UUID 16-разрядным, 32-разрядным или 128-разрядным. Контроллер должен проанализировать UUID службы пакета объявления, чтобы проверка для указанного UUID. Если тип UUID определен как 0x01, контроллер должен проанализировать неполный список 16-разрядных идентификаторов UUID службы и полный список 16-разрядных идентификаторов UUID служб, указанных в типе AD Service UUID. Если тип UUID определен как 0x02, контроллер должен проанализировать неполный список 32-разрядных UUID служб и полный список 32-разрядных идентификаторов UUID, указанных в типе AD Service UUID. Если указанный тип UUID является 0x03, контроллер должен проанализировать неполный список 128-разрядных идентификаторов UUID службы и полный список 128-разрядных ЮИД службы, указанный в типе AD Service UUID.
Если контроллер поддерживает мониторинг RSSI расширенных объявлений LE без выборки:
- Контроллер должен искать UUID службы в первых 251 октетах рекламных данных узла и может искать в любых оставшихся октетах рекламных данных узла. Если раздел AD выходит за рамки первых 251 октета рекламных данных узла, контроллер должен искать UUID службы в части раздела AD, которая находится в первых 251 октетах рекламных данных узла, и может искать в любых оставшихся октетах рекламных данных узла. Примечание. На основе фрагментации рекламодателем первые 251 октет рекламных данных могут охватывать AdvData нескольких рекламных PKU. Сканеры должны позаботиться о том, чтобы ограничить количество AuxPtrs, которые они следуют, чтобы избежать следовать за чрезмерно длинными цепочками PKU.
- Контролер должен отслеживать данные на основе адреса каждого устройства на основе каждого рекламного набора. Контроллер должен распространять HCI_VS_MSFT_LE_Monitor_Device_Event для каждого рекламного набора, соответствующего UUID службы, даже если объявление поступает с того же устройства.
Если параметр Condition_type указывает IRK, параметр Condition содержит IRK.
Если параметр Condition_type указывает адрес Bluetooth, параметр Condition содержит тип адреса и BD_ADDR.
Контроллер должен продолжать мониторинг на основе условий, даже если сканирование (активное или пассивное) включено. Если активное сканирование включено, ответ сканирования для объявления, соответствующего фильтру, должен распространяться на узел.
Если контроллер получает команду HCI_VS_MSFT_LE_Monitor_Advertisement при отключении фильтров (из-за ранее полученной команды HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable с параметром Enable для 0x00), контроллер должен принять команду, если это возможно, но присвоить ей отключенное состояние. Контроллер также может отклонить команду по другим причинам, таким как нехватка ресурсов.
Если все биты Monitor_options ясны, контроллер должен вернуть код ошибки Invalid HCI Command Parameters (0x12).
Если задан бит 1 или 3 Monitor_options и для Peer_device_IRK задан недопустимый IRK или ни один из битов Monitor_options не задан, контроллер должен вернуть код ошибки Недопустимые командные параметры HCI (0x12).
Если задан бит 0 или бит 1 или бит 2 или 3 Monitor_options и Condition_type задано значение 0x03 или 0x04, контроллер должен вернуть код ошибки Invalid HCI Command Parameters (0x12).
Если задан бит 0 Advertisement_report_filter_options и RSSI_sampling_period имеет любое значение, отличное от 0x00, контроллер должен вернуть код ошибки Недопустимые параметры команды HCI (0x12).
Отсутствующие параметры
При выполнении версии этой команды, которая не включает все параметры, следует использовать следующее:
| Параметр | Значение |
|---|---|
| Monitor_options | Набор бита 5; все остальные биты очищены |
| Advertisement_report_filter_options | Набор битов 1 и 2; все остальные биты очищены |
| Peer_device_IRK | 0x0000000000000000 00000000000000000 |
| Peer_device_address | 0x000000000000 |
| Peer_device_address_type | 0x00 |
Command_parameters
Subcommand_opcode_v1 (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x03 | Код подкоманды для HCI_VS_MSFT_LE_Monitor_Advertisement [v1]. |
Subcommand_opcode_v2 (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x0F | Код подкоманды для HCI_VS_MSFT_LE_Monitor_Advertisement [v2]. |
RSSI_threshold_high (1 октет):
| Значение | Описание параметра |
|---|---|
| 0xXX | Максимальное ожидаемое значение RSSI. Контроллер создает событие, если наблюдаемый RSSI становится больше или равен этому значению. Единица измерения: dBm Обязательный диапазон: от -127 до 20 (целое число со знаком) |
RSSI_threshold_low (1 октет):
| Значение | Описание параметра |
|---|---|
| 0xXX | Минимальное ожидаемое значение RSSI. Контроллер создает событие, если наблюдаемый RSSI становится меньше или равен этому значению. Единица измерения: dBm Обязательный диапазон: от -127 до 20 (целое число со знаком) |
RSSI_threshold_low_time_interval (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Зарезервированное значение. |
| N = 0xXX | Время в секундах, в течение которого значение RSSI должно быть ниже RSSI_threshold_low до создания HCI_VS_MSFT_Rssi_Event Период времени = N * 1 секунда Обязательный диапазон: 0x01 0x3C. |
RSSI_sampling_period (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Контроллер должен распространить все полученные объявления на узел. |
| N = 0xXX | Интервал выборки в миллисекундах. Период времени = N * 100 миллисекундах. Обязательный диапазон: 0x01 0xFE |
| 0xFF | Контроллер не должен распространять полученные объявления на узел. |
Monitor_options (1 октет):
| Битовое число | Описание параметра |
|---|---|
| 0 | Контроллер должен отслеживать рекламные PKU, если AdvA или его разрешенный адрес удостоверения соответствуют Peer_device_address и Peer_device_address_type и где TargetA отсутствует, или, если она присутствует, TargetA разрешена на основе политики фильтрации сканирования, если эти PKU соответствуют условию, указанному в Condition_Type. |
| 1 | Контроллер должен отслеживать рекламные PKU, когда AdvA разрешается с помощью Peer_device_IRK и где TargetA отсутствует, или, если она присутствует, TargetA разрешена на основе политики фильтрации сканирования, если эти PKU соответствуют условию, указанному в Condition_Type. Этот бит не устанавливается, если в контроллере используется конфиденциальность уровня ссылок. |
| 2 | Контроллер должен отслеживать перенаправленные рекламные PKU, где targetA разрешено на основе политики фильтрации сканирования и где AdvA или ее разрешенный адрес удостоверения соответствует Peer_device_address и Peer_device_address_type. Это зависит от того, соответствует ли PDU условию, указанному в Condition_Type. |
| 3 | Контроллер должен отслеживать перенаправленные рекламные PKU, где targetA разрешено на основе политики фильтрации сканирования и где AdvA разрешается с помощью Peer_device_IRK. Это зависит от того, соответствует ли PDU условию, указанному в Condition_Type. Этот бит не устанавливается, если в контроллере используется конфиденциальность уровня ссылок. |
| 4 | Контроллер должен отслеживать перенаправленные рекламные PKU, где targetA разрешена на основе политики фильтрации сканирования, независимо от значения Peer_device_address и Peer_device_address_type или Peer_device_IRK, а также независимо от того, соответствует ли PDU условию, указанному в Condition_Type. |
| 5 | Контроллер должен отслеживать рекламные PKU из любой advA, где targetA отсутствует, или, если она присутствует, TargetA разрешена на основе политики фильтрации сканирования, если эти PKU соответствуют условию, указанному в Condition_Type. |
| Все остальные биты | Зарезервировано для использования в будущем. |
Advertisement_report_filtering_options (1 октет):
| Битовое число | Описание параметра |
|---|---|
| 0 | Фильтрация повторяющихся рекламных PKU. Этот бит устанавливается, только если RSSI_sampling_period 0x00. |
| 1 | Контроллер должен создавать события HCI_LE_Advertising_Report, события HCI_LE_Directed_Advertising_Report или события HCI_LE_Extended_Advertising_Report для устаревших рекламных PKU, если эти PKU соответствуют указанному Monitor_options. |
| 2 | Контроллер должен создавать события HCI_LE_Extended_Advertising_Report для расширенных рекламных PKU, если эти PKU соответствуют указанному Monitor_options. |
| 3 | Контроллер должен создавать события HCI_LE_Advertising_Report, события HCI_LE_Directed_Advertising_Report или события HCI_LE_Extended_Advertising_Report для PKU направленной рекламы, если эти PKU соответствуют указанному Monitor_options. |
| Все остальные биты | Зарезервировано для использования в будущем. |
Peer_device_address (6 октетов):
| Значение | Описание параметра |
|---|---|
| 0xXXXXXXXXXXXXXX | Общедоступный адрес устройства или случайный адрес устройства для сопоставления. |
Peer_device_address_type (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Общедоступный адрес устройства |
| 0x01 | Случайный адрес устройства |
| Все остальные значения | Зарезервировано для использования в будущем. |
Peer_device_IRK (16 октетов):
| Значение | Описание параметра |
|---|---|
| 0x0000000000000000 00000000000000000 | Недопустимый IRK. Не должно быть значением, если задан Monitor_options бит 1 или задан Monitor_options бит 3. |
| 0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | IRK соответствующего устройства. Peer_device_address и Peer_device_address_type должны быть заполнены. |
Condition_type (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x01 | Условие — это шаблон, который должен соответствовать объявлению. |
| 0x02 | Условие — тип UUID и UUID. |
| 0x03 | Условием является разрешение IRK. Исключается, если задан какой-либо из Monitor_options битов 0, 1, 2 или 3. |
| 0x04 | Условие — тип и bluetooth-адрес. Исключается, если задан какой-либо из Monitor_options битов 0, 1, 2 или 3. |
Условие. Применимые поля условия зависят от значения Condition_type. Дополнительные сведения см. в разделе параметры Condition_type и условия.
Number_of_patterns (1 октет):
| Значение | Описание параметра |
|---|---|
| 0xXX | Количество шаблонов, указанных в параметре Pattern_data. |
Pattern_data (>3 октета):
| Значение | Описание параметра |
|---|---|
| Длина | Длина этого шаблона. |
| Тип данных | Тип данных раздела объявления. Значения перечислены в документе Назначенные номера Bluetooth. |
| Начальный байт | Начальная позиция шаблона, соответствующего указанному типу данных. |
| Шаблон | Шаблон для сопоставления (размер длины — 0x2 байтов). |
UUID_type (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x01 | UUID — это 16-разрядная служба. |
| 0x02 | UUID — это 32-разрядная служба. |
| 0x03 | UUID является 128-разрядной службой. |
UUID (2, 4 или 16 октетов):
| Значение | Описание параметра |
|---|---|
| 0xXXXXX | 2 байта, если UUID_type 0x01. 4 байта, если UUID_type 0x02. 16 байт, если UUID_type 0x03. |
| Значение | Описание параметра |
|---|---|
| 0XXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX | IRK, используемый для разрешения частного адреса. |
Address_type (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Общедоступный адрес устройства. |
| 0x01 | Случайный адрес устройства. |
| 0x02 0xFF | Зарезервированные значения для использования в будущем. |
BD_ADDR (6 октетов):
| Значение | Описание параметра |
|---|---|
| 0xXXXXXXXXXXXXXX | Bluetooth-адрес отслеживаемого устройства. |
Return_parameters
Состояние (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Команда выполнена успешно. |
| 0x07 | Контроллер должен возвращать превышение емкости памяти, если у него недостаточно памяти для обработки команды. |
| Код ошибки | Команда завершилась сбоем. Дополнительные сведения см. в разделе Коды ошибок в спецификации Bluetooth Core. |
Subcommand_opcode (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x03 или 0x0F | Код подкоманды для HCI_VS_MSFT_LE_Monitor_Advertisement [v1] или HCI_VS_MSFT_LE_Monitor_Advertisement [v2], в зависимости от того, какая команда была отправлена. |
Monitor_handle (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 0xFF | Дескриптор этого правила. Этот дескриптор используется в качестве параметра для HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement отмены мониторинга объявления. Этот параметр действителен, только если состояние 0x00. |
События создаются, если они не маскируются
При получении команды HCI_VS_MSFT_LE_Monitor_Advertisement контроллер должен создать событие Command Complete.
HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement
HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement отменяет ранее выданную команду HCI_VS_MSFT_LE_Monitor_Advertisement .
| Get-Help | Код | Параметры команд | Возвращаемые параметры |
|---|---|---|---|
| HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement | Выбранный базовый код | Subcommand_opcode, Monitor_handle |
Статус Subcommand_opcode |
Контроллер должен быстро создать событие Command Completed в ответ на эту команду.
Command_parameters
Subcommand_opcode (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x04 | Код подкоманды для HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement. |
Connection_Handle (1 октет):
| Значение | Описание параметра |
|---|---|
| 0xXX | Дескриптор отменяемого фильтра. |
Return_parameters
Состояние (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Команда выполнена успешно. |
| 0x07 | Контроллер должен возвращать превышение емкости памяти, если у него недостаточно памяти для обработки команды. |
| Код ошибки | Команда завершилась сбоем. Дополнительные сведения см. в разделе Коды ошибок в спецификации Bluetooth Core. |
Subcommand_opcode (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x04 | Код подкоманды для HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement. |
События создаются, если они не маскируются
Контроллер должен создать событие Command Complete при получении команды HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement .
HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable
HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable задает состояние фильтров объявлений.
| Get-Help | Код | Параметры команд | Возвращаемые параметры |
|---|---|---|---|
| HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable | Выбранный базовый код | Subcommand_opcode, Включить |
Статус Subcommand_opcode |
Если для параметра Enable задано значение 0x00, контроллер должен распространять полученные объявления на узел на основе существующих параметров списка принятия фильтра. Контроллер должен продолжить мониторинг устройств, которые в настоящее время отслеживаются, и создать HCI_VS_MSFT_LE_Monitor_Device_Event с Monitor_state значение 0, если устройство больше не отслеживается. Контроллер должен создать HCI_VS_MSFT_LE_Monitor_Device_Event с Monitor_state значение 1 при мониторинге нового устройства. Узел может выдавать HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable с параметром Enable задано значение 0x01 для повторного включения всех условий фильтра.
Если для параметра Enable задано значение 0x01, эта команда включает все фильтры, которые были заданы с помощью ранее выданной команды HCI_VS_MSFT_LE_Monitor_Advertisement . Контроллер должен отклонить команду HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable, если он не переключает состояние фильтра:
- Контроллер должен отклонить команду HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable с параметром Enable , для которой задано значение 0x01, если он ранее получал команду HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable с параметром Enable для 0x01.
- Контроллер должен отклонить команду HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable с параметром Enable , для которой задано значение 0x00, если ранее он получал команду HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable с параметром Enable для 0x00.
Фильтр объявлений по умолчанию отключен. Это состояние эквивалентно контроллеру, который ранее получал команду HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable с параметром Включить , для 0x00. Контроллер должен быстро создать событие Command Completed в ответ на эту команду.
Command_parameters
Subcommand_opcode (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x05 | Код подкоманды для HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable. |
Включить (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Вернитесь к текущему поведению фильтра принимать список, но продолжайте мониторинг устройств на основе команды Условиеиз HCI_VS_MSFT_LE_Monitor_Advertisement . |
| 0x01 | Включите все выданные HCI_VS_MSFT_LE_Monitor_Advertisement команды на контроллере. |
Return_parameter
Состояние (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Команда выполнена успешно. |
| 0x0C | Контроллер должен вернуть command Disallowed, если контроллер отклонил команду, так как ранее он видел команду HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable с параметром Enable , для которой задано то же значение, что и эта команда. |
| Код ошибки | Команда завершилась сбоем. Дополнительные сведения см. в разделе Коды ошибок в спецификации Bluetooth Core. |
Subcommand_opcode (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x05 | Код подкоманды для HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable. |
События создаются, если они не маскируются
Контроллер должен создать событие Command Complete при получении команды HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable .
HCI_VS_MSFT_Read_Absolute_RSSI
HCI_VS_MSFT_Read_Absolute_RSSI считывает абсолютное значение RSSI для подключения BR/EDR от контроллера.
| Get-Help | Код | Параметры команд | Возвращаемые параметры |
|---|---|---|---|
| HCI_VS_MSFT_Read_Absolute_RSSI | Выбранный базовый код | Subcommand_opcode, Connection_Handle |
Статус Subcommand_opcode, Connection_Handle, RSSI |
Дескриптор подключения предоставляется как команда, так и возвращаемый параметр для идентификации подключения ACL, rsSI которого считывается. Метрика RSSI — это абсолютная сила сигнала приемника в дБм до точности ± 6 дБ. Если RSSI не удается прочитать, для метрики RSSI должно быть задано значение 127. Контроллер всегда должен быстро выполнять эту команду с событием Command Completed.
Command_parameters
Subcommand_opcode (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x06 | Код подкоманды для HCI_VS_MSFT_Read_Absolute_RSSI. |
Connection_Handle (2 октета):
| Значение | Описание параметра |
|---|---|
| 0xXXXXX | Дескриптор для подключения BR/EDR, rsSI которого необходимо считывать. |
Return_parameters
Состояние (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Команда выполнена успешно. |
| 0x01 0xFF | Команда завершилась сбоем. Дополнительные сведения см. в разделе Коды ошибок в спецификации Bluetooth Core. |
Subcommand_opcode (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x06 | Код подкоманды для HCI_VS_MSFT_Read_Absolute_RSSI. |
Connection_Handle (2 октета):
| Значение | Описание параметра |
|---|---|
| 0xXXXXX | Дескриптор для подключения BR/EDR, rsSI которого был считан. |
| Значение | Описание параметра |
|---|---|
| N = 0xXX | Значение RSSI для подключения BR/EDR. Единица измерения: dBm Обязательный диапазон: от -128 до 127 (целое число со знаком) |
События создаются, если они не маскируются
Контроллер должен создать событие Command Complete после завершения команды HCI_VS_MSFT_Read_Absolute_RSSI .
События Bluetooth HCI, определенные корпорацией Майкрософт
Все события Bluetooth HCI, определенные корпорацией Майкрософт, являются событиями, определяемыми поставщиком, и используют код события 0xFF. Данные событий Майкрософт всегда начинаются с постоянной строки байтов, чтобы отличать события, определенные корпорацией Майкрософт, от других событий, определяемых поставщиком. Длина и значение строки константы определяются реализутелем контроллера и возвращаются в ответ на HCI_VS_MSFT_Read_Supported_Features.
| Событие HCI | Описание |
|---|---|
| HCI_VS_MSFT_Rssi_Event | HCI_VS_MSFT_RSSI_Event указывает, что команда HCI_VS_MSFT_Monitor_Rssi завершена. |
| HCI_VS_MSFT_LE_Monitor_Device_Event | HCI_VS_MSFT_LE_Monitor_Device_Event указывает, что контроллер запустил или остановил мониторинг устройства Bluetooth LE. |
HCI_VS_MSFT_RSSI_Event
HCI_VS_MSFT_RSSI_Event указывает, что команда HCI_VS_MSFT_Monitor_Rssi завершена. Если параметр Status равен нулю, команда завершается, так как значение RSSI для удаленного устройства изменилось на значение за пределами указанного диапазона. Если параметр Status не равен нулю, команда выполнена, так как значение RSSI подключения больше не может отслеживаться.
| Событие | Код события | Код события Майкрософт | Параметры события |
|---|---|---|---|
| HCI_VS_MSFT_RSSI_Event | 0xFF | 0x01 | Event_prefix, Microsoft_event_code, Статус Connection_Handle, RSSI |
Event_parameters
Event_prefix (переменный размер):
| Значение | Описание параметра |
|---|---|
| Префикс события | Префикс события, который помечает это событие как определенное корпорацией Майкрософт. Размер и значение возвращаются командой HCI_VS_MSFT_Read_Supported_Features . |
Microsoft_event_code (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x01 | Код события для HCI_VS_MSFT_RSSI_Event. |
Состояние (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Успешно. Значение RSSI подключения соответствует одному из следующих условий. RSSI достиг или превысил RSSI_threshold_high. RSSI достиг или упал ниже RSSI_threshold_low в течение RSSI_threshold_low_time_interval секунд. Срок действия RSSI_sampling_period истек, и это событие было создано для уведомления узла о значении RSSI. |
| 0x01 0xFF | Ошибка. Значение RSSI подключения больше не может отслеживаться. Код ошибки обычно является одним из кодов, описывающих, почему базовое подключение ACL было потеряно. |
Connection_Handle (2 октета):
| Значение | Описание параметра |
|---|---|
| 0xXXXXX | Дескриптор для подключения, rsSI которого требуется отслеживать. |
| Значение | Описание параметра |
|---|---|
| 0xXX | Измеренное значение RSSI канала для соединения. Единица измерения: dBm Диапазон BR/EDR: от -128 до 127 (целое число со знаком) Диапазон LE: от -127 до 20 (целое число со знаком) |
HCI_VS_MSFT_LE_Monitor_Device_Event
HCI_VS_MSFT_LE_Monitor_Device_Event указывает, что контроллер запустил или остановил мониторинг устройства Bluetooth LE.
Если значение параметра Monitor_state равно 1, контроллер начал мониторинг устройства Bluetooth с помощью указанного BD_ADDR. Если значение параметра Monitor_state равно 0, контроллер прекратил мониторинг устройства Bluetooth с указанным BD_ADDR.
| Событие | Код события | Код события Майкрософт | Параметры события |
|---|---|---|---|
| HCI_VS_MSFT_LE_Monitor_Device_Event | 0xFF | 0x02 | Event_prefix, Microsoft_event_code, Address_type, BD_ADDR, Monitor_handle, Monitor_state |
Контроллер не должен создавать HCI_VS_MSFT_LE_Monitor_Device_Event с параметром Monitor_state , равным 0, если он еще не создал HCI_VS_MSFT_LE_Monitor_Device_Event с Monitor_state значением 1.
Event_parameters
Event_prefix (переменный размер):
| Значение | Описание параметра |
|---|---|
| Префикс события | Префикс события, который помечает это событие как определенное корпорацией Майкрософт. Размер и значение возвращаются командой HCI_VS_MSFT_Read_Supported_Features . |
Microsoft_event_code (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x02 | Код события для HCI_VS_MSFT_LE_Monitor_Device_Event. |
Address_type (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Общедоступный адрес устройства. |
| 0x01 | Случайный адрес устройства. |
| 0x02 в 0xFF | Зарезервированные значения для использования в будущем. |
BD_ADDR (6 октетов):
| Значение | Описание параметра |
|---|---|
| 0xXXXXXXXXXXXXXX | Адрес Bluetooth устройства. |
Monitor_handle (1 октет):
| Значение | Описание параметра |
|---|---|
| 0xXX | Дескриптор фильтра, указанного для команды HCI_VS_MSFT_LE_Monitor_Advertisement . |
Monitor_state (1 октет):
| Значение | Описание параметра |
|---|---|
| 0x00 | Контроллер прекратил мониторинг устройства, указанного BD_ADDR и Monitor_handle. |
| 0x01 | Контроллер начал мониторинг устройства, указанного BD_ADDR и Monitor_handle. |
Приложение
В этом разделе приведены примеры и схемы расширения Bluetooth HCI, определенные корпорацией Майкрософт.
Пример. Сопоставление шаблонов для HCI_VS_MSFT_LE_Monitor_Advertisement
В этом примере показана полученная команда HCI_VS_MSFT_LE_Monitor_Advertisement и оценки трех разных пакетов объявлений с параметрами команды.
Получено HCI_VS_MSFT_LE_Monitor_Advertisement команда HCI_VS_MSFT_LE_Monitor_Advertisement , полученная контроллером и содержащая следующие параметры.
| Параметр | Значение | Примечания |
|---|---|---|
| Subcommand_opcode | 0x03 | Код подкоманды для HCI_VS_MSFT_LE_Monitor_Advertisement |
| RSSI_threshold_high | 0x01 | 1dB |
| RSSI_threshold_low | 0xCE | -50dB |
| RSSI_threshold_low_time_interval | 0x05 | 5 с |
| RSSI_sampling_period | 0xFF | Выборка отсутствует |
| Condition_type | 0x01 | Условие |
| Condition | 0x02 | Необходимо сопоставить два шаблона |
| 0x03 | Длина первого шаблона, включая тип AD и начальную позицию | |
| 0x01 | Тип AD | |
| 0x00 | Начальная позиция после типа AD | |
| 0x01 | Первый шаблон для сопоставления | |
| 0x06 | Длина второго шаблона, включая тип AD и начальную позицию | |
| 0xFF | Тип AD (данные конкретного производителя) | |
| 0x00 | Начальная позиция после типа AD | |
| 0x00 | Второй шаблон для сопоставления | |
| 0x06 | ||
| 0xFF | ||
| 0xFF |
Затем контроллер получает следующие пакеты объявлений.
- Пакет объявления [A] 0x02 0x01 0x01 0x07 0x09 0x54 0x61 0x62 0x6C 0x65 0x74 0x05 0xFF 0x00 0x06 0xFF 0xFF
- Пакет объявления [B] 0x02 0x01 0x01 0x07 0x09 0x54 0x61 0x62 0x6C 0x65 0x74 0x04 0xFF 0x00 0x06 0xFF
- Пакет объявления [C] 0x07 0x09 0x54 0x61 0x62 0x6C 0x65 0x74 0x05 0xFF 0x00 0x06 0xFF 0xFF
- Пакет объявления [D] 0x02 0x01 0x02 0x05 0xFF 0x00 0x06 0xFF 0x01
Оценка соответствия для пакета объявления [A]
| Описание | Значение |
|---|---|
| Ad Type of first pattern to be matched | 0x01 |
| Длина первого шаблона для сопоставления | 0x03 — 0x02 = 0x01 байт |
| Шаблон для сопоставления в позиции 0x00 для 0x01 типа AD | 0x01 |
| Байты в позиции 0x00 для 0x01 типа AD | 0x01 (MATCH!) |
| Ad Type of second pattern to be matched | 0xFF (данные производителя) |
| Длина второго шаблона для сопоставления | 0x06 — 0x02 = 0x04 байт |
| Шаблон, соответствующий 0x00 позиции для 0xFF типа AD | 0x00 0x06 0xFF 0xFF |
| Байты в позиции 0x00 для 0xFF типа AD | 0x00 0x06 0xFF 0xFF (MATCH!) |
Вердикт: PASS (оба шаблона совпадают)
Оценка соответствия для пакета объявлений [B]
| Описание | Значение |
|---|---|
| Ad Type of first pattern to be matched | 0x01 |
| Длина первого шаблона для сопоставления | 0x03 — 0x02 = 0x01 байт |
| Шаблон для сопоставления в позиции 0x00 для 0x01 типа AD | 0x01 |
| Байты в позиции 0x00 для 0x01 типа AD | 0x01 (MATCH!) |
| Ad Type of second pattern to be matched | 0xFF (данные производителя) |
| Длина второго шаблона для сопоставления | 0x06 — 0x02 = 0x04 байт |
| Шаблон, соответствующий 0x00 позиции для 0xFF типа AD | 0x00 0x06 0xFF 0xFF |
| Байты в позиции 0x00 для 0xFF типа AD | 0x00 0x06 0xFF (совпадений нет) |
Вердикт: PASS (только первые совпадения шаблонов)
Оценка соответствия для пакета объявлений [C]
| Описание | Значение |
|---|---|
| Ad Type of first pattern to be matched | 0x01 |
| Длина первого шаблона для сопоставления | 0x03 — 0x02 = 0x01 байт |
| Шаблон для сопоставления в позиции 0x00 для 0x01 типа AD | 0x01 |
| Байты в позиции 0x00 для 0x01 типа AD | Не определено. Объявление не содержит данных с типом AD 0x01. |
| Ad Type of second pattern to be matched | 0xFF (данные производителя) |
| Длина второго шаблона для сопоставления | 0x06 — 0x02 = 0x04 байт |
| Шаблон, соответствующий 0x00 позиции для 0xFF типа AD | 0x00 0x06 0xFF 0xFF |
| Байты в позиции 0x00 для 0xFF типа AD | 0x00 0x06 0xFF 0xFF (MATCH!) |
Вердикт: PASS (только совпадения второго шаблона)
Оценка соответствия для пакета объявления [D]
| Описание | Значение |
|---|---|
| Ad Type of first pattern to be matched | 0x01 |
| Длина первого шаблона для сопоставления | 0x03 — 0x02 = 0x01 байт |
| Шаблон для сопоставления в позиции 0x00 для 0x01 типа AD | 0x01 |
| Байты в позиции 0x00 для 0x01 типа AD | 0x02 (нет совпадений) |
| Ad Type of second pattern to be matched | 0xFF (данные производителя) |
| Длина второго шаблона для сопоставления | 0x06 — 0x02 = 0x04 байт |
| Шаблон, соответствующий 0x00 позиции для 0xFF типа AD | 0x00 0x06 0xFF 0xFF |
| Байты в позиции 0x00 для 0xFF типа AD | 0x00 0x06 0xFF 0x01 (совпадений нет) |
Вердикт: FAIL (ни шаблон не совпадает)
Пример. Мониторинг рекламы
В этом примере показан мониторинг рекламы RSSI. Ниже приведены значения RSSI для полученных объявлений, соответствующих указанному условию.
| Время (с) | RSSI (дБ) |
|---|---|
| 1 | –100 |
| 2 | –90 |
| 3 | -5 |
| 4 | -15 |
| 5 | –30 |
| 6 | -15 |
| 7 | -45 |
| 8 | –20 |
| 9 | –35 |
| 10 | -45 |
| 11 | -70 |
| 12 | -85 |
| 13 | -85 |
| 14 | -85 |
| 15 | –90 |
| 16 | –90 |
| 17 | -70 |
| Параметр | Значение |
|---|---|
| RSSI_threshold_high | -10dB |
| RSSI_threshold_low | -80dB |
| RSSI_threshold_low_time_interval | 3 секунды |
| RSSI_sampling_period | 2 секунды |

Объявление RSSI больше RSSI_threshold_high в момент времени 3. Периодический таймер для выборки начинается с момента 3. Каждые 2 секунды истекает срок действия периодического таймера, а среднее значение RSSI полученного объявления распространяется на стек.
Когда срок действия периодического таймера истечет в 5, среднее значение RSSIS объявления, полученное за это время (-23dB), распространяется на стек.
Когда срок действия периодического таймера истечет в 13, среднее число RSSIS объявления, полученных в течение этого периода времени, будет ниже RSSI_threshold_low (-80dB). Среднее значение RSSI объявления (-85 дБ) должно быть распространено на узел.
Когда RSSI_threshold_low_time_interval истекает в 15 лет, на узел распространяется объявление с RSSI -85dB. В этом примере на узел больше не отправляются объявления.
Пример. Мониторинг объявлений BAP с устройства
Хотя узел связан с приемчиком CAP, но не подключен, он может отслеживать объявления BAP с этого устройства.
| Параметр | Значение |
|---|---|
| Subcommand_opcode_v2 | 0x0F |
| RSSI_threshold_high | -127 |
| RSSI_threshold_low | -127 |
| RSSI_threshold_low_time_interval | 0x05 |
| RSSI_sampling_period | 0x00 |
| Monitor_options | Набор бита 0; Бит 1 задан, если устройство распространяет IRK |
| Advertisement_report_filtering_options | Набор битов 0, 1 и 2 |
| Peer_device_address | |
| Peer_device_address_type | |
| Peer_device_IRK | |
| Condition_type | 0x01 |
| Number_of_patterns | 0x01 |
| Pattern_data | 0x04 (длина) 0x16 (данные службы — 16-разрядный UUID) 0x00 (начальный байт) 0x4E (низкий байт ASCS UUID) 0x18 (высокий байт ASCS UUID) |
Пример. Мониторинг объявлений CAP с устройства
Хотя он связан с командором CAP, но не подключен, узел может отслеживать объявления CAP с этого устройства.
| Параметр | Значение |
|---|---|
| Subcommand_opcode_v2 | 0x0F |
| RSSI_threshold_high | -127 |
| RSSI_threshold_low | -127 |
| RSSI_threshold_low_time_interval | 0x05 |
| RSSI_sampling_period | 0x00 |
| Monitor_options | Набор бита 0; Бит 1 устанавливается, если устройство распространяет IRK |
| Advertisement_report_filtering_options | Набор битов 0, 1 и 2 |
| Peer_device_address | |
| Peer_device_address_type | |
| Peer_device_IRK | |
| Condition_type | 0x01 |
| Number_of_patterns | 0x01 |
| Pattern_data | 0x04 (длина) 0x16 (данные службы — 16-разрядный UUID) 0x00 (начальный байт) 0x53 (низкий байт cas UUID) 0x18 (высокий байт cas UUID) |
Блок-схема: фильтрация списка объявлений и фильтров
На этой блок-схеме приведен пример реализации контроллера фильтрации рекламы и фильтрации списка принятия при получении объявления.
Контроллер может реализовать эту логику по-разному, если узел получает уведомление о объявлении или HCI_VS_MSFT_LE_Monitor_Device_Event , как указано в блок-схеме.

Схема последовательностей: распространение ответа сканирования, связанного с объявлением
Схема последовательностей: распространение ответа сканирования, связанного с объявлением
На этой схеме последовательностей показан ответ распространения сканирования, связанный с объявлением, удовлетворяющим фильтру объявлений при включенном активном сканировании. На этой схеме показана только ожидаемая последовательность событий между контроллером и узлом, а также не события между контроллером и конкретным устройством. Предположим, что есть объявление A , удовлетворяющее фильтру рекламы, и объявление B , которое не удовлетворяет фильтру объявлений.

Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Windows driver documentation