КДПВ
КДПВ

Иногда связь нужна там, где её нет. А иногда просто хочется поэкспериментировать с передачей данных. В этот раз я решил проверить - какие пределы дальности у Bluetooth, можно ли использовать современный смартфон в качестве рации и организовать беспроводной цифровой канал связи в горах.

В теории блютус достаточно дальнобойный, но в обычной жизни связь с устройствами ограничена буквально метрами. Но зато он есть в любом телефоне, всегда под рукой, не требует дополнительного оборудования и довольно прост в программировании.

Блютус обычно воспринимается, как что-то совсем локальное и непригодное для нормальной связи. Но иногда привычные, казалось бы, технологии могут удивить (или нет).

Есть ли дальнобойный Bluetooth в телефоне?

Провести исследование меня сподвигло несколько факторов:

  • Желание сделать свою маленькую локальную радио-сеть

  • Внутренняя потребность сделать что-то новое

  • И вот такой удивительный пункт в описании чипсета MediaTek Dimensity 9500s при выборе телефона для покупки:

Bluetooth

  • Up to 5km direct phone-to-phone BT connections without requiring cellular service

Блютус на 5 километров? Ну не может такого быть! Все же знают, что блютус - это буквально метры стабильного приёма. Кроме того, одно дело - это возможности чипа, а другое - обвязка для его взаимодействия с внешним миром.

Некоторые производители телефонов обещают связь на довольно большие расстояния. Например, в современных телефонах Xiaomi есть тип связи: “Xiaomi Offline Communication”. В описании технологии пишут про блютус почти на 2 километра (в идеальных условиях и с проприетарным протоколом):

Xiaomi Offline Communication is an innovative near-field voice communication technology that combines Bluetooth communication with a proprietary protocol. Its primary advantage is its ability to bypass cellular networks and Wi-Fi, enabling long-distance voice calls via a direct device-to-device connection. Currently, two-way, network-free calls can be conducted over distances of up to 1.9 km in open environments.

Xiaomi Offline Communication requires the device to have a SIM card, be logged into a Xiaomi account, and have Bluetooth enabled to function.

It uses Bluetooth and does not rely on mobile network base stations, enabling point-to-point voice calls even without cellular or Wi-Fi signals.

Xiaomi также пишет про механизмы улучшения беспроводной связи для некоторых моделей смартфонов.

Тут и улучшенный чип:

Xiaomi Surge T1S Tuner

With the self-developed Xiaomi Surge T1S Tuner, the Xiaomi 15T optimizes Wi-Fi, Bluetooth, GPS, and cellular signals for smoother and smarter connectivity.

И супер-антенна:

Super Antenna Array

Powered by a high-performance antenna array, it optimizes performance across 16 scenarios, keeping you connected anytime, anywhere.

Я не фанат компании Xiaomi, но у неё есть устройства, которые мне нравятся. Если вычистить ту авгиеву конюшню, которая бывает в системе после покупки или обновления, то в принципе телефоном можно пользоваться.

Забегая вперёд, скажу, что я не проверял работу этого “Xiaomi Offline Communication”. Оно требует сим-карту и привязку телефона к mi-аккаунту. Компания хочет контролировать применение технологии и идентифицировать пользователей. И наверняка отключит такую связь по первому же требованию властей. Я просто не хочу таким пользоваться. Кроме того, как показал эксперимент, у других производителей блютус не хуже.

Но, если в таком телефоне есть мощный передатчик и антенна с усилителем, то может быть и обычный Bluetooth будет работать лучше? И почему бы не попробовать сделать на базе этого что-то своё.

Мощность

Вначале немного о единицах измерения.

В радиосвязи за эталон мощности взят 1 милливатт (мВт). В беспроводных сетях мощность передатчика это обычно единицы, десятки или доли милливатта.

Децибел (dB) - это логарифмическая величина, которая показывает, насколько сигнал изменился. Уменьшение на 10 dB означает уменьшение мощности в 10 раз.

А децибел-милливатт (dBm) - показывает уровень мощности сигнала относительно 1 мВт. Например, если передатчик выдаёт 0 dBm (или 1 мВт), а потери при передаче составляют 60 dB, то принимаемая мощность будет: 0 dBm - 60 dB = -60 dBm

