ubxconfig

ubxconfig — приложение для Android, созданное для простой настройки приёмника MS2 прямо со смартфона или планшета, без компьютера и u-center.

Оно позволяет:

  • применить профиль Rover
  • применить профиль Base (Survey-In или Fixed)
  • применить профиль Base Caster (Survey-In или Fixed)
  • включить вывод сырых данных (RAW: RXM-RAWX / RXM-SFRBX)
  • следить за последовательным потоком в реальном времени и — что особенно важно — автоматически восстанавливать конфигурацию приёмника, если она была испорчена случайным сбросом к заводским настройкам (обычно после работы в u-center).

Приложение задумано как полевой инструмент: нужен только телефон, а в случае серьёзных неполадок — кабель USB-C OTG.

Главный экран

Главный экран приложения построен как одна карточка, охватывающая все шаги подключения и настройки.

  1. Status: индикатор в правом верхнем углу с цветной точкой и подписью:

    • Connected (зелёный) — соединение установлено и работает
    • Connecting… (оранжевый, со счётчиком секунд 1..5) — идёт попытка. Если к концу пятой секунды соединение не установлено, приложение прекращает попытку и показывает Not found
    • Not found (красный) — последняя попытка не удалась
    • Not Connected (серый) — нейтральное состояние покоя
  2. Mode: выпадающее меню выбора канала связи

    • Bluetooth (Bluetooth Classic SPP) — обычный канал для повседневной работы. Использует устройства, уже сопряжённые в настройках Android. В списке показываются только приёмники, имя которых начинается с MS2-XXXX
    • BLE Nordic (Bluetooth Low Energy с профилем Nordic UART Service) — энергоэкономичная альтернатива, каждый раз сканирует доступные устройства MS2. Выбор не сохраняется: сканирование всегда новое

    Режим USB не вынесен в отдельный пункт Mode: это служебный канал, включаемый только для восстановления (см. USB Recovery ниже).

_images/home_mode_dropdown.png

Рис.1 Выпадающее меню Mode

  1. Device: выпадающее меню устройства, зависящее от выбранного Mode
    • В режиме Bluetooth перечисляются только уже сопряжённые приёмники с именем MS2-…
    • В режиме BLE Nordic при нажатии запускается сканирование (5 с); если ничего не найдено, показывается Не найдено. Для каждой записи выводятся имя, MAC-адрес и RSSI в дБм
  2. Receiver Configuration (видна только при активном соединении): карточка, ведущая к экрану настройки (Rover, Base Survey-In, Base Fixed, Загрузка своего файла)
  3. Serial Monitor (виден только при активном соединении): зелёная кнопка, открывающая экран терминала для просмотра потока NMEA/UBX от приёмника
  4. GNSS Status (видна только при активном соединении и после успешного чтения): карточка, автоматически заполняемая основными параметрами, прочитанными из приёмника через UBX-CFG-VALGET:
    • Mode: ROVER, SURVEY-IN, FIXED BASE, UNKNOWN
    • Rate: частота обновления в Гц
    • UART1 / UART2: включённые выходные протоколы со скоростью в скобках
    • Elev. Cutoff: минимальный угол возвышения спутников в градусах
_images/home_gnss_status.png

Рис.2 Заполненная карточка GNSS Status

  1. Communication Error (жёлтая карточка, видна при активном соединении, но с неполадками): появляется, когда приложение не может прочитать конфигурацию приёмника или обнаруживает на UART1 скорость, отличную от 115200. Текст предлагает подключить кабель USB OTG. После подключения карточка исчезает, а на её месте появляется оранжевая кнопка USB RECOVERY
_images/home_communication_error.png

Рис.3 Карточка Communication Error

В этом состоянии приложение подключено по Bluetooth, но обнаруживает проблему связи с приёмником — обычно несовпадение скорости после сброса к заводским настройкам из u-center. Для восстановления достаточно соединить телефон и MS2 кабелем USB-C OTG: жёлтая карточка исчезнет, а вместо неё появится оранжевая кнопка USB RECOVERY, описанная в отдельном разделе ниже.

_images/home_usb_recovery_button.png

Рис.4 Кнопка USB RECOVERY

  1. Connect / Disconnect: зелёная или красная кнопка внизу, открывающая или закрывающая соединение выбранного режима

