87 #include "contiki-net.h"
88 #include "contiki-lib.h"
89 #include "lib/random.h"
92 #include "net/rpl/rpl.h"
97 #include "tcp-socket.h"
98 #include "udp-socket.h"
105 #define MQTT_CLIENT_ID_MAX_LEN 23
108 #define MQTT_TCP_INPUT_BUFF_SIZE 512
109 #define MQTT_TCP_OUTPUT_BUFF_SIZE 512
111 #define MQTT_INPUT_BUFF_SIZE 512
112 #define MQTT_MAX_TOPIC_LENGTH 64
113 #define MQTT_MAX_TOPICS_PER_SUBSCRIBE 1
115 #define MQTT_FHDR_SIZE 1
116 #define MQTT_MAX_REMAINING_LENGTH_BYTES 4
117 #define MQTT_PROTOCOL_VERSION 3
118 #define MQTT_PROTOCOL_NAME "MQIsdp"
119 #define MQTT_TOPIC_MAX_LENGTH 128
128 #define DBG(...) printf(__VA_ARGS__)
133 extern process_event_t mqtt_update_event;
136 struct mqtt_connection;
147 MQTT_EVENT_CONNECTED,
148 MQTT_EVENT_DISCONNECTED,
156 MQTT_EVENT_ERROR = 0x80,
157 MQTT_EVENT_PROTOCOL_ERROR,
158 MQTT_EVENT_CONNECTION_REFUSED_ERROR,
159 MQTT_EVENT_DNS_ERROR,
160 MQTT_EVENT_NOT_IMPLEMENTED_ERROR,
167 MQTT_STATUS_OUT_QUEUE_FULL,
170 MQTT_STATUS_ERROR = 0x80,
171 MQTT_STATUS_NOT_CONNECTED_ERROR,
172 MQTT_STATUS_INVALID_ARGS_ERROR,
173 MQTT_STATUS_DNS_ERROR,
183 MQTT_QOS_STATE_NO_ACK,
184 MQTT_QOS_STATE_GOT_ACK,
196 MQTT_CONN_STATE_ERROR,
197 MQTT_CONN_STATE_DNS_ERROR,
198 MQTT_CONN_STATE_DISCONNECTING,
200 MQTT_CONN_STATE_NOT_CONNECTED,
201 MQTT_CONN_STATE_DNS_LOOKUP,
202 MQTT_CONN_STATE_TCP_CONNECTING,
203 MQTT_CONN_STATE_TCP_CONNECTED,
204 MQTT_CONN_STATE_CONNECTING_TO_BROKER,
205 MQTT_CONN_STATE_CONNECTED_TO_BROKER,
206 MQTT_CONN_STATE_SENDING_MQTT_DISCONNECT,
207 MQTT_CONN_STATE_ABORT_IMMEDIATE,
222 struct mqtt_suback_event {
224 mqtt_qos_level_t qos_level;
228 struct mqtt_message {
230 char topic[MQTT_MAX_TOPIC_LENGTH + 1];
232 uint8_t *payload_chunk;
233 uint16_t payload_chunk_length;
236 uint16_t payload_length;
237 uint16_t payload_left;
241 struct mqtt_in_packet {
243 struct mqtt_connection *next;
247 uint32_t byte_counter;
248 uint8_t packet_received;
251 uint16_t remaining_length;
255 uint8_t remaining_multiplier;
256 uint8_t has_remaining_length;
257 uint8_t remaining_length_bytes;
263 uint8_t payload[MQTT_INPUT_BUFF_SIZE];
268 uint8_t topic_len_received;
269 uint8_t topic_received;
273 struct mqtt_out_packet {
275 uint32_t remaining_length;
276 uint8_t remaining_length_enc[MQTT_MAX_REMAINING_LENGTH_BYTES];
277 uint8_t remaining_length_enc_bytes;
280 uint16_t topic_length;
282 uint32_t payload_size;
283 mqtt_qos_level_t qos;
284 mqtt_qos_state_t qos_state;
285 mqtt_retain_t retain;
302 typedef void (*mqtt_topic_callback_t)(
struct mqtt_connection *m,
303 struct mqtt_message *msg);
306 struct mqtt_string topic;
307 struct mqtt_string message;
308 mqtt_qos_level_t qos;
311 struct mqtt_credentials {
312 struct mqtt_string username;
313 struct mqtt_string password;
316 struct mqtt_connection {
318 struct mqtt_connection *next;
321 struct mqtt_string client_id;
323 uint8_t connect_vhdr_flags;
324 uint8_t auto_reconnect;
327 struct ctimer keep_alive_timer;
328 uint8_t waiting_for_pingresp;
330 struct mqtt_will will;
331 struct mqtt_credentials credentials;
333 mqtt_conn_state_t state;
337 uint16_t mid_counter;
340 uint8_t out_queue_full;
341 struct process *app_process;
344 uint8_t *out_buffer_ptr;
345 uint8_t out_buffer[MQTT_TCP_OUTPUT_BUFF_SIZE];
346 uint8_t out_buffer_sent;
347 struct mqtt_out_packet out_packet;
348 struct pt out_proto_thread;
349 uint32_t out_write_pos;
350 uint16_t max_segment_size;
353 uint8_t in_buffer[MQTT_TCP_INPUT_BUFF_SIZE];
354 struct mqtt_in_packet in_packet;
355 struct mqtt_message in_publish_msg;
359 uip_ipaddr_t server_ip;
360 uint16_t server_port;
361 struct tcp_socket socket;
381 struct process *app_process,
384 uint16_t max_segment_size);
398 mqtt_status_t
mqtt_connect(
struct mqtt_connection *conn,
401 uint16_t keep_alive);
424 mqtt_qos_level_t qos_level);
455 mqtt_status_t
mqtt_publish(
struct mqtt_connection *conn,
459 uint32_t payload_size,
460 mqtt_qos_level_t qos_level,
461 mqtt_retain_t retain);
496 mqtt_qos_level_t qos);
498 #define mqtt_connected(conn) \
499 ((conn)->state == MQTT_CONN_STATE_CONNECTED_TO_BROKER ? 1 : 0)
501 #define mqtt_ready(conn) \
502 (!(conn)->out_queue_full && mqtt_connected((conn)))
mqtt_status_t mqtt_connect(struct mqtt_connection *conn, char *host, uint16_t port, uint16_t keep_alive)
Connects to a MQTT broker.
mqtt_status_t mqtt_register(struct mqtt_connection *conn, struct process *app_process, char *client_id, mqtt_event_callback_t event_callback, uint16_t max_segment_size)
Initializes the MQTT engine.
mqtt_status_t mqtt_publish(struct mqtt_connection *conn, uint16_t *mid, char *topic, uint8_t *payload, uint32_t payload_size, mqtt_qos_level_t qos_level, mqtt_retain_t retain)
Publish to a MQTT topic.
Header file for IPv6-related data structures.
void mqtt_disconnect(struct mqtt_connection *conn)
Disconnects from a MQTT broker.
mqtt_event_t
MQTT engine events.
Header file for the callback timer
void mqtt_set_username_password(struct mqtt_connection *conn, char *username, char *password)
Set the user name and password for a MQTT client.
Header file for the uIP TCP/IP stack.
void mqtt_set_last_will(struct mqtt_connection *conn, char *topic, char *message, mqtt_qos_level_t qos)
Set the last will topic and message for a MQTT client.
mqtt_status_t mqtt_unsubscribe(struct mqtt_connection *conn, uint16_t *mid, char *topic)
Unsubscribes from a MQTT topic.
mqtt_status_t mqtt_subscribe(struct mqtt_connection *conn, uint16_t *mid, char *topic, mqtt_qos_level_t qos_level)
Subscribes to a MQTT topic.
void(* mqtt_event_callback_t)(struct mqtt_connection *m, mqtt_event_t event, void *data)
MQTT event callback function.