Используя dBm, можно удобно работать с очень разными уровнями радиосигнала - от мегаватт до долей пиковатт без длинных дробей и множества нулей.

Из моих наблюдений - в телефоне принимаемая мощность блютус-сигнала всегда меньше миливатта. Всё укладывается вот в этот диапазон:

Уровень мощности

Мощность

Уменьшение мощности

0 dBm

1 мВт

-

-10 dBm

0.1 мВт

10 раз

-20 dBm

0.01 мВт

100 раз

-30 dBm

1 мкВт

1000 раз

-40 dBm

0.1 мкВт

10 000 раз

-50 dBm

0.01 мкВт

100 000 раз

-60 dBm

1 нВт

1 000 000 раз

-70 dBm

0.1 нВт

10 000 000 раз

-80 dBm

0.01 нВт

100 000 000 раз

-90 dBm

1 пВт

1 000 000 000 раз

-100 dBm

0.1 пВт

10 000 000 000 раз

Мощность на выходе передатчика и на входе приёмника может отличаться в миллиарды раз.

Какая мощность радио-передатчика используется для блютуса и какие параметры у антенны - эта информация очень редко встречается в технических характеристиках телефона. И обычно она недоступна приложениям в Android. Единственное, что можно узнать в софте - мощность принимаемого сигнала (RSSI - Received Signal Strength Indicator).

Его значения могут быть такими:

  • когда телефоны плотно прижаты друг к другу, значение RSSI=-10 dBm

  • на расстоянии метра это примерно -50 dBm

  • на 10 метрах это уже -75 dBm

  • на 100 метрах это может быть -95 dBm.

  • на 300 метрах -100 dBm.

Это всё очень примерно. Зависит от модели телефона и окружающей среды. Но если RSSI становится меньше -100 dBm, то это уже на пределе чувствительности приёмника, и связь начинает отваливаться.

На одной из страниц Bluetooth-альянса Understanding Bluetooth range есть калькулятор дальности в зависимости от возможностей оборудования и окружающих условий. Если выбрать там самые лучшие параметры, то теоретическая предельная дальность достигает 3845 метров. Но вряд ли это применимо к телефону. Таких значений можно достичь на очень специфичном лабораторном или промышленном оборудовании.

Как всегда, для идеальной связи нужна хорошая антенна, мощный радиопередатчик, чувствительный радиоприёмник и отсутствие помех.

Приложение для связи

Тут всё совпало: создавать софт я люблю и умею, телеком - это моя alma mater, а эпоха наступила такая, что об альтернативной связи думают, наверное, практически все.

Итак, для тестирования связи я сделал миниатюрное Android-приложение, которое:

  • Обменивается данными между телефонами через BLE (Bluetooth Low Energy).

  • Сжимает голос до 1.5 килобайта в секунду для работы в качестве Push-To-Talk рации.

  • Создаёт VPN-туннель между двумя телефонами для передачи сетевого трафика.

  • Выступает в качестве прокси-сервера с возможностью фильтрации соединений от приложений.

  • Может работать в роли сервера с BLE-маячком (адвертайзером), или в роли клиента с BLE-сканером.

  • Измеряет скорость соединения, определяет уровень сигнала и расстояние между устройствами.

BLE

Транспорт в приложении сделан на базе технологии BLE GATT.

Всё общение по BLE (передача текста, сетевых пакетов, голоса) основано на работе с двумя GATT Characteristic - одна для приёма, вторая для передачи. Можно считать их небольшими буферами для обмена данными.

Вообще GATT не особо предназначен для передачи потоковых данных. Он используется для передачи значений датчиков, небольших блоков данных, уведомлений от устройств. Но нетрадиционное применение тоже успешно работает.

Чтобы устройства нашли друг друга, одно выступает в роли маячка (адвертайзера), передавая информацию о себе в эфир, а второе устройство сканирует эфир для поиска собеседника.

Для передачи по BLE приходится фрагментировать и потом собирать обратно передаваемые данные. MTU у BLE намного меньше, чем у вайфая или у мобильной связи, и, кроме того, размер GATT Characteristic ограничен 509 байтами.

В BLE можно выбирать разные режимы кодирования данных в радиоканале. Этот вечный выбор между скоростью и дальностью.

