Три сентябрьские жалобы из группы подряд оказались об одном и том же, хотя выглядели по-разному: «не работает смена канала у всех», «замок на сообщении сбивает с толку», «рация приняла, а в приложении пусто». Ни одна из них не была ошибкой радио. Все три жили в том промежутке, где устройство и человек понимают происходящее по-разному — и все три спокойно прошли бы любой автоматический тест.
Кнопка, которая делала вид
«Не смог сменить канал у всех нод. Эта функция как-то связана с шифрованием?» — а следом второе сообщение: «кстати, да, у меня это не работает».
Связана она была не с шифрованием. В прошивке стояла проверка, которая выглядит образцом здравого смысла: если запрошенный канал совпадает с текущим — делать нечего, выходим. Для одиночной рации это верно. Но команда «сменить у всех» адресована не себе, а соседям, и её нужно отправить в эфир независимо от того, где стоишь сам.
Добил ситуацию интерфейс. В приложении выбор канала переводит свою рацию сразу же. То есть человек сначала выбирает нужный канал — рация переходит, — а потом жмёт «сменить у всех», уже стоя на этом канале. Ровно то состояние, при котором прошивка считала, что делать нечего. Команда не уходила никогда. Не иногда, не при плохом сигнале — никогда.
Поучительно здесь то, что каждая половина по отдельности разумна. Прошивка не хотела лишней работы. Приложение не хотело заставлять человека дважды подтверждать выбор. Ошибка возникла на стыке, а стык — это ровно то место, которого не видно, пока смотришь на одну сторону.
Теперь совпадение канала отменяет только собственный переход, но не рассылку, а кнопка в приложении открывает отдельный список каналов с пометкой, где рация стоит сейчас.
Замок, который читался наоборот
Когда на рации задан ключ, она по умолчанию не слушает открытый эфир. Это осознанный выбор: одна рация без ключа сводит шифрование на нет, а люди при этом считают разговор закрытым. Но иногда открытый эфир нужен, поэтому появился переключатель — и вместе с ним пометка у сообщений, пришедших без шифра. Пометкой был открытый замок.
«Замочек на сообщениях из открытых чатов лучше сменить, кажется, что он закрыт и сообщение зашифровано».
В списке сообщений значок ростом в строку — это несколько пикселей. Открытый замок от закрытого отличается дужкой, и в этом размере дужку просто не видно. Хуже того, замок рядом с сообщением вообще воспринимается как знак качества: раз есть замок — значит защищено. Значок сказал ровно противоположное тому, что имелось в виду.
Заменили словами: «без шифра». Двенадцать символов вместо иконки, зато догадываться не надо.
Ложная тревога, которую устроил себе я
Третья история — про проверку, а не про продукт, и поэтому она здесь.
Проверяя новую пометку, я отправил с одной платы открытое сообщение на другую. Журнал приёма показал: пакет принят, разобран, текст целый. В приложении — ничего. Полчаса ушло на поиски обрыва в цепочке «рация — Bluetooth — телефон»: длина пакета, новый байт в конце, разбор на стороне приложения.
Обрыва не было. В проверке я указал адрес получателя FFFF, по привычке из других протоколов, где это широковещательный адрес. В MeshTRX широковещательный адрес — нули. Рация честно посмотрела: сообщение не мне и не всем, — и выбросила его. Всё работало правильно, неправильным был тест.
Вывод скучный, но его стоит повторять: прежде чем искать ошибку в системе, проверьте инструмент, которым вы её ищете.
Почему стенд этого не ловит
У проекта есть стенд: две платы, телефон, около шестидесяти проверок. Он находит многое и экономит часы. Ни одну из трёх историй выше он бы не нашёл.
Причина у всех трёх общая. Стенд ходит к прошивке своими путями — через команды тестовой консоли, а не через приложение. Пути похожи, но не совпадают. Однажды это обошлось особенно дорого: текст с телефона несколько дней уходил в эфир без шифрования, потому что у отправки текста два пути — через очередь и напрямую, — стенд ходил очередью, шифрование было включено только там, а телефон слал напрямую. Люди писали, что с ключом связь не работает, а на стенде всё было зелёным.
Стенд отвечает на вопрос «работает ли то, что мы задумали». Он не отвечает на вопрос «то ли мы задумали» и уж точно не на вопрос «поймёт ли это человек».
Что помогает
Живое устройство под рукой. С тех пор как к проверкам добавился настоящий телефон, с которого можно снять изображение экрана и прочитать, что там написано словами, ошибки этого класса стали находиться за минуты: у сообщения либо есть подпись «без шифра», либо её нет, и спорить не о чем.
И группа. «Не работает» проверить нельзя, а «не смог сменить канал у всех, у меня одна нода с шифрованием, другая открытая» — можно, и это заняло двадцать минут вместе с выпуском. Половина ценности сообщения из группы не в жалобе, а в подробностях вокруг неё.
Что рация умеет сегодня — в документации. Что в работе и что отложено — на странице проекта. Наблюдения из эфира всегда ждём в группе Telegram.