Связь и скорость передачи

Модуль Bluetooth внутри MS2 настроен со стороны последовательного порта на 115200 бод, и для правильной связи с внутренним приёмником u-blox его UART1 тоже должен работать на 115200. Профиль Rover, применяемый приложением, задаёт именно эту скорость и, кроме того, включает UART1OUTPROT_UBX = 1 (это нужно, чтобы ответы UBX-CFG-VALGET — а значит и карточка GNSS Status — доходили до телефона по Bluetooth).

Если выполнить сброс к заводским настройкам приёмника из u-center, скорость изменится (по умолчанию у u-blox 38400, иногда 9600), и связь по Bluetooth нарушится: модуль BT на 115200 читает байты, снятые с неверной скоростью, и получается только мусор — ни NMEA, ни UBX прочитать нельзя. Именно для этого и существует USB Recovery.

USB Recovery

Разовая операция для восстановления связи, когда приёмник «выпал из синхронизации». Пользователь:

  1. Подключается по Bluetooth как обычно
  2. Видит жёлтую карточку Communication Error (признак неверной скорости приёмника)
  3. Соединяет телефон и MS2 кабелем USB OTG
  4. Жёлтая карточка сменяется оранжевой кнопкой USB RECOVERY
  5. Нажимает кнопку

После этого приложение автоматически, без участия пользователя, выполняет:

  • Отключение активного соединения Bluetooth
  • Открытие порта USB-C OTG (при первом подключении система запрашивает разрешение)
  • Поиск действительной скорости приёмника: последовательно пробуются 9600 / 38400 / 115200 / 230400 / 460800 бод с отправкой запроса UBX-MON-VER для каждой
  • После определения отправляется команда UBX-CFG-VALSET, устанавливающая UART1_BAUDRATE = 115200 в RAM и Flash, собственный порт переводится на новую скорость и ожидается подтверждение ACK
  • Проверка после изменения: отправляется второй MON-VER на 115200, чтобы убедиться, что приёмник отвечает
  • Применяется вся конфигурация Rover (9 кадров UBX-CFG-VALSET, слои RAM+BBR+Flash) кадр за кадром, с ожиданием UBX-ACK-ACK между ними
  • Закрытие порта USB

Во время всей операции по центру экрана отображается окно с текущим состоянием («Пробую X бод…», «Приёмник найден на X бод», «Применяю Rover N/9…»). По окончании появляется второе окно с итогом.

_images/recovery_success_dialog.png

Рис.5 Окно подтверждения восстановления

Пользователь нажимает OK, отсоединяет кабель USB, снова подключается по Bluetooth — и связь работает.

Важно: во время восстановления приложение не остаётся постоянно «подключённым по USB». Это неделимая операция: открыть, починить, закрыть. Режим USB даже не отображается в выпадающем меню Mode — это скрытая процедура за кнопкой Recovery.

Receiver Configuration

Экран открывается одноимённой карточкой на главном экране (видна при активном соединении). Он позволяет применить один из трёх основных профилей — Rover, Base Survey-In или Base Fixed — либо загрузить свой файл конфигурации UBX. Вид страницы автоматически подстраивается под режим, выбранный в выпадающем меню Receiver Mode вверху: показываются только поля, относящиеся к выбранному профилю.

В режиме Rover вид страницы самый простой: меню Receiver Mode = Rover, меню Frequency для выбора частоты обновления (1, 2, 5 или 10 Гц), затем сворачиваемая кнопка Advanced. Развернув её (зелёный значок шестерёнки, стрелка вверх), вы получаете доступ к менее употребительным параметрам — Cutoff (минимальный угол возвышения спутников, диапазон 0–40°, изменяется кнопками −/+ или вводом числа), переключатель RAW data (включает RXM-RAWX и RXM-SFRBX на UART1) и Save to Flash (окончательная запись во флеш-память, а не только в RAM). Внизу зелёная кнопка Send Configuration отправляет конфигурацию приёмнику.

_images/receiver_configuration_rover.png

Рис.6 Rover (Advanced)