В телефоне обычно доступны:

  • LE 2M (2 мегабита в секунду) - это для максимальной скорости

  • LE 1M (1 мегабит в секунду)

  • LE CODED S=2 (500 килобит в секунду)

  • LE CODED S=8 (125 килобит в секунду) - это для максимальной дальности

В CODED режимах появляется дополнительная избыточность, и приёмник может восстанавливать пакеты при более слабом сигнале. S8 - это самый медленный, но наиболее надёжный вариант.

Тут стоит упомянуть, что для передачи данных большинство современных телефонов поддерживает все эти режимы. Но редко какие телефоны умеют использовать CODED для адвертайзинга (когда BLE сервер транслирует короткие пакеты, чтобы сообщить о своём присутствии). То-есть типичная ситуация: телефоны “увидели” друг друга, находясь рядом. При удалении они успешно передают данные. Но при обрыве связи найти друг друга на большом расстоянии они уже не могут. Приходится возвращаться немного назад, чтобы они заново установили соединение.

Также в приложении была сделана поддержка классического Bluetooth и L2CAP, но в финале, отсекая всё лишнее, я их убрал.

Связь сделана по принципу точка-точка - всегда только между двумя устройствами. Но разные пары устройств могут выбрать для соединения разные каналы для одновременной работы (имеется в виду не радиоканалы, а логическая идентификация устройств на уровне маячок/сканер).

Голосовая связь

Для передачи голоса аудио-поток читается с микрофона передающего устройства, кодируется в AAC-LC, пересылается через BLE и воспроизводится на другой стороне.

В настройках приложения сделано 2 профиля кодирования:

  • 16 kHz / 24 kbps, ~3 KB/s

  • 8 kHz / 12 kbps, ~1.5 KB/s

В обоих случаях голос отчётливо слышен, без металлических искажений. На дальних расстояниях и в случае нестабильной связи пакеты могут пропадать, а часть разговора может теряться.

VPN-интерфейс, прокси и фильтрация сетевого трафика

Самый простой способ управлять трафиком в Android - сделать в своём приложении сервис на базе класса “android.net.VpnService”, тогда приложение станет ответственным за приём/передачу сетевых пакетов. Потом эти пакеты можно обрабатывать и пересылать куда и как угодно, в том числе через BLE. Механизм простой: приложение читает пакет из TUN, фрагментирует, пишет в BLE, читает из BLE, восстанавливает пакет, пишет в TUN. Остальные приложения и операционная система продолжают работать, как будто они в обычной сети.

Но, как только в андроиде активируется сеть - система и работающие приложения тут же начинают передавать и принимать тонны мусора, телеметрии и рекламы. Для BLE-канала это критично, особенно когда один из телефонов выступает в роли шлюза в интернет.

Чтобы сократить количество левого трафика можно:

  • объявить сетевой интерфейс как Metered

  • использовать DNS (типа AdGuard DNS), отсекающий адреса трекеров и рекламных площадок

  • перенаправлять HTTPS-трафик в свой прокси-сервер, который умеет делать фильтрацию хостов

  • разрешить передачу через VPN-интерфейс данных только от определённых приложений

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

Например, если добавить в чёрный список habrastorage.org и assets.habr.com, то публикации на хабре можно читать, тратя в 72 раза меньше трафика (250 килобайт против 18 мегабайт). Да, без картинок и рекламы, но читабельно. И это вполне реально передать по BLE.

Код проекта

Мой код в этом проекте довольно специфичен. Я не использую Kotlin, Gradle, Android IDE, библиотеки или фреймворки. Только GNU Make и набор консольных тулов из JDK и Android SDK. Только старая добрая Java 8.

Хотелось в очередной раз уместить приложение в 64 килобайта. Изначальная версия была чуть больше сотни килобайт, поэтому пришлось применить все оттенки оптимизации: при сборке максимально компактно упаковать ресурсы и минимизировать java код, сократить функционал до разумного минимума. Но больше всего на размер повлияла переделка иконок из png в нативный векторный формат android drawable.

В результате всё получилось идеально. Размер apk-файла стал 61 килобайт (из которых 4 занимает цифровая подпись). Всё без рута, магии и сторонних библиотек; используя только доступное Java API в Android и естественный интеллект.

Публиковать этот код я вообще не планирую.

Скорость

