вторник, 17 декабря 2019 г.

Про организацию диалога

Тут должно быть какое-то начало для последующего текста.
Для такого нужна фантазия. Она у меня есть.
Как и у любого другого человека.
Работает она, увы, не по заказу.
Потому, я начну с середины.

--------------------

Вечер. Двое разговаривали. Небезмысленно.

- ... Или вот, например, диалог. Ди-а-лог. "А" опустим. Ди-логос. Двусловие?
  Нет, разговор между двумя.
- Почему только двумя?
- Наверное, с этого должно начаться. Это минимальное количество участников.
  Вопрос-ответ, Запрос-отклик. Две роли.
- А если больше? Скажем, трое.
- И кто же третий? Он тоже участник? Или "воно слухае"?
- С участником особые правила нужны. Мол, не перебивать и ещё что-то. Они и для
  двоих тоже нужны, а тут ещё и третий. Пусть, для простоты, будет "слухавка".
- "Слухавка" - это сложнее.

Вечер продолжался. Мысли не переставали стучать как камешки в погремушке...

--------------------

Вот вы. В штанах. С карман*а*ми! А в кармане ключи. От машины! С брелком. От
сигнализации! С экра-а-анчиком!
А вот и ваша машина. В ста метрах от вас. А в ней сигнализация. С мозгами.

Вот они - двое. Брелок от сигнализации и мозги сигнализации. Для простоты:
брелок и сигнализация. Задача - научить их разговаривать. Не с вами. Так, между
собой.

Подход к снаряду.
Несложно это сделать "без обратной связи". Нажал на кнопку на брелке включить
охрану. Она включилась. Нажал "выкл" - она выключилась. Только не известно,
"включилась ли" и "выключилась ли". Добавим обратную связь. Канал обратной
связи - аудио-визуальный. Мозги сигнализации пиликиают и моргают фарами
автомобиля. Оператор (зачастую, просто прокладка между сидением и рулём, но с
ушами и глазами) реагирует повторным нажатием с неудовлетворённой физией или
просто удовлетворённой физией. Значит - таки включилась охрана или выключилась.

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

Плохо дело. Нужно хозяину сообщить. Донести до него состояние сигнализации.
Автомобиль может быть "далеко", а вот брелок совсем рядом. Скорее всего.
Сообщим "на брелок". Добавим ещё один канал обратной связи. Прямой между
сигнализацией и брелком. Нажал "вкл". А сигнализация брелку "есть вкл!". И
клаксоном бип-боп. И фарами морг-морг.

Внимание! Вопрос! Как должен быть устроен протокол? Какая у него дожна быть
основа?

А кто у нас собеседники?
- Сигнализация. Обладает памятью. Состоянием. Состояние включает в себя режим
работы "охрана"/"не охрана" и состояние периметра на момент включения охраны.
// периметр = датчики: дверь открыта/отперта/заперта, капот поднят/опущен,
багажник открыт/закрыт/заперт, стекло опущено/поднято, двигатель
заведён/заглушен и ещё всякие каких только душа пожелает.
- Брелок. Обладает памятью (правда, зачем?). Отображает состояние сигнализации.

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

Потому, сигнализация должна всякий раз сообщать полное своё состояние. И при
отклике вида "есть вкл охрану!", и при оповещении "атас! дверь открылась!".
Отклик одноразовый. Потому как запрос всего один. Оповещение одноразовое же из
соображений безопасности. // одноразовый тут = отправляемый единожды

Казалось бы, всё. Однако нет. Канал связи между сигнализацией и брелком
нестабильный. Брелок может быть очень далеко, у брелка может сесть батарейка, у
автомобиля может сесть аккумулятор.

Состояние аккумулятора автомобиля можно ключить в периметр и, с добавлением,
автономного питания самой сигнализации давать оповещение на брелок.

Удаление брелка от автомобиля на достаточное, для потери сигнала расстояние,
вещь довольно штатная. Что бы знать актуальное состояние сигнализации брелок
может пинговать её. В ответ на ping должно быть не состояние, а просто pong.
Этот pong переводится на сигналко-брелячий язык как "какое состояние было,
такое и осталось". Если pong не поступил, на брелке отображается уведомление
вида "out-of-range" и теперь отправляются ping-и с запросом актуального
состояния, что бы его сразу же и вывести на экран. Интервал ping-ования
выбирается исходя из мощности приёмопередатчика брелка и сигнализации. Раз
хозяин далеко отошёл, то и идти к автомобилю ему долго. Минуту, пять...

Всё? Ан, нет. У нас ещё есть "слухавка".

Её задача выделить стартовое слово протокола, присущее только этой паре брелка
и сигнализации. Такое слово должно быть и оно есть в любом протоколе. Это
способ синхронизации двух потоков. Далее можно сам протокол опустить глубже -
под TLS. Не накладно ли будет? Накладно. Можно взять числа поменьше и всё
такое. Однако, это приведёт к снижению устойчивости к прослушиванию. Уменьшим
соотношение сигнал-шум. За ним - и дальность работы. Меняем параметрию канала
связи от пары "сигнализация-брекок" к паре. Всё равно мало.

А вот теперь вопрос. Что же можно менять "в runtime" такого и так, что не
требовалось бы перегенерировать при восстановлении связи?

С сим вопросом камешки в погремушке продолжили стучать...

--------------------
Ночь. Двое разговаривали. И лишь третий с упоением слушал и кряхтел в
попытке выделить из диалога хоть что-то полезное...
--------------------