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_CLIENT_ID_MAX_LEN 23 107 #define MQTT_TCP_INPUT_BUFF_SIZE 512 108 #define MQTT_TCP_OUTPUT_BUFF_SIZE 512 110 #define MQTT_INPUT_BUFF_SIZE 512 111 #define MQTT_MAX_TOPIC_LENGTH 64 112 #define MQTT_MAX_TOPICS_PER_SUBSCRIBE 1 114 #define MQTT_FHDR_SIZE 1 115 #define MQTT_MAX_REMAINING_LENGTH_BYTES 4 116 #define MQTT_PROTOCOL_VERSION 3 117 #define MQTT_PROTOCOL_NAME "MQIsdp" 118 #define MQTT_TOPIC_MAX_LENGTH 128 127 #define DBG(...) printf(__VA_ARGS__) 132 extern process_event_t mqtt_update_event;
135 struct mqtt_connection;
146 MQTT_EVENT_CONNECTED,
147 MQTT_EVENT_DISCONNECTED,
155 MQTT_EVENT_ERROR = 0x80,
156 MQTT_EVENT_PROTOCOL_ERROR,
157 MQTT_EVENT_CONNECTION_REFUSED_ERROR,
158 MQTT_EVENT_DNS_ERROR,
159 MQTT_EVENT_NOT_IMPLEMENTED_ERROR,
166 MQTT_STATUS_OUT_QUEUE_FULL,
169 MQTT_STATUS_ERROR = 0x80,
170 MQTT_STATUS_NOT_CONNECTED_ERROR,
171 MQTT_STATUS_INVALID_ARGS_ERROR,
172 MQTT_STATUS_DNS_ERROR,
182 MQTT_QOS_STATE_NO_ACK,
183 MQTT_QOS_STATE_GOT_ACK,
195 MQTT_CONN_STATE_ERROR,
196 MQTT_CONN_STATE_DNS_ERROR,
197 MQTT_CONN_STATE_DISCONNECTING,
198 MQTT_CONN_STATE_ABORT_IMMEDIATE,
199 MQTT_CONN_STATE_NOT_CONNECTED,
200 MQTT_CONN_STATE_DNS_LOOKUP,
201 MQTT_CONN_STATE_TCP_CONNECTING,
202 MQTT_CONN_STATE_TCP_CONNECTED,
203 MQTT_CONN_STATE_CONNECTING_TO_BROKER,
204 MQTT_CONN_STATE_CONNECTED_TO_BROKER,
205 MQTT_CONN_STATE_SENDING_MQTT_DISCONNECT,
220 struct mqtt_suback_event {
222 mqtt_qos_level_t qos_level;
226 struct mqtt_message {
228 char topic[MQTT_MAX_TOPIC_LENGTH + 1];
230 uint8_t *payload_chunk;
231 uint16_t payload_chunk_length;
234 uint16_t payload_length;
235 uint16_t payload_left;
239 struct mqtt_in_packet {
241 struct mqtt_connection *next;
245 uint32_t byte_counter;
246 uint8_t packet_received;
249 uint16_t remaining_length;
253 uint8_t remaining_multiplier;
254 uint8_t has_remaining_length;
255 uint8_t remaining_length_bytes;
261 uint8_t payload[MQTT_INPUT_BUFF_SIZE];
266 uint8_t topic_len_received;
267 uint8_t topic_received;
271 struct mqtt_out_packet {
273 uint32_t remaining_length;
274 uint8_t remaining_length_enc[MQTT_MAX_REMAINING_LENGTH_BYTES];
275 uint8_t remaining_length_enc_bytes;
278 uint16_t topic_length;
280 uint32_t payload_size;
281 mqtt_qos_level_t qos;
282 mqtt_qos_state_t qos_state;
283 mqtt_retain_t retain;
300 typedef void (*mqtt_topic_callback_t)(
struct mqtt_connection *m,
301 struct mqtt_message *msg);
304 struct mqtt_string topic;
305 struct mqtt_string message;
306 mqtt_qos_level_t qos;
309 struct mqtt_credentials {
310 struct mqtt_string username;
311 struct mqtt_string password;
314 struct mqtt_connection {
316 struct mqtt_connection *next;
319 struct mqtt_string client_id;
321 uint8_t connect_vhdr_flags;
322 uint8_t auto_reconnect;
325 struct ctimer keep_alive_timer;
326 uint8_t waiting_for_pingresp;
328 struct mqtt_will will;
329 struct mqtt_credentials credentials;
331 mqtt_conn_state_t state;
335 uint16_t mid_counter;
338 uint8_t out_queue_full;
339 struct process *app_process;
342 uint8_t *out_buffer_ptr;
343 uint8_t out_buffer[MQTT_TCP_OUTPUT_BUFF_SIZE];
344 uint8_t out_buffer_sent;
345 struct mqtt_out_packet out_packet;
346 struct pt out_proto_thread;
347 uint32_t out_write_pos;
348 uint16_t max_segment_size;
351 uint8_t in_buffer[MQTT_TCP_INPUT_BUFF_SIZE];
352 struct mqtt_in_packet in_packet;
353 struct mqtt_message in_publish_msg;
357 uip_ipaddr_t server_ip;
358 uint16_t server_port;
359 struct tcp_socket socket;
379 struct process *app_process,
382 uint16_t max_segment_size);
396 mqtt_status_t
mqtt_connect(
struct mqtt_connection *conn,
399 uint16_t keep_alive);
422 mqtt_qos_level_t qos_level);
453 mqtt_status_t
mqtt_publish(
struct mqtt_connection *conn,
457 uint32_t payload_size,
458 mqtt_qos_level_t qos_level,
459 mqtt_retain_t retain);
494 mqtt_qos_level_t qos);
496 #define mqtt_connected(conn) \ 497 ((conn)->state == MQTT_CONN_STATE_CONNECTED_TO_BROKER ? 1 : 0) 499 #define mqtt_ready(conn) \ 500 (!(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_connect(struct mqtt_connection *conn, char *host, uint16_t port, uint16_t keep_alive)
Connects to a MQTT broker.
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.