DMRConnectDMRConnect
Главная · Для разработчиков

QR-код «Подключиться в DMRConnect»

Админ клуба или своего сервера HBlink, FreeDMR или XLX выкладывает один QR-код. Участник наводит на него камеру телефона, открывается DMRConnect с уже заполненным сервером, остаётся вписать позывной и DMR ID. Без диктовки адресов, портов и паролей в чате.

Ниже генератор для тех, кому код нужен один раз, и библиотека для тех, кто хочет встроить кнопку в сайт клуба, дашборд сервера или Telegram-бота. Работает с DMRConnect 2.0.2 и новее.

Сделать QR без программирования

Позывного и DMR ID в общем коде нет специально: одна картинка на весь клуб, каждый впишет свои. Если позывной уже стоит на другом сервере в приложении, DMRConnect подставит его сам.

Библиотека для сайта и бота

Один файл без зависимостей, генератор QR уже внутри. Работает в браузере и в Node.js, лицензия MIT. Скачайте dmrconnect-link.js (62 КБ) и положите к себе рядом со страницей. Библиотека ни к какому серверу не обращается, код рисуется прямо у посетителя, наш сайт для этого не нужен.

<script src="/js/dmrconnect-link.js"></script>   <!-- своя копия файла -->
<div id="qr" style="width:220px"></div>
<script>
  const link = DMRConnectLink.render("#qr", {
    name: "Клуб R0A", type: "hblink",
    host: "dmr.example.org", port: 62031,
    password: "passw0rd", talkgroup: 91, slot: 2,
  });
  // link = "https://dmrconnect.ru/add#eyJ2Ijox..." - можно дать и кнопкой
</script>

В Node.js так же, файл лежит в вашем проекте:

const L = require("./dmrconnect-link.js");
const link = L.build({ type: "xlx", host: "xlx250.example.org", port: 62030, modules: "ABCD" });
const svg = L.svg(link);            // разметка SVG для письма или PDF

Методы

МетодЧто делает
build(cfg, {scheme})Ссылка на сервер. scheme: "https" (по умолчанию) или "app", см. ниже. При ошибке в настройках бросает Error с понятным текстом.
render(el, cfg | link, {scheme})Рисует QR в элемент (селектор или узел), возвращает ссылку.
svg(cfg | link, {cell, margin, scheme})Строка SVG, масштабируется без потери чёткости.
dataUrl(cfg | link, {cell, scheme})Картинка в data: URL для <img> или скачивания.
parse(link)Обратно в настройки, для проверки.

Поля настроек

ПолеКлюч в ссылкеЗначение
typethblink (и FreeDMR), xlx, brandmeister
hosthдоменное имя или IPv4, обязательно
portp1..65535, по умолчанию 62031
namenназвание в списке серверов, до 40 знаков
passwordpwпароль мастера (для XLX не нужен)
talkgrouptgгруппа по умолчанию
slotts1 или 2
modulesmXLX: буквы модулей, например ABCD
scanscдо 8 групп скана, массив чисел
callsign, dmrIdcs, idтолько в личной ссылке, ID до 9 цифр
essideBrandMeister, 0..99

Какую ссылку выбрать

Данные сервера в обоих вариантах одинаковые, отличается только начало.

https://dmrconnect.ru/add#...dmrconnect://add#...
DMRConnect установленоткрывается сразу в приложении, запроса к сайту нетоткрывается сразу в приложении
Приложения нетстраница с названием сервера и кнопками скачатьничего не происходит
Камеры телефоновоткрывают всечасть камер такие ссылки не открывает
Зависит от dmrconnect.ruтолько когда приложения нетнет

Для листовки и сайта клуба лучше https: она понятна людям и подскажет, что поставить. Схему dmrconnect:// выбирайте, когда вся аудитория уже с приложением или нужна полная независимость от нашего сайта, например в закрытой сети без интернета до dmrconnect.ru.

Формат, если без библиотеки

JSON с короткими ключами из таблицы и полем "v":1 кодируется в UTF-8, затем в base64url без знаков = и ставится после решётки: https://dmrconnect.ru/add#КОД или dmrconnect://add#КОД. Подойдёт любой генератор QR, библиотека не обязательна.

# Python
import base64, json
cfg = {"v": 1, "t": "hblink", "h": "dmr.example.org", "p": 62031, "n": "Клуб R0A", "pw": "passw0rd", "tg": 91}
code = base64.urlsafe_b64encode(json.dumps(cfg, ensure_ascii=False).encode()).decode().rstrip("=")
print("https://dmrconnect.ru/add#" + code)
// PHP
$cfg = ["v" => 1, "t" => "hblink", "h" => "dmr.example.org", "p" => 62031, "n" => "Клуб R0A", "pw" => "passw0rd", "tg" => 91];
$code = rtrim(strtr(base64_encode(json_encode($cfg, JSON_UNESCAPED_UNICODE)), "+/", "-_"), "=");
echo "https://dmrconnect.ru/add#" . $code;

Что видит участник

  1. Наводит камеру телефона на код или нажимает ссылку.
  2. Если DMRConnect стоит, он открывается сразу на окне «Добавить сервер» с адресом и паролем. Человек проверяет позывной и DMR ID и нажимает «Добавить».
  3. Если приложения нет, откроется страница с названием сервера и кнопками скачать DMRConnect из RuStore или файлом. После установки ссылку достаточно открыть ещё раз.

Про пароль

Всё после # браузер на сервер не отправляет, так что пароль не попадает в логи нашего сайта или вашего хостинга. Но в самом QR пароль читается любым сканером, поэтому код с паролем мастера показывают своим, а не в открытом канале. Пароль Hotspot Security от BrandMeister личный, его в общий код не кладите никогда.

Вопросы и предложения по формату пишите в группу DMRConnect.