QR-код «Подключиться в DMRConnect»
Админ клуба или своего сервера HBlink, FreeDMR или XLX выкладывает один QR-код. Участник наводит на него камеру телефона, открывается DMRConnect с уже заполненным сервером, остаётся вписать позывной и DMR ID. Без диктовки адресов, портов и паролей в чате.
Ниже генератор для тех, кому код нужен один раз, и библиотека для тех, кто хочет встроить кнопку в сайт клуба, дашборд сервера или Telegram-бота. Работает с DMRConnect 2.0.2 и новее.
Сделать QR без программирования
Библиотека для сайта и бота
Один файл без зависимостей, генератор 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) | Обратно в настройки, для проверки. |
Поля настроек
| Поле | Ключ в ссылке | Значение |
|---|---|---|
type | t | hblink (и FreeDMR), xlx, brandmeister |
host | h | доменное имя или IPv4, обязательно |
port | p | 1..65535, по умолчанию 62031 |
name | n | название в списке серверов, до 40 знаков |
password | pw | пароль мастера (для XLX не нужен) |
talkgroup | tg | группа по умолчанию |
slot | ts | 1 или 2 |
modules | m | XLX: буквы модулей, например ABCD |
scan | sc | до 8 групп скана, массив чисел |
callsign, dmrId | cs, id | только в личной ссылке, ID до 9 цифр |
essid | e | BrandMeister, 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;
Что видит участник
- Наводит камеру телефона на код или нажимает ссылку.
- Если DMRConnect стоит, он открывается сразу на окне «Добавить сервер» с адресом и паролем. Человек проверяет позывной и DMR ID и нажимает «Добавить».
- Если приложения нет, откроется страница с названием сервера и кнопками скачать DMRConnect из RuStore или файлом. После установки ссылку достаточно открыть ещё раз.
Про пароль
Всё после # браузер на сервер не отправляет, так что пароль не попадает в логи нашего сайта или вашего хостинга. Но в самом QR пароль читается любым сканером, поэтому код с паролем мастера показывают своим, а не в открытом канале. Пароль Hotspot Security от BrandMeister личный, его в общий код не кладите никогда.
Вопросы и предложения по формату пишите в группу DMRConnect.