Bluetooth SPP UUID: что это такое и как использовать идентификатор последовательного порта

Если при подключении Arduino-модуля HC-05 или HC-06 к смартфону вы видите в логах строку 00001101-0000-1000-8000-00805F9B34FB — это не ошибка и не случайный набор символов, а стандартный UUID профиля SPP (Serial Port Profile), по которому устройства договариваются о передаче данных как по обычному COM-порту. Именно этот идентификатор чаще всего ищут разработчики, когда приложение не может установить соединение с Bluetooth-модулем.

В этой статье разберём, что означает SPP UUID, из чего состоит 128-битный идентификатор, где он применяется на практике и какие типичные ошибки возникают при работе с ним в Android-приложениях и DIY-проектах на микроконтроллерах.

Что такое UUID в Bluetooth и зачем он нужен

UUID (Universally Unique Identifier) в контексте Bluetooth — это 128-битный идентификатор сервиса, который устройство публикует при обнаружении. Когда два устройства встречаются, они сверяют UUID, чтобы понять, какие профили поддерживает каждая сторона: гарнитуру, клавиатуру, передачу файлов или последовательный порт.

Без совпадения UUID соединение либо не установится, либо установится «не на тот» профиль — и данные просто не пойдут. Поэтому идентификатор выступает своего рода «номером двери», в которую нужно постучаться, чтобы получить конкретный сервис.

Bluetooth SIG закрепила за стандартными профилями короткие 16-битные номера, а полный 128-битный вид получается подстановкой в базовый шаблон: 0000XXXX-0000-1000-8000-00805F9B34FB, где XXXX — номер сервиса.

Расшифровка SPP UUID 00001101

Профиль SPP имеет зарегистрированный номер 0x1101. Подставив его в базовый шаблон, получаем знаменитую строку 00001101-0000-1000-8000-00805F9B34FB — именно её вы увидите в коде большинства примеров для Android, Arduino и ESP32.

КомпонентЗначениеНазначение
Короткий номер0x1101Идентификатор сервиса Serial Port
Полный UUID00001101-0000-1000-8000-00805F9B34FB128-битная форма для API
ТранспортRFCOMMКанал эмуляции последовательного порта
Тип устройстваBluetooth Classic (BR/EDR)Не относится к BLE

Поверх SPP работает протокол RFCOMM, который эмулирует поведение RS-232: поток байтов передаётся так, будто устройства соединены кабелем. Именно поэтому SPP стал стандартом де-факто для обмена данными с датчиками, принтерами и модулями вроде HC-05.

Где применяется SPP на практике

Профиль последовательного порта встречается чаще, чем кажется. Вот типичные сценарии:

  • 🔧 DIY-электроника: модули HC-05, HC-06, JDY-31 для связи Arduino и ESP32 со смартфоном.
  • 🖨️ Периферия: портативные термопринтеры чеков и сканеры штрих-кодов.
  • 🚗 Автодиагностика: адаптеры ELM327 для чтения ошибок через OBD-II.
  • 📟 Промышленное оборудование: настройка контроллеров и датчиков без кабеля.

Во всех этих случаях приложение открывает RFCOMM-канал по UUID 0x1101 и дальше просто читает и пишет байты, как в терминале COM-порта.

📊 Где вы столкнулись с SPP UUID?
В проекте на Arduino/ESP32
При подключении ELM327
В разработке Android-приложения
Просто изучаю Bluetooth

Как использовать SPP UUID в Android-приложении

В Android соединение создаётся через метод createRfcommSocketToServiceRecord(), куда передаётся объект UUID. Типовой фрагмент кода выглядит так:

UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

BluetoothSocket socket = device.createRfcommSocketToServiceRecord(SPP_UUID);

socket.connect();

Порядок действий при отладке соединения:

☑️ Проверка SPP-подключения

Выполнено: 0 / 5

⚠️ Внимание: начиная с Android 12 для работы с Bluetooth требуются runtime-разрешения BLUETOOTH_CONNECT и BLUETOOTH_SCAN. Без них вызов connect() будет завершаться ошибкой даже при правильном UUID. Сверяйтесь с документацией под вашу версию SDK.

Если соединение не устанавливается, возможная причина — модуль уже занят: большинство недорогих SPP-модулей держат только одно активное подключение. Разорвите предыдущую сессию и повторите попытку.

