Представьте себе два устройства, клиента и сервер, соединенные весьма своеобразным способом:
- сервер не может отправлять сообщения клиенту, пока клиент сам их не запросит;
- есть два возможных состояния соединения: включено или выключено;
- соединение ненадежное: оно может быть разорвано в любой момент, и ни клиент, ни сервер не узнают об этом, пока не попытаются отправить или получить данные.
Кажется невероятным? А ведь именно с такой задачей мне пришлось столкнуться на прошлой неделе. Ну, не совсем. На самом деле, я пытался наладить беспроводную связь между Arduino и старым кассетным магнитофоном. Не спрашивайте зачем, это долгая история…
В итоге, соединение удалось установить только через один светодиод на магнитофоне. Включен — 1, выключен — 0. Вот вам и 1 бит данных. И да, этот светодиод отвечал за индикацию записи, так что управлять им напрямую я не мог. Пришлось проявить смекалку!
Протокол «мигающий светодиод»
Итак, задача состояла в том, чтобы разработать протокол, который позволил бы серверу (Arduino) отправлять уведомления клиенту (магнитофону), используя только однонаправленный 1-битный канал связи. После нескольких бессонных ночей и литров кофе решение было найдено!
Суть протокола «мигающий светодиод» заключалась в следующем:
- Клиент периодически опрашивает сервер, проверяя состояние светодиода.
- Если сервер хочет отправить уведомление, он меняет состояние светодиода на противоположное в момент запроса клиента.
- Клиент, обнаружив изменение состояния светодиода, понимает, что есть новое уведомление.
Конечно, этот протокол далек от идеала. Он медленный, ненадежный и требует постоянного опроса со стороны клиента. Но, черт возьми, он работает!
В итоге, мне удалось «научить» Arduino отправлять уведомления на магнитофон, используя только мигающий светодиод. Это было похоже на магию! Конечно, практической пользы от этого изобретения немного, но сам процесс решения этой задачи доставил мне массу удовольствия. А что может быть важнее для настоящего гика?