При выборе Base в меню Receiver Mode экран меняется: появляется дополнительное меню Base Mode с двумя пунктами — Survey-In и Fixed Position. Режим Survey-In самый быстрый: приёмник постепенно определяет своё положение, накапливая измерения, пока одновременно не будут выполнены два условия — Minimum duration в секундах (по умолчанию 60 с) и Minimum accuracy в метрах (по умолчанию 5,0 м). Для точных установок, характерных для постоянных серверов NTRIP, эти значения имеет смысл существенно увеличить (например, 600 с и более и 1,0 м), чтобы получить положение базы с погрешностью менее метра.

_images/receiver_configuration_base_survey.png

Рис.7 Base Survey-In

Режим Fixed Position предназначен для установок, где координаты базовой точки уже известны — обычно из геодезического пункта, из ранее сохранённой Survey-In или из обычной съёмки. Меню Coordinates позволяет выбрать систему отсчёта: LLH (широта и долгота в десятичных градусах, высота в метрах), как на снимке экрана, либо ECEF (X/Y/Z в метрах, геоцентрическая прямоугольная система). После ввода трёх координат кнопка Send Configuration отправляет их приёмнику, который сразу переходит в TMODE = 2 (fixed) и начинает формировать поправки RTCM3 на настроенных каналах (по умолчанию UART2, а в режиме Caster — UART1).

_images/receiver_configuration_base_fixed.png

Рис.8 Base Fixed (LLH)

Во всех режимах панель Advanced сворачивается автоматически при смене Receiver Mode: так страница не становится слишком длинной при переходе от компактного Rover к Base Fixed, где уже четыре видимых поля. При необходимости пользователь открывает Advanced вручную.

  1. Rover

    Профиль для работы подвижным приёмником с настраиваемой частотой (1, 2, 5, 10 Гц):

    • Вывод NMEA на UART1 (GGA, GSA, GSV, RMC, GST, GNS включены; GLL и VTG выключены)
    • UBX выключен (если не включён RAW — см. ниже)
    • Все сообщения RTCM отключены на обоих UART
    • TMODE выключен
    • Угол отсечки 10°
    • UART1_BAUDRATE = 115200, UART2_BAUDRATE = 57600
    • Необязательный флажок RAW data: включает RXM-RAWX и RXM-SFRBX на UART1 и задаёт UART1OUTPROT_UBX = 1 (необходимо для потока UBX RAW)
  2. Base Survey-In

    Профиль базовой станции с постепенным определением положения:

    • Минимальная продолжительность в секундах (настраивается)
    • Целевая точность в мм (настраивается)
    • Вывод RTCM3 (1005, 1077, 1087, 1097, 1127, 1230) на UART2 к радиомодему или NTRIP-кастеру
    • Можно выбрать режим Caster: вывод RTCM переходит на UART1 вместо UART2 (удобно при работе через мост, публикующий данные на сервере NTRIP)
    • Флажок RAW data — как в профиле Rover
  3. Base Fixed

    Профиль базовой станции с известными координатами (LLH или ECEF):

    • Координаты вводятся вручную или берутся из последней Survey-In
    • Схема RTCM3 та же, что и в Survey-In
  4. Upload File

    Загружает текстовый файл конфигурации UBX (.txt с шестнадцатеричными парами «ключ-значение») и применяет команды к приёмнику. Удобно для собственных предустановок или файлов, полученных от поддержки SoluTOP.

Для каждого профиля пользователь выбирает целевой слой, в который записывается конфигурация:

  • RAM — временно, теряется при перезагрузке
  • BBR — память с батарейным питанием, переживает перезагрузку, но не отключение питания
  • Flash — постоянно
  • Все — RAM + BBR + Flash (рекомендуется для окончательных изменений)

Команды отправляются пакетами по 64 ключа с ожиданием ACK на каждый. Ход выполнения показывает индикатор.

Serial Monitor

Экран терминала, показывающий последовательный поток от приёмника в реальном времени. Три режима отображения:

  • ASCII: только печатаемый текст, непечатаемые символы заменяются на .
  • HEX: побайтово в шестнадцатеричном виде
  • Auto (по умолчанию): распознаёт NMEA и UBX, показывает NMEA текстом, а UBX — в шестнадцатеричном виде с расшифрованным заголовком ([UBX cls id])

Панель инструментов сверху:

  • Назад (← закрывает экран и останавливает чтение)
  • Pause / Play (приостанавливает и возобновляет поток)
  • Clear (очищает буфер)

