Если при подключении 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 |
| Полный UUID | 00001101-0000-1000-8000-00805F9B34FB | 128-битная форма для 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 в Android-приложении
В Android соединение создаётся через метод createRfcommSocketToServiceRecord(), куда передаётся объект UUID. Типовой фрагмент кода выглядит так:
UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(SPP_UUID);
socket.connect();
Порядок действий при отладке соединения:
☑️ Проверка SPP-подключения
⚠️ Внимание: начиная с 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.