Несколько мыслей о моем опыте работы с TCP, UDP и MQTT, а также о некоторых дополнительных ресурсах для обзора.
С UDP я столкнулся с проблемой тихого сбоя, при которой приложение на одном сетевом узле, клиент, видит только некоторые из отправленных UDP-сообщений. Существует слишком много причин, по которым сетевой трафик может работать неправильно. Проблема с UDP заключается в том, что пакеты могут быть отброшены в значительной степени всякий раз, когда любой из узлов в сетевом пути между производителем пакетов и потребителем пакетов гарантирует. Смотрите википедию тему Потеря пакета .
Вопрос в том, какой у вас уровень потерь при любом текущем сетевом контексте. Так что, если это связь внутри локальной сети или подсети, уровень потерь может быть низким. В глобальной сети или в Интернете уровень потерь может быть довольно высоким. Пакеты UDP отбрасываются по ряду причин и маршрутизируются, однако сетевые условия позволяют при этом уменьшаться количество переходов. Отправка пакетов в большую пустоту без ответственности оставляет возможность молчаливых сбоев.
Похоже, в вашем случае достаточно простого подтверждения с повторной передачей после тайм-аута без получения подтверждения.
Я делал XML-сообщения через поддерживаемое TCP-соединение, и оно работало великолепно. У меня был слой, который доставлял полные сообщения каждое в буфере на прикладной уровень для обработки. Я использовал XML для упаковки сообщения с начальным тегом XML для начала сообщения и конечным тегом XML, чтобы узнать, когда было получено все сообщение.
У TCP действительно есть несколько функций, таких как последовательный порядок пакетов, отсутствие повторов, а наличие связанного транспортного механизма означает, что вы знаете, исчезает другой конец или нет, хотя для его обнаружения может потребоваться некоторое время. Подключение и отключение могут привести к задержкам, но не обременительным в обычных условиях, хотя сетевые условия могут привести к замедлению пропускной способности TCP.
MQTT - это протокол, который транспортируется сетевым транспортным уровнем, обычно TCP. MQTT использует модель публикации / подписки, поэтому сообщения не сохраняются. Поэтому, когда издатель публикует сообщение, если подписчик не подключен в то время, когда он подключается, он не увидит сообщение. MQTT в значительной степени в режиме реального времени, я полагаю, это и есть телеметрическая часть аббревиатуры. Мне нравится MQTT для небольших сообщений, и я проводил некоторые эксперименты с полезной нагрузкой JSON через MQTT, используя Mosquitto. См. Эту статью Надежная доставка сообщений с Mosquitto (MQTT) с обзором MQTT и качеством обслуживания. И посмотрите эту краткую статью со ссылками на ресурсы, включая пример приложения IoT - MQTT Publish и Subscriber C Code .
Мои эксперименты с MQTT с использованием текста JSON и базы данных SQLite3 в подписчике для хранения сообщений проводятся по адресу https://github.com/RichardChambers/raspberrypi/tree/master/mqtt, хотя источник находится на C и довольно грязный.
Вот 13-минутное видео # 144 Интернет-протоколы: CoAP против MQTT, сетевой сниффинг и подготовка к IKEA Tradfri Hacking . Это интересная статья о CoAP, протоколе ограниченных приложений: CoAP - это «современный» протокол IoT . Вот это суммирование CoAP:
Ранние пользователи соглашаются с тем, что протокол ограниченных приложений работает очень хорошо для ограниченных сетей и устройств. Что-то не так хорошо известно: «В очень перегруженной беспроводной сети - Wi-Fi или сотовой связи - CoAP может продолжать работать, когда протокол на основе протокола управления передачей (TCP), такой как MQTT, даже не может выполнить рукопожатие, "Вермилард сказал.
Это потому, что в отличие от большинства других протоколов IoT, CoAP построен на UDP. Другими словами, это означает отсутствие протоколов рукопожатия или исправления ошибок, как в случае с TCP. «CoAP может быть не таким надежным, как HTTP или гарантировать доставку сообщений, таких как MQTT, но он очень быстрый», - отметил Матье. «Если у вас все в порядке с некоторыми сообщениями, которые не были получены, вы можете отправить гораздо больше сообщений в течение того же периода».
Есть несколько других, таких как AMQP, STOMP и CBOR, которые вы также можете посмотреть. См. Стандартный веб-сайт CBOR, а также этот тезис « Внедрение и оценка протокола CBOR» . См. Эту статью Выбор протокола обмена сообщениями: AMQP, MQTT или STOMP, которая сравнивает и сравнивает AMQP, MQTT и STOMP и заканчивается примечанием о брокере RabitMQ:
Надеемся, что это может помочь многим начать ориентироваться в супе протокола для каждого из ваших вариантов использования. Поскольку для компаний характерно наличие множества приложений с разными потребностями, вполне возможно, что вам могут понадобиться все три брокера в разных приложениях. Вот тут-то и появился солидный многопротокольный брокер полиглотов, такой как RabbitMQ, поскольку он может отправлять STOMP, MQTT или AMQP и выводить одного из них. Вам не нужно блокироваться одним из этих протоколов - все три поддерживаются брокером RabbitMQ, что делает его идеальным выбором для взаимодействия между приложениями. Архитектура плагинов также позволяет RabbitMQ развиваться для поддержки дополнительных или обновленных версий этих протоколов в будущем.
Этот пакет слайдов, состоящий примерно из 60 слайдов, позволяет сравнивать и сравнивать четыре разных протокола IoT с учетом потребностей двух разных групп IoT: потребителей и промышленных компаний, которые имеют разные потребности в надежности и надежности. Какой правильный стандарт обмена сообщениями для IoT? ,
Ack
В этом нет необходимости. Я думаю, что работа над надежностью поверх UDP не имеет особого смысла, для этого и нужен TCP.