mqtt_udp
mqtt_udp copied to clipboard
Simpified version of MQTT over UDP
MQTT/UDP
Simpified version of MQTT over UDP: Network is broker!
See Russian version / Русская версия здесь
MQTT is a cute simple protocol well suited for IoT and similar things.
But it can be even simpler and still be very usable: MQTT/UDP is merely an MQTT Publish packets broadcast over an UDP.
MQTT/UDP is
- Extremely simple
- Extremely fast, minimal possible latency
- Excludes broker (which is single point of failure)
- Lowers network traffic (each masurement is sent exactly once to all)
- Reasonably reliable (if we use it for sensors, which usually resend data every few seconds or so)
- Can be supported even on a hardware which can not support TCP - in fact, only UDP send is required
- Zero configuration - a sensor node needs no setup, it just broadcasts its data. (And, if you still need it, MQTT/UDP supports remote configuration over network.)
- Supports digital signature
For further reading
- MQTT/UDP Wiki
- Documentation
This repository contains
- A simple MQTT/UDP implementation in some popular programming languages.
- A simplest MQTT to MQTT/UDP bridge implementation in Pyton.
- A tool to send data from MQTT/UDP to OpenHAB
- A debug application to dump MQTT/UDP traffic (tools/viewer).
- Other tools and utilities
If you want to help a project
Feel free to:
- Add implementation in your favorite programming language
- Write a bridge to classic MQTT protocol (we have very simple one here written in Python)
- Extend your favorite MQTT broker or IoT system (OpenHAB?) with MQTT/UDP support
- Check MQTT/UDP specification/implementation against MQTT spec. We must be compatible where possible.
It is really easy.
Reasons to avoid MQTT/UDP
- You need to transfer long payloads. On some systems size of UDP datagram is limited.
- You need to know if datagram was delivered for sure. It is impossible with UDP. Though, reliable delivery subsystem is being in development now and will be available soon.
Ways to extend MQTT/UDP
- It seems to be reasonable to add some kind of signature to packets to prevent data spoofing. Actually, it is already done for Java implementation, C and Pythin will come soon.
- Broadcast is not the best way to transmit data. Multicast is much better. Though multicast is not so well supported in IoT OS's or monitors.
Fast start instructions
- Clone repository to local disk
- Read HOWTO file
Support tools
This repository contains tools to support MQTT/UDP integration and test:
- GUI tool to show current state of data transmitted in tools/viewer directory; see also viewer help page.
- Random data generator (random_to_udp.py) in python3/examples directory
- Send/check tool for sequentially numbered packets. See seq_storm_send.py and seq_storm_check.py in lang/python3/examples directory
- WireShark dissector to see protocol data on the network in lang/lua/wireshark directory
Code examples
Python
Send data:
import mqttudp.engine
if __name__ == "__main__":
mqttudp.engine.send_publish( "test_topic", "Hello, world!" )
Listen for data:
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)
Download pypi package
Java
Send data:
PublishPacket pkt = new PublishPacket(topic, value);
pkt.send();
Listen for data:
PacketSourceServer ss = new PacketSourceServer();
ss.setSink( pkt -> { System.out.println("Got packet: "+pkt); });
Download JAR
C
Send data:
int rc = mqtt_udp_send_publish( topic, value );
Listen for data:
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");
}
Lua
Send data:
local mq = require "mqtt_udp_lib"
mq.publish( topic, val );
Listen for data:
local mq = require "mqtt_udp_lib"
local listener = function( ptype, topic, value, ip, port )
print("'"..topic.."' = '"..val.."'".." from: ", ip, port)
end
mq.listen( listener )
Download LuaRock