Строки окрашены по типу: зелёные — ACK UBX, красные — NAK, синие — прочие UBX, светло-серые — NMEA.

_images/serial_monitor.png

Рис.9 Serial Monitor (Auto)

Автоматические обновления

Приложение автоматически — не чаще одного раза в 24 часа — проверяет через GitHub API, есть ли новая версия в открытом репозитории релизов. Время последней проверки сохраняется в SharedPreferences; в течение следующих 24 часов приложение к GitHub не обращается, поэтому запуск остаётся быстрым даже в медленной сети, а ограничение GitHub API соблюдается (60 запросов в час для неавторизованного IP-адреса).

Если найден тег новее, чем BuildConfig.VERSION_NAME, приложение показывает окно с номером доступной версии, примечаниями к выпуску (первые 300 символов) и двумя вариантами: Скачать (открывает загрузку APK из релиза) или Позже.

Ту же проверку можно в любой момент запустить вручную из окна About (значок ℹ︎ в правом верхнем углу) кнопкой Проверить обновления. Ручная проверка игнорирует ограничение частоты и всегда показывает результат (в том числе «Приложение обновлено» или ошибку сети).

_images/about_dialog.png

Рис.10 Окно About

Устойчивость к разрывам связи

Обнаружение непредвиденного физического разрыва связи (выключенный модуль BT, отсоединённый кабель USB, выход из зоны действия) на Android общеизвестно непросто: ядро не обновляет BluetoothSocket.isConnected при потере радиосвязи, а outputStream.write может незаметно буферизоваться. Приложение сочетает несколько механизмов, чтобы состояние интерфейса всегда соответствовало действительности:

  • Bluetooth SPP — три независимых механизма:

    1. BroadcastReceiver для ACTION_ACL_DISCONNECTED, регистрируемый в connect(): перехватывает системное событие сразу при потере радиосвязи (задержка около 1 с)
    2. Контрольная запись в 256 байт (32 склеенных сообщения UBX-MON-VER) каждые 2,5 с в потоке опроса: она заполняет буфер ядра BlueZ и вызывает Broken pipe, если модуль исчез
    3. Детектор «замершего» потока: если inputStream.available() остаётся равным 0 три цикла подряд (около 7,5 с) — хотя приёмник в состоянии Connected должен непрерывно выдавать NMEA, — сокет считается неработающим

    Прежде чем приложение сменит состояние, нужны два подряд неудачных контрольных обмена (это исключает ложные срабатывания на кратковременных сбоях). Опрос выполняется в Dispatchers.IO, поэтому продолжается и когда приложение свёрнуто.

  • BLEBluetoothGattCallback получает STATE_DISCONNECTED сразу при потере связи и обновляет интерфейс

  • USB — опрос каждые 1,5 с через UsbManager.findDevice(). Если кабель физически отсоединён, приложение сбрасывает только состояние USB; карточка GNSS Status по Bluetooth остаётся видимой, если соединение BT ещё активно

  • Защита от сбоев — глобальный Thread.UncaughtExceptionHandler перехватывает исключения IOException транспортов, ускользнувшие от try/catch отдельных менеджеров, и не даёт исключению завершить приложение. В циклах опроса тоже есть свои try/catch, чтобы они не прекращались молча при неожиданной ошибке

  • Чтение GNSS после подключения с экспоненциальной задержкой — при первом соединении приложение читает конфигурацию приёмника тремя попытками UBX-CFG-VALGET с тайм-аутами 2 с / 3 с / 4,5 с и паузами 0 мс / 300 мс / 800 мс между ними. Это сглаживает кратковременные сбои Bluetooth (джиттер, поток NMEA, заполняющий буфер до ответа UBX): карточка GNSS Status заполняется даже при потере одного кадра, а жёлтая карточка Communication Error появляется, только если не удались все три попытки

Необходимые разрешения

При первом запуске приложение запрашивает:

  • BLUETOOTH_CONNECT — необходимо для подключения к сопряжённым устройствам (Android 12+)
  • BLUETOOTH_SCAN — необходимо для сканирования BLE
  • INTERNET — необходимо для проверки обновлений через GitHub API
  • Доступ к устройству USB OTG — запрашивается системой только при попытке USB Recovery

Установка

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

Видео

Полное руководство доступно здесь.