MQTT/UDP
Скидка версии MQTT Over UDP: сеть - брокер!
Примечание другое репо: https://gitverse.ru/dzavalishin/mqtt_udp
См. Русскую версию / Рускую
MQTT - это милый простой протокол, хорошо подходящий для IoT и похожих вещей.
Но это может быть еще проще и при этом быть очень полезным: MQTT/UDP - это просто пакеты MQTT Publish, транслируемые над UDP.
MQTT/UDP
- Чрезвычайно просто
- Чрезвычайно быстрая, минимальная возможная задержка
- Исключает брокер (что является единственной точкой отказа)
- Понижает сетевой трафик (каждое мусорное устройство отправляется ровно один раз для всех)
- Разумно надежно (если мы используем его для датчиков, которые обычно приносят данные каждые несколько секунд или около того)
- Может быть поддержан даже на аппаратном обеспечении, которое не может поддержать TCP - на самом деле требуется только отправка UDP
- Нулевая конфигурация - Узел датчика не нуждается в настройке, он просто транслирует свои данные. (И, если вам все еще нужно, MQTT/UDP поддерживает удаленную конфигурацию по сети.)
- Поддерживает цифровую подпись
Для дальнейшего чтения
- MQTT/UDP WIKI
- Документация
Этот репозиторий содержит
- Простая реализация MQTT/UDP на некоторых популярных языках программирования.
- Самая простая реализация MQTT для MQTT/UDP Bridge в Pyton.
- Инструмент для отправки данных из MQTT/UDP в Openhab
- Приложение отладки для сброса трафика MQTT/UDP (инструменты/зритель).
- Другие инструменты и утилиты
Если вы хотите помочь проекту
Не стесняйтесь:
- Добавьте реализацию на свой любимый язык программирования
- Напишите мост для классического протокола MQTT (у нас есть очень простой здесь, написанный на Python)
- Расширить свой любимый брокер MQTT или IoT System (Openhab?) С поддержкой MQTT/UDP
- Проверьте спецификацию/реализацию MQTT/UDP против спецификации MQTT. Мы должны быть совместимы, где это возможно.
Это действительно легко.
Причины избежать MQTT/UDP
- Вам нужно перевести длинные полезные нагрузки. В некоторых системах размера DADP Datagram ограничен.
- Вам нужно знать, наверняка ли Datagram. Это невозможно с UDP. Тем не менее, надежная подсистема доставки сейчас развивается и скоро будет доступна.
Способы расширения MQTT/UDP
- Кажется разумным добавить какую -то подпись в пакеты, чтобы предотвратить подделку данных. На самом деле, это уже сделано для реализации Java, C и Pythin скоро появятся.
- Трансляция - не лучший способ передачи данных. Многоадресная расстояния намного лучше. Хотя многоадресная расстояния не так хорошо поддерживается в ОС или мониторах IoT.
Быстрое начало инструкции
- Репозиторий клона на местный диск
- Читать файл Howto
Инструменты поддержки
Этот репозиторий содержит инструменты для поддержки интеграции и теста MQTT/UDP:
- Инструмент GUI, чтобы показать текущее состояние данных, передаваемых в каталоге инструментов/просмотра; Смотрите также страницу справки просмотра.
- Случайный генератор данных (random_to_udp.py) в каталоге Python3/Примеров.
- Отправить/проверить инструмент для последовательно пронумерованных пакетов. См. SEQ_STORM_SEND.PY и SEQ_STORM_CHECK.PY в каталоге LANG/PYTHON3/Примеров
- Wireshark Discector, чтобы увидеть данные протокола в сети в каталоге Lang/Lua/Wireshark
Примеры кода
Питон
Отправить данные:
import mqttudp . engine
if __name__ == "__main__" :
mqttudp . engine . send_publish ( "test_topic" , "Hello, world!" ) Слушайте данные:
import mqttudp . engine
def recv_packet ( ptype , topic , value , pflags , addr ):
if ptype != "publish" :
print ( ptype + ", " + topic + " t t " + str ( addr ) )
return
print ( topic + "=" + value + " t t " + str ( addr ) )
if __name__ == "__main__" :
mqttudp . engine . listen ( recv_packet ) Скачать пакет PYPI
Ява
Отправить данные:
PublishPacket pkt = new PublishPacket ( topic , value );
pkt . send ();
Слушайте данные:
PacketSourceServer ss = new PacketSourceServer ();
ss . setSink ( pkt -> { System . out . println ( "Got packet: " + pkt ); }); Скачать JAR
В
Отправить данные:
int rc = mqtt_udp_send_publish ( topic , value );
Слушайте данные:
int main ( int argc , char * argv [])
{
...
int rc = mqtt_udp_recv_loop ( mqtt_udp_dump_any_pkt );
...
}
int mqtt_udp_dump_any_pkt ( struct mqtt_udp_pkt * o )
{
printf ( "pkt %x flags %x, id %d" ,
o -> ptype , o -> pflags , o -> pkt_id
);
if ( o -> topic_len > 0 )
printf ( " topic '%s'" , o -> topic );
if ( o -> value_len > 0 )
printf ( " = '%s'" , o -> value );
printf ( "n" );
}
Луа
Отправить данные:
local mq = require " mqtt_udp_lib "
mq . publish ( topic , val );
Слушайте данные:
local mq = require " mqtt_udp_lib "
local listener = function ( ptype , topic , value , ip , port )
print ( " ' " .. topic .. " ' = ' " .. val .. " ' " .. " from: " , ip , port )
end
mq . listen ( listener ) Скачать Luarock
Идти
Есть реализация языка GO, см. Lang/go для получения подробной информации