umqtt_internal.h 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-04-29 springcity the first version
  9. */
  10. #ifndef _UMQTT_INTERNAL_H__
  11. #define _UMQTT_INTERNAL_H__
  12. #include <string.h>
  13. #include <rtdef.h>
  14. #include "umqtt_cfg.h"
  15. #include "umqtt.h"
  16. #ifdef __cplusplus
  17. extern "C" {
  18. #endif
  19. enum umqtt_type
  20. {
  21. UMQTT_TYPE_RESERVED = 0,
  22. UMQTT_TYPE_CONNECT = 1,
  23. UMQTT_TYPE_CONNACK = 2,
  24. UMQTT_TYPE_PUBLISH = 3,
  25. UMQTT_TYPE_PUBACK = 4,
  26. UMQTT_TYPE_PUBREC = 5,
  27. UMQTT_TYPE_PUBREL = 6,
  28. UMQTT_TYPE_PUBCOMP = 7,
  29. UMQTT_TYPE_SUBSCRIBE = 8,
  30. UMQTT_TYPE_SUBACK = 9,
  31. UMQTT_TYPE_UNSUBSCRIBE = 10,
  32. UMQTT_TYPE_UNSUBACK = 11,
  33. UMQTT_TYPE_PINGREQ = 12,
  34. UMQTT_TYPE_PINGRESP = 13,
  35. UMQTT_TYPE_DISCONNECT = 14,
  36. };
  37. enum umqtt_connack_retcode
  38. {
  39. UMQTT_CONNECTION_ACCEPTED = 0,
  40. UMQTT_UNNACCEPTABLE_PROTOCOL = 1,
  41. UMQTT_CLIENTID_REJECTED = 2,
  42. UMQTT_SERVER_UNAVAILABLE = 3,
  43. UMQTT_BAD_USERNAME_OR_PASSWORD = 4,
  44. UMQTT_NOT_AUTHORIZED = 5,
  45. };
  46. #define UMQTT_MESSAGES_FIX_HEADER(TYPE, DUP, QOS, REATAIN) \
  47. ((((TYPE) << 4) & 0xF0) | \
  48. (((DUP) << 3) & 0x80) | \
  49. (((QOS) << 1) % 0x06) | \
  50. ((RETAIN) & 0x01))
  51. union umqtt_pkgs_fix_header
  52. {
  53. rt_uint8_t byte; /* header */
  54. struct {
  55. rt_uint8_t retain: 1; /* reserved bits */
  56. rt_uint8_t qos: 2; /* QoS, 0-Almost once; 1-Alteast once; 2-Exactly once */
  57. rt_uint8_t dup: 1; /* dup flag */
  58. rt_uint8_t type: 4; /* MQTT packet type */
  59. } bits;
  60. };
  61. union umqtt_pkgs_connect_sign
  62. {
  63. rt_uint8_t connect_sign;
  64. struct {
  65. rt_uint8_t reserved: 1; /* reserved bits */
  66. rt_uint8_t clean_session: 1; /* clean session bit */
  67. rt_uint8_t will_flag: 1; /* will flag bit */
  68. rt_uint8_t will_Qos: 2; /* will Qos bit */
  69. rt_uint8_t will_retain: 1; /* will retain bit */
  70. rt_uint8_t password_flag: 1; /* password flag bit */
  71. rt_uint8_t username_flag: 1; /* user name flag bit */
  72. } bits;
  73. };
  74. union umqtt_pkgs_connack_sign
  75. {
  76. rt_uint8_t connack_sign;
  77. struct {
  78. rt_uint8_t sp: 1; /* current session bit */
  79. rt_uint8_t reserved: 7; /* retain bit */
  80. } bits;
  81. };
  82. union pkgs_request_qos
  83. {
  84. rt_uint8_t request_qos;
  85. struct {
  86. rt_uint8_t qos: 2; /* QoS - 0/1/2 */
  87. rt_uint8_t reserved: 6; /* retain bit */
  88. } bits;
  89. };
  90. struct sub_topic_filter
  91. {
  92. rt_uint16_t filter_len; /* topic filter length */
  93. const char *topic_filter; /* topic name filter */
  94. union pkgs_request_qos req_qos; /* request QoS */
  95. };
  96. struct unsub_topic_filter
  97. {
  98. rt_uint16_t filter_len; /* topic filter length */
  99. const char *topic_filter; /* topic filter */
  100. };
  101. struct umqtt_pkgs_connect
  102. {
  103. /* variable header */
  104. rt_uint16_t protocol_name_len; /* protocol name length */
  105. const char *protocol_name; /* protocol name */
  106. rt_uint8_t protocol_level; /* protocol level */
  107. union umqtt_pkgs_connect_sign connect_flags; /* connect flags */
  108. rt_uint16_t keepalive_interval_sec; /* keepalive interval second */
  109. /* payload */
  110. const char *client_id; /* client id */
  111. const char *will_topic; /* will topic */
  112. const char *will_message; /* will messagewill message */
  113. const char *user_name; /* user name */
  114. rt_uint16_t password_len; /* password length */
  115. const char *password; /* password */
  116. };
  117. struct umqtt_pkgs_connack
  118. {
  119. /* variable header */
  120. union umqtt_pkgs_connack_sign connack_flags; /* connect flags */
  121. enum umqtt_connack_retcode ret_code; /* connect return code */
  122. /* payload = NULL */
  123. };
  124. struct umqtt_pkgs_publish
  125. {
  126. /* variable header */
  127. rt_uint16_t topic_name_len; /* topic name length */
  128. const char *topic_name; /* topic name */
  129. rt_uint16_t packet_id; /* packet id */
  130. /* payload */
  131. const char *payload; /* active payload */
  132. /* not packet datas */
  133. rt_uint32_t payload_len; /* retain payload length */
  134. };
  135. struct umqtt_pkgs_puback
  136. {
  137. /* variable header */
  138. rt_uint16_t packet_id; /* packet id */
  139. /* payload = NULL */
  140. };
  141. struct umqtt_pkgs_pubrec /* publish receive (QoS 2, step_1st) */
  142. {
  143. /* variable header */
  144. rt_uint16_t packet_id; /* packet id */
  145. /* payload = NULL */
  146. };
  147. struct umqtt_pkgs_pubrel /* publish release (QoS 2, step_2nd) */
  148. {
  149. /* variable header */
  150. rt_uint16_t packet_id; /* packet id */
  151. /* payload = NULL */
  152. };
  153. struct umqtt_pkgs_pubcomp /* publish complete (QoS 2, step_3rd) */
  154. {
  155. /* variable header */
  156. rt_uint16_t packet_id; /* packet id */
  157. /* payload = NULL */
  158. };
  159. struct umqtt_pkgs_subscribe /* subscribe topic */
  160. {
  161. /* variable header */
  162. rt_uint16_t packet_id; /* packet id */
  163. /* payload */
  164. struct sub_topic_filter topic_filter[PKG_UMQTT_SUBRECV_DEF_LENGTH]; /* topic name filter arrays */
  165. /* not payload datas */
  166. rt_uint8_t topic_count; /* topic filter count */
  167. };
  168. struct umqtt_pkgs_suback /* subscribe ack */
  169. {
  170. /* variable header */
  171. rt_uint16_t packet_id; /* packet id */
  172. /* payload */
  173. rt_uint8_t ret_qos[PKG_UMQTT_SUBRECV_DEF_LENGTH]; /* return code - enum Qos - 0/1/2 */
  174. /* not payload datas */
  175. rt_uint8_t topic_count; /* topic name count */
  176. };
  177. struct umqtt_pkgs_unsubscribe /* unsubscribe */
  178. {
  179. /* variable header */
  180. rt_uint16_t packet_id; /* packet id */
  181. /* payload */
  182. struct unsub_topic_filter topic_filter[PKG_UMQTT_SUBRECV_DEF_LENGTH]; /* topic name filter arrays */
  183. /* not payload datas */
  184. rt_uint8_t topic_count; /* topic name count */
  185. };
  186. struct umqtt_pkgs_unsuback /* unsubscribe ack */
  187. {
  188. /* variable header */
  189. rt_uint16_t packet_id; /* packet id */
  190. /* payload = NULL */
  191. };
  192. // struct pkgs_pingreq { } /* ping request = NULL */
  193. // struct pkgs_pingresp { } /* ping response = NULL */
  194. // struct pkgs_disconnect { } /* disconnect = NULL */
  195. union umqtt_pkgs_msg /* mqtt message packet type */
  196. {
  197. struct umqtt_pkgs_connect connect; /* connect */
  198. struct umqtt_pkgs_connack connack; /* connack */
  199. struct umqtt_pkgs_publish publish; /* publish */
  200. struct umqtt_pkgs_puback puback; /* puback */
  201. struct umqtt_pkgs_pubrec pubrec; /* publish receive (QoS 2, step_1st) */
  202. struct umqtt_pkgs_pubrel pubrel; /* publish release (QoS 2, step_2nd) */
  203. struct umqtt_pkgs_pubcomp pubcomp; /* publish complete (QoS 2, step_3rd) */
  204. struct umqtt_pkgs_subscribe subscribe; /* subscribe topic */
  205. struct umqtt_pkgs_suback suback; /* subscribe ack */
  206. struct umqtt_pkgs_unsubscribe unsubscribe; /* unsubscribe topic */
  207. struct umqtt_pkgs_unsuback unsuback; /* unsubscribe ack */
  208. };
  209. struct umqtt_msg
  210. {
  211. union umqtt_pkgs_fix_header header; /* fix header */
  212. rt_uint32_t msg_len; /* message length */
  213. union umqtt_pkgs_msg msg; /* retain payload message */
  214. };
  215. /* umqtt package datas */
  216. int umqtt_encode(enum umqtt_type type, rt_uint8_t *send_buf, size_t send_len, struct umqtt_msg *message);
  217. /* umqtt unpackage datas */
  218. int umqtt_decode(rt_uint8_t *recv_buf, size_t recv_buf_len, struct umqtt_msg *message);
  219. /* tcp/tls connect/disconnect/send/recv functions */
  220. int umqtt_trans_connect(const char *uri, int *sock);
  221. int umqtt_trans_disconnect(int sock);
  222. int umqtt_trans_send(int sock, const rt_uint8_t *send_buf, rt_uint32_t buf_len, int timeout);
  223. int umqtt_trans_recv(int sock, rt_uint8_t *recv_buf, rt_uint32_t buf_len);
  224. /* compatible with paho MQTT embedded c needed to do processing */
  225. typedef union umqtt_pkgs_fix_header MQTTHeader;
  226. typedef struct umqtt_pkgs_connect MQTTPacket_connectData;
  227. #define MQTTStrlen(c) ((c == NULL) ? 0 : strlen(c))
  228. void umqtt_writeChar(unsigned char** pptr, char c);
  229. char umqtt_readChar(unsigned char** pptr);
  230. void umqtt_writeInt(unsigned char** pptr, int anInt);
  231. int umqtt_readInt(unsigned char** pptr);
  232. void umqtt_writeCString(unsigned char** pptr, const char* string);
  233. void umqtt_writeMQTTString(unsigned char** pptr, const char* string);
  234. int umqtt_readlenstring(int *str_len, char **p_string, unsigned char **pptr, unsigned char *enddata);
  235. int umqtt_pkgs_encode(unsigned char* buf, int length);
  236. int umqtt_pkgs_decode(int (*getcharfn)(unsigned char*, int), int* value);
  237. int umqtt_pkgs_len(int rem_len);
  238. #ifdef __cplusplus
  239. }
  240. #endif
  241. #endif