mqtt.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #pragma once
  2. #include "net.h"
  3. #include "str.h"
  4. #define MQTT_CMD_CONNECT 1
  5. #define MQTT_CMD_CONNACK 2
  6. #define MQTT_CMD_PUBLISH 3
  7. #define MQTT_CMD_PUBACK 4
  8. #define MQTT_CMD_PUBREC 5
  9. #define MQTT_CMD_PUBREL 6
  10. #define MQTT_CMD_PUBCOMP 7
  11. #define MQTT_CMD_SUBSCRIBE 8
  12. #define MQTT_CMD_SUBACK 9
  13. #define MQTT_CMD_UNSUBSCRIBE 10
  14. #define MQTT_CMD_UNSUBACK 11
  15. #define MQTT_CMD_PINGREQ 12
  16. #define MQTT_CMD_PINGRESP 13
  17. #define MQTT_CMD_DISCONNECT 14
  18. #define MQTT_CMD_AUTH 15
  19. #define MQTT_PROP_PAYLOAD_FORMAT_INDICATOR 0x01
  20. #define MQTT_PROP_MESSAGE_EXPIRY_INTERVAL 0x02
  21. #define MQTT_PROP_CONTENT_TYPE 0x03
  22. #define MQTT_PROP_RESPONSE_TOPIC 0x08
  23. #define MQTT_PROP_CORRELATION_DATA 0x09
  24. #define MQTT_PROP_SUBSCRIPTION_IDENTIFIER 0x0B
  25. #define MQTT_PROP_SESSION_EXPIRY_INTERVAL 0x11
  26. #define MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER 0x12
  27. #define MQTT_PROP_SERVER_KEEP_ALIVE 0x13
  28. #define MQTT_PROP_AUTHENTICATION_METHOD 0x15
  29. #define MQTT_PROP_AUTHENTICATION_DATA 0x16
  30. #define MQTT_PROP_REQUEST_PROBLEM_INFORMATION 0x17
  31. #define MQTT_PROP_WILL_DELAY_INTERVAL 0x18
  32. #define MQTT_PROP_REQUEST_RESPONSE_INFORMATION 0x19
  33. #define MQTT_PROP_RESPONSE_INFORMATION 0x1A
  34. #define MQTT_PROP_SERVER_REFERENCE 0x1C
  35. #define MQTT_PROP_REASON_STRING 0x1F
  36. #define MQTT_PROP_RECEIVE_MAXIMUM 0x21
  37. #define MQTT_PROP_TOPIC_ALIAS_MAXIMUM 0x22
  38. #define MQTT_PROP_TOPIC_ALIAS 0x23
  39. #define MQTT_PROP_MAXIMUM_QOS 0x24
  40. #define MQTT_PROP_RETAIN_AVAILABLE 0x25
  41. #define MQTT_PROP_USER_PROPERTY 0x26
  42. #define MQTT_PROP_MAXIMUM_PACKET_SIZE 0x27
  43. #define MQTT_PROP_WILDCARD_SUBSCRIPTION_AVAILABLE 0x28
  44. #define MQTT_PROP_SUBSCRIPTION_IDENTIFIER_AVAILABLE 0x29
  45. #define MQTT_PROP_SHARED_SUBSCRIPTION_AVAILABLE 0x2A
  46. enum {
  47. MQTT_PROP_TYPE_BYTE,
  48. MQTT_PROP_TYPE_STRING,
  49. MQTT_PROP_TYPE_STRING_PAIR,
  50. MQTT_PROP_TYPE_BINARY_DATA,
  51. MQTT_PROP_TYPE_VARIABLE_INT,
  52. MQTT_PROP_TYPE_INT,
  53. MQTT_PROP_TYPE_SHORT
  54. };
  55. enum { MQTT_OK, MQTT_INCOMPLETE, MQTT_MALFORMED };
  56. struct mg_mqtt_prop {
  57. uint8_t id; // Enumerated at MQTT5 Reference
  58. uint32_t iv; // Integer value for 8-, 16-, 32-bit integers types
  59. struct mg_str key; // Non-NULL only for user property type
  60. struct mg_str val; // Non-NULL only for UTF-8 types and user properties
  61. };
  62. struct mg_mqtt_opts {
  63. struct mg_str user; // Username, can be empty
  64. struct mg_str pass; // Password, can be empty
  65. struct mg_str client_id; // Client ID
  66. struct mg_str topic; // message/subscription topic
  67. struct mg_str message; // message content
  68. uint8_t qos; // message quality of service
  69. uint8_t version; // Can be 4 (3.1.1), or 5. If 0, assume 4
  70. uint16_t keepalive; // Keep-alive timer in seconds
  71. bool retain; // Retain flag
  72. bool clean; // Clean session flag
  73. struct mg_mqtt_prop *props; // MQTT5 props array
  74. size_t num_props; // number of props
  75. struct mg_mqtt_prop *will_props; // Valid only for CONNECT packet (MQTT5)
  76. size_t num_will_props; // Number of will props
  77. };
  78. struct mg_mqtt_message {
  79. struct mg_str topic; // Parsed topic for PUBLISH
  80. struct mg_str data; // Parsed message for PUBLISH
  81. struct mg_str dgram; // Whole MQTT packet, including headers
  82. uint16_t id; // For PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK, PUBLISH
  83. uint8_t cmd; // MQTT command, one of MQTT_CMD_*
  84. uint8_t qos; // Quality of service
  85. uint8_t ack; // CONNACK return code, 0 = success
  86. size_t props_start; // Offset to the start of the properties (MQTT5)
  87. size_t props_size; // Length of the properties
  88. };
  89. struct mg_connection *mg_mqtt_connect(struct mg_mgr *, const char *url,
  90. const struct mg_mqtt_opts *opts,
  91. mg_event_handler_t fn, void *fn_data);
  92. struct mg_connection *mg_mqtt_listen(struct mg_mgr *mgr, const char *url,
  93. mg_event_handler_t fn, void *fn_data);
  94. void mg_mqtt_login(struct mg_connection *c, const struct mg_mqtt_opts *opts);
  95. void mg_mqtt_pub(struct mg_connection *c, const struct mg_mqtt_opts *opts);
  96. void mg_mqtt_sub(struct mg_connection *, const struct mg_mqtt_opts *opts);
  97. int mg_mqtt_parse(const uint8_t *, size_t, uint8_t, struct mg_mqtt_message *);
  98. void mg_mqtt_send_header(struct mg_connection *, uint8_t cmd, uint8_t flags,
  99. uint32_t len);
  100. void mg_mqtt_ping(struct mg_connection *);
  101. void mg_mqtt_pong(struct mg_connection *);
  102. void mg_mqtt_disconnect(struct mg_connection *, const struct mg_mqtt_opts *);
  103. size_t mg_mqtt_next_prop(struct mg_mqtt_message *, struct mg_mqtt_prop *,
  104. size_t ofs);