За скоростью я не гнался. Нужен был канал связи для передачи голоса и текста, бонусом к этому была передача сетевых пакетов. Для голоса достаточно полутора килобайт в секунду. Для текстовых сообщений - несколько байт в секунду. Для интернета, чтобы почитать хабр, хватает 10 килобайт в секунду и нескольких секунд ожидания загрузки страницы (с включённым фильтром, конечно же). Но вот обновление пакетов в линуксе через такой канал занимает вечность (да это и не нужно, потому что все пакеты уже скачаны заранее в Линуксе выживальщика).

На близком расстоянии (до 50 метров) данные передаются со скоростью около 15 килобайт в секунду (~120 kbit/s). Это в 2 раза быстрее, чем умел USRobotics 56K диалап модем из моей юности. На 200 метрах скорость может быть около 5 килобайт в секунду. На 300 метрах удалось получить 2 килобайта в секунду. Маловато, но для голосовой связи хватает.

Приложение проектировалось с перспективой использования спутниковой связи. Но пока что это осталось только в мечтах.

Проверка связи

В горной местности неожиданной сложностью оказалось найти место для тестирования. Такое, чтобы было несколько сотен метров прямой видимости. Чтобы не было перепадов высот, и можно было померить сигнал в каждой точке маршрута. В результате я нашёл место в пригороде, в области устойчивого приёма 5G, но без строений, техники и Wi-Fi сетей в округе, чтобы минимизировать влияние радио-помех в диапазоне 2.4 Ггц.

Между устройствами всегда была прямая видимость (это важное уточнение, потому что трава, кусты, деревья, ложбины на пути прохождения сигнала очень сильно портят связь).

В каждом эксперименте участвовала пара устройств. На обоих устройствах был включён блютус и геолокация. Через каждые 10 метров замерялся уровень принимаемого сигнала, проверялась голосовая связь и текстовый чат.

Устройства

  • Два Xiaomi Poco X8 Pro (MediaTek Dimensity 8500, Android 16) - это модель, в которой есть тот самый “Xiaomi Offline Communication”, но не активированный.

  • Motorola Edge 50 Neo (MediaTek Dimensity 7300, Android 14)

  • Samsung A52 (Qualcomm Snapdragon 720G, Android 12)

Измерения

Итак, для проверки связи использовались вот такие пары телефонов:

  • A) Сервер: Xiaomi Poco X8 Pro, клиент: Xiaomi Poco X8 Pro

  • B) Сервер: Xiaomi Poco X8 Pro, клиент: Motorola Edge 50 Neo

  • C) Сервер: Motorola Edge 50 Neo, клиент: Xiaomi Poco X8 Pro

  • D) Сервер: Xiaomi Poco X8 Pro, клиент: Samsung A52

  • E) Сервер: Samsung A52, клиент: Xiaomi Poco X8 Pro

В таблице для каждой пары телефонов показан уровень мощности принятого сигнала на соответствующем расстоянии. Прочерк “-” означает, что связи на этом расстоянии не было.

Расстояние

RSSI A

RSSI B

RSSI C

RSSI D

RSSI E

0 метров

-5 dBm

-25 dBm

-22 dBm

-12 dBm

-11 dBm

1 метр

-50 dBm

-44 dBm

-67 dBm

-40 dBm

-65 dBm

10 метров

-81 dBm

-78 dBm

-86 dBm

-66 dBm

-73 dBm

20 метров

-86 dBm

-81 dBm

-89 dBm

-70 dBm

-80 dBm

30 метров

-86 dBm

-74 dBm

-89 dBm

-83 dBm

-79 dBm

40 метров

-94 dBm

-77 dBm

-90 dBm

-71 dBm

-85 dBm

50 метров

-87 dBm

-87 dBm

-94 dBm

-84 dBm

-88 dBm

60 метров

-86 dBm

-85 dBm

-98 dBm

-80 dBm

-82 dBm

70 метров

-91 dBm

-87 dBm

-100 dBm

-81 dBm

-89 dBm

80 метров

-89 dBm

-85 dBm

-98 dBm

-69 dBm

-91 dBm

90 метров

-92 dBm

-88 dBm

-99 dBm

-75 dBm

-95 dBm

100 метров

-95 dBm

-98 dBm

-100 dBm

-89 dBm

-89 dBm

110 метров

-97 dBm

-86 dBm