SPP и BLE: в чём разница

Частая путаница — попытка использовать UUID 0x1101 с BLE-устройством. Это не сработает: SPP относится к Bluetooth Classic, а в Bluetooth Low Energy профили заменены сервисами GATT с собственными UUID.

  • 📡 Bluetooth Classic + SPP: непрерывный поток байтов, выше энергопотребление, простая логика «открыл порт — пишешь данные».
  • 🔋 BLE + GATT: обмен короткими пакетами через характеристики, экономичнее, но требует описания сервисов.
  • 🔀 Эмуляция SPP поверх BLE: некоторые чипы (например, серия nRF52 с Nordic UART Service) используют собственные UUID, несовместимые с 0x1101.
Почему модуль HC-06 не виден в BLE-сканере

HC-05 и HC-06 — это модули Bluetooth Classic. Приложения, сканирующие только BLE-устройства, их не обнаружат. Ищите модуль через стандартное сопряжение в настройках смартфона или через BluetoothAdapter в классическом режиме.

Типичные ошибки при работе с SPP UUID

Разберём проблемы, которые чаще всего приводят разработчиков к поиску информации об этом идентификаторе.

Первая — опечатка в строке UUID. Достаточно перепутать один символ в длинной строке, и connect() будет выбрасывать IOException. Копируйте идентификатор из проверенного источника, а не набирайте вручную.

Вторая — использование createInsecureRfcommSocketToServiceRecord() там, где устройство требует аутентификацию, или наоборот. Если защищённое соединение отклоняется, попробуйте незащищённый вариант — некоторые модули не поддерживают шифрование канала.

⚠️ Внимание: незащищённый (insecure) RFCOMM-канал передаёт данные без шифрования. Не используйте его для паролей, токенов и персональных данных — только для отладки и нечувствительной телеметрии.

Третья — ожидание, что SPP сам «найдёт» устройство. UUID описывает сервис, а не адрес: сначала нужно сопряжение или знание MAC-адреса устройства, и только потом открытие канала по UUID.

⚠️ Внимание: не путайте UUID сервиса SPP с UUID, которые генерируют производители BLE-устройств для своих GATT-характеристик. Совпадения формата не означают совместимости — это разные механизмы.

Как проверить, что устройство поддерживает SPP

Самый надёжный способ — запросить список сервисов у сопряжённого устройства. В Android для этого служит метод getUuids() объекта BluetoothDevice, который возвращает массив опубликованных идентификаторов. Если среди них есть 00001101-..., модуль поддерживает последовательный порт.

На стороне ПК можно подключить модуль и посмотреть, появился ли в системе виртуальный COM-порт — его наличие после сопряжения косвенно подтверждает поддержку SPP. Точный путь просмотра зависит от операционной системы и версии Bluetooth-стека, поэтому сверяйтесь с документацией вашей ОС.

Часто задаваемые вопросы

Что означает UUID 00001101-0000-1000-8000-00805F9B34FB?

Это стандартный 128-битный идентификатор профиля Bluetooth SPP (Serial Port Profile). Короткая форма — 0x1101. Он указывает, что устройство предоставляет сервис виртуального последовательного порта поверх протокола RFCOMM.

Можно ли использовать SPP UUID с BLE-устройствами?

Нет. SPP — профиль Bluetooth Classic. BLE использует механизм GATT с другими UUID. Для обмена данными с BLE-модулями применяются сервисы вроде Nordic UART Service с собственными идентификаторами.

Почему connect() с правильным UUID выдаёт ошибку?

Возможные причины: модуль уже занят другим подключением, не выданы разрешения Bluetooth в Android 12+, устройство не сопряжено, либо требуется другой тип сокета (secure/insecure). Проверяйте эти пункты последовательно.

Нужно ли менять UUID в модуле HC-05?

Обычно нет — HC-05 по умолчанию публикует стандартный SPP UUID 0x1101, и все готовые библиотеки рассчитаны именно на него. Менять идентификатор имеет смысл только при разработке собственного профиля.

Чем SPP отличается от обычного COM-порта?

С точки зрения приложения — почти ничем: тот же поток байтов. Разница в транспорте: данные идут по радиоканалу Bluetooth через протокол RFCOMM, который эмулирует поведение последовательного интерфейса RS-232.