87 #include "contiki-net.h" 88 #include "contiki-lib.h" 89 #include "lib/random.h" 96 #include "tcp-socket.h" 97 #include "udp-socket.h" 104 #define MQTT_PROTOCOL_VERSION_3_1 3 105 #define MQTT_PROTOCOL_VERSION_3_1_1 4 106 #define MQTT_PROTOCOL_VERSION_5 5 108 #ifdef MQTT_CONF_VERSION 109 #define MQTT_PROTOCOL_VERSION MQTT_CONF_VERSION 111 #define MQTT_PROTOCOL_VERSION MQTT_PROTOCOL_VERSION_3_1 114 #if MQTT_PROTOCOL_VERSION == MQTT_PROTOCOL_VERSION_5 116 #elif MQTT_PROTOCOL_VERSION == MQTT_PROTOCOL_VERSION_3_1_1 118 #elif MQTT_PROTOCOL_VERSION == MQTT_PROTOCOL_VERSION_3_1 122 #define MQTT_CLIENT_ID_MAX_LEN 23 125 #define MQTT_TCP_INPUT_BUFF_SIZE 512 126 #define MQTT_TCP_OUTPUT_BUFF_SIZE 512 128 #define MQTT_INPUT_BUFF_SIZE 512 129 #define MQTT_MAX_TOPIC_LENGTH 64 130 #define MQTT_MAX_TOPICS_PER_SUBSCRIBE 1 132 #define MQTT_FHDR_SIZE 1 133 #define MQTT_MAX_REMAINING_LENGTH_BYTES 4 135 #define MQTT_PROTOCOL_NAME "MQIsdp" 137 #define MQTT_PROTOCOL_NAME "MQTT" 140 #define MQTT_TOPIC_MAX_LENGTH 128 142 #if MQTT_PROTOCOL_VERSION >= MQTT_PROTOCOL_VERSION_3_1_1 143 #ifdef MQTT_CONF_SUPPORTS_EMPTY_CLIENT_ID 144 #define MQTT_SRV_SUPPORTS_EMPTY_CLIENT_ID MQTT_CONF_SUPPORTS_EMPTY_CLIENT_ID 146 #define MQTT_SRV_SUPPORTS_EMPTY_CLIENT_ID 0 149 #define MQTT_SRV_SUPPORTS_EMPTY_CLIENT_ID 0 159 #define DBG(...) printf(__VA_ARGS__) 164 extern process_event_t mqtt_update_event;
167 struct mqtt_connection;
175 MQTT_CLEAN_SESSION_OFF,
176 MQTT_CLEAN_SESSION_ON,
177 } mqtt_clean_session_t;
183 MQTT_EVENT_CONNECTED,
184 MQTT_EVENT_DISCONNECTED,
192 MQTT_EVENT_ERROR = 0x80,
193 MQTT_EVENT_PROTOCOL_ERROR,
194 MQTT_EVENT_CONNECTION_REFUSED_ERROR,
195 MQTT_EVENT_DNS_ERROR,
196 MQTT_EVENT_NOT_IMPLEMENTED_ERROR,
203 MQTT_STATUS_OUT_QUEUE_FULL,
206 MQTT_STATUS_ERROR = 0x80,
207 MQTT_STATUS_NOT_CONNECTED_ERROR,
208 MQTT_STATUS_INVALID_ARGS_ERROR,
209 MQTT_STATUS_DNS_ERROR,
219 MQTT_QOS_STATE_NO_ACK,
220 MQTT_QOS_STATE_GOT_ACK,
237 MQTT_CONN_STATE_ERROR,
238 MQTT_CONN_STATE_DNS_ERROR,
239 MQTT_CONN_STATE_DISCONNECTING,
240 MQTT_CONN_STATE_ABORT_IMMEDIATE,
241 MQTT_CONN_STATE_NOT_CONNECTED,
242 MQTT_CONN_STATE_DNS_LOOKUP,
243 MQTT_CONN_STATE_TCP_CONNECTING,
244 MQTT_CONN_STATE_TCP_CONNECTED,
245 MQTT_CONN_STATE_CONNECTING_TO_BROKER,
246 MQTT_CONN_STATE_CONNECTED_TO_BROKER,
247 MQTT_CONN_STATE_SENDING_MQTT_DISCONNECT,
264 mqtt_qos_level_t qos_level;
269 } mqtt_suback_event_t;
272 uint8_t session_present;
273 } mqtt_connack_event_t;
276 struct mqtt_message {
278 char topic[MQTT_MAX_TOPIC_LENGTH + 1];
280 uint8_t *payload_chunk;
281 uint16_t payload_chunk_length;
284 uint16_t payload_length;
285 uint16_t payload_left;
289 struct mqtt_in_packet {
291 struct mqtt_connection *next;
295 uint32_t byte_counter;
296 uint8_t packet_received;
299 uint16_t remaining_length;
303 uint8_t remaining_multiplier;
304 uint8_t has_remaining_length;
305 uint8_t remaining_length_bytes;
311 uint8_t payload[MQTT_INPUT_BUFF_SIZE];
316 uint8_t topic_len_received;
317 uint8_t topic_received;
321 struct mqtt_out_packet {
323 uint32_t remaining_length;
324 uint8_t remaining_length_enc[MQTT_MAX_REMAINING_LENGTH_BYTES];
325 uint8_t remaining_length_enc_bytes;
328 uint16_t topic_length;
330 uint32_t payload_size;
331 mqtt_qos_level_t qos;
332 mqtt_qos_state_t qos_state;
333 mqtt_retain_t retain;
350 typedef void (*mqtt_topic_callback_t)(
struct mqtt_connection *m,
351 struct mqtt_message *msg);
354 struct mqtt_string topic;
355 struct mqtt_string message;
356 mqtt_qos_level_t qos;
359 struct mqtt_credentials {
360 struct mqtt_string username;
361 struct mqtt_string password;
364 struct mqtt_connection {
366 struct mqtt_connection *next;
369 struct mqtt_string client_id;
371 uint8_t connect_vhdr_flags;
372 uint8_t auto_reconnect;
375 struct ctimer keep_alive_timer;
376 uint8_t waiting_for_pingresp;
378 struct mqtt_will will;
379 struct mqtt_credentials credentials;
381 mqtt_conn_state_t state;
385 uint16_t mid_counter;
388 uint8_t out_queue_full;
389 struct process *app_process;
392 uint8_t *out_buffer_ptr;
393 uint8_t out_buffer[MQTT_TCP_OUTPUT_BUFF_SIZE];
394 uint8_t out_buffer_sent;
395 struct mqtt_out_packet out_packet;
396 struct pt out_proto_thread;
397 uint32_t out_write_pos;
398 uint16_t max_segment_size;
401 uint8_t in_buffer[MQTT_TCP_INPUT_BUFF_SIZE];
402 struct mqtt_in_packet in_packet;
403 struct mqtt_message in_publish_msg;
407 uip_ipaddr_t server_ip;
408 uint16_t server_port;
409 struct tcp_socket socket;
429 struct process *app_process,
432 uint16_t max_segment_size);
448 mqtt_status_t
mqtt_connect(
struct mqtt_connection *conn,
452 uint8_t clean_session);
475 mqtt_qos_level_t qos_level);
506 mqtt_status_t
mqtt_publish(
struct mqtt_connection *conn,
510 uint32_t payload_size,
511 mqtt_qos_level_t qos_level,
512 mqtt_retain_t retain);
547 mqtt_qos_level_t qos);
549 #define mqtt_connected(conn) \ 550 ((conn)->state == MQTT_CONN_STATE_CONNECTED_TO_BROKER ? 1 : 0) 552 #define mqtt_ready(conn) \ 553 (!(conn)->out_queue_full && mqtt_connected((conn))) 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.
mqtt_event_t
MQTT engine events.
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.
void(* mqtt_event_callback_t)(struct mqtt_connection *m, mqtt_event_t event, void *data)
MQTT event callback function.
Header file for IPv6-related data structures.
Header file for the callback timer
mqtt_status_t mqtt_unsubscribe(struct mqtt_connection *conn, uint16_t *mid, char *topic)
Unsubscribes from a MQTT topic.
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.
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.
void mqtt_disconnect(struct mqtt_connection *conn)
Disconnects from a MQTT broker.
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.
Header file for the LED HAL.
mqtt_status_t mqtt_connect(struct mqtt_connection *conn, char *host, uint16_t port, uint16_t keep_alive, uint8_t clean_session)
Connects to a MQTT broker.