-100 dBm

-94 dBm

-94 dBm

120 метров

-97 dBm

-89 dBm

-102 dBm

-93 dBm

-90 dBm

130 метров

-95 dBm

-91 dBm

-102 dBm

-91 dBm

-95 dBm

140 метров

-100 dBm

-98 dBm

-100 dBm

-89 dBm

-95 dBm

150 метров

-98 dBm

-99 dBm

-99 dBm

-96 dBm

-98 dBm

160 метров

-99 dBm

-98 dBm

-103 dBm

-96 dBm

-99 dBm

170 метров

-99 dBm

-97 dBm

-

-94 dBm

-97 dBm

180 метров

-100 dBm

-94 dBm

-

-93 dBm

-101 dBm

190 метров

-100 dBm

-99 dBm

-

-96 dBm

-99 dBm

200 метров

-99 dBm

-93 dBm

-

-94 dBm

-101 dBm

210 метров

-100 dBm

-94 dBm

-

-91 dBm

-100 dBm

220 метров

-101 dBm

-99 dBm

-

-93 dBm

-101 dBm

230 метров

-101 dBm

-100 dBm

-

-94 dBm

-99 dBm

240 метров

-

-96 dBm

-

-96 dBm

-99 dBm

250 метров

-

-

-

-96 dBm

-95 dBm

260 метров

-

-

-

-97 dBm

-96 dBm

270 метров

-

-

-

-92 dBm

-98 dBm

280 метров

-

-

-

-91 dBm

-96 dBm

290 метров

-

-

-

-98 dBm

-93 dBm

300 метров

-

-

-

-

-100 dBm

310 метров

-

-

-

-

-101 dBm

320 метров

-

-

-

-

-101 dBm

330 метров

-

-

-

-

-103 dBm

340 метров

-

-

-

-

-103 dBm

350 метров

-

-

-

-

-103 dBm

Старенький самсунг показал наилучший результат.

Так как единственный доступный для измерения параметр - это уровень мощности принятого сигнала, то сложно сказать, как менялась (и менялась ли вообще) мощность передатчика при увеличении расстояния.

К сожалению не удалось найти для тестирования телефон с тем самым MediaTek Dimensity 9500s, спецификация которого стала поводом для исследования. Может быть с ним получилось бы установить связь на большее расстояние.

Итоги

Сегодня Bluetooth условно пригоден для связи в прямой видимости на расстоянии до 200-300 метров (в зависимости от модели телефона). Стена, стекло, машина, человек, дерево, любое препятствие - это серьёзная преграда для блютус-сигнала. Удивительно, но эксперимент показал примерно одинаковую дальность и в городе (где всё просто переполнено вайфай и блютус устройствами) и в удалённой местности.

Блютус в телефоне - это чёрный ящик. К низкоуровневому радио доступа нет. Управлять мощностью передатчика практически невозможно, получать служебную информацию тоже.

Производители телефонов может и могли бы сделать блютус более дальнобойным, но тогда большинство региональных регуляторов их за такое наверное не похвалит, а скорее всего даже накажет, чтобы не допустить создания неподконтрольных радио-сетей.

В реальности, пользоваться телефоном для offline-связи менее удобно и надёжно по сравнению с рацией.

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

В обычной рации можно не глядя нажать одну физическую кнопку, чтобы ответить. В телефоне же надо разблокировать экран, ткнуть пальцем в виртуальную неосязаемую кнопку. Это всё не очень удобно.

Но смартфон всегда под рукой. И блютус иногда может выручить, особенно если нужна передача не только голоса, но ещё и данных.

Комментарии (3)


  1. naim
    10.10.2026 11:15

    Ок а код можно посмотреть ?
    И второй вопрос - чем он лучше или хуже https://github.com/kookoo1sabzy/BaleVPN ?


    1. Xantorohara Автор
      10.10.2026 11:15

      Не... я вообще не планировал публиковать код. А существующие решения я не смотрел, у меня был интерес самому разобраться с блютусом и сделать приложение для себя.

      Раньше я делал сеть на микроконтроллерах и NRF24 радио-модулях. А потом решил сделать на BLE и андроиде. Это просто хобби такое.


  1. ivanstor
    10.10.2026 11:15

    "У нас есть такие приборы, Но мы вам их не покажем" ©