ym310_mqtt.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. /*
  2. * YM310 MQTT Driver - Header File - DEBUG VERSION
  3. *
  4. * Changes:
  5. * - Added memory alignment for buffer structures
  6. * - Added buffer size validation macros
  7. */
  8. #ifndef __YM310_MQTT_H__
  9. #define __YM310_MQTT_H__
  10. #include <rtthread.h>
  11. #include <rtdevice.h>
  12. #ifdef __cplusplus
  13. extern "C" {
  14. #endif
  15. /*=============================================================================
  16. * Configuration
  17. *=============================================================================*/
  18. /* UART Configuration */
  19. #define YM310_UART_NAME "uart2"
  20. #define YM310_UART_BAUDRATE 115200
  21. #define RX_BUF_SIZE (2048+256)
  22. /* Thread Configuration */
  23. #define INIT_THREAD_STACK_SIZE 2048
  24. #define INIT_THREAD_PRIORITY 10
  25. #define MQTT_THREAD_STACK_SIZE 4096
  26. #define MQTT_THREAD_PRIORITY 18
  27. #define MAINTAIN_THREAD_STACK_SIZE 2048
  28. #define MAINTAIN_THREAD_PRIORITY 20
  29. /* Timing Configuration */
  30. #define YM310_AT_CMD_TIMEOUT_MS 10000
  31. #define YM310_AT_SHORT_TIMEOUT_MS 3000
  32. #define YM310_AT_LONG_TIMEOUT_MS 30000
  33. #define MAINTAIN_INTERVAL_MS 120000
  34. #define NTP_SYNC_INTERVAL_MS 600000
  35. #define GPS_QUERY_INTERVAL_MS 12000
  36. /* MQTT Configuration */
  37. #define MQTT_INSTANCE_MAX 2
  38. #define MQTT_MAX_HOST_LEN 64
  39. #define MQTT_MAX_CLIENT_ID_LEN 32
  40. #define MQTT_MAX_USERNAME_LEN 32
  41. #define MQTT_MAX_PASSWORD_LEN 32
  42. #define MQTT_MAX_TOPIC_LEN 64
  43. #define MQTT_MAX_PAYLOAD_SIZE 1600 /* Reduced from 1400 for safety */
  44. #define MAINTAIN_CHECK_INTERVAL_MS 120000 // 2 minutes
  45. /* Buffer size validation */
  46. #define MQTT_RECV_BUF_TOTAL_SIZE (sizeof(rt_bool_t) + MQTT_MAX_TOPIC_LEN + MQTT_MAX_PAYLOAD_SIZE + sizeof(rt_uint16_t))
  47. /*=============================================================================
  48. * Primary MQTT Configuration
  49. *=============================================================================*/
  50. #define EF_PLATFORM_FLAG "platform" /* 0 = main platform, 1 = backup platform */
  51. #define PLATFORM_VICE_MAGIC 0x9D /* Backup platform flag */
  52. #define MQTT_PRIMARY_ENABLE 1
  53. #define MQTT0CFG_MAIN_HOST "mqtt.hnyfwlw.com"
  54. #define MQTT0CFG_MAIN_PORT 61883
  55. #define MQTT0CFG_MAIN_QOS 0
  56. #define MQTT0CFG_MAIN_USR "user"
  57. #define MQTT0CFG_MAIN_PWD "f335bf402c655ee5fd2b5300905124e"
  58. #define MQTT0CFG_MAIN_TSUB "/yfkj/scd/sub/"
  59. #define MQTT0CFG_MAIN_TPUB "/yfkj/scd/pub/"
  60. #define MQTT0CFG_VICE_HOST "120.27.222.26"
  61. #define MQTT0CFG_VICE_PORT 1883
  62. #define MQTT0CFG_VICE_QOS 0
  63. #define MQTT0CFG_VICE_USR "device_001"
  64. #define MQTT0CFG_VICE_PWD "device_001"
  65. #define MQTT0CFG_VICE_TSUB "/yfkj/scd/sub/"
  66. #define MQTT0CFG_VICE_TPUB "/yfkj/scd/pub/"
  67. /*=============================================================================
  68. * Secondary MQTT Configuration
  69. *=============================================================================*/
  70. #define MQTT_SECONDARY_ENABLE 1
  71. #define MQTT_SECONDARY_HOST "120.27.222.26"
  72. #define MQTT_SECONDARY_PORT 1883
  73. #define MQTT_SECONDARY_CLIENT_ID "device_002"
  74. #define MQTT_SECONDARY_USERNAME "device_002"
  75. #define MQTT_SECONDARY_PASSWORD "device_002"
  76. #define MQTT_SECONDARY_SUB_TOPIC "/yfkj/scd/sub/"
  77. #define MQTT_SECONDARY_PUB_TOPIC "/yfkj/scd/pub/"
  78. #define MQTT_SECONDARY_QOS 0
  79. /*=============================================================================
  80. * AT Response Types
  81. *=============================================================================*/
  82. typedef enum {
  83. AT_RESP_UNKNOWN = 0,
  84. AT_RESP_OK,
  85. AT_RESP_ERROR,
  86. AT_RESP_CME_ERROR,
  87. AT_RESP_CMS_ERROR,
  88. AT_RESP_ABORTED,
  89. AT_RESP_BUSY,
  90. AT_RESP_TIMEOUT,
  91. } at_resp_type_t;
  92. /*=============================================================================
  93. * AT Command Types
  94. *=============================================================================*/
  95. typedef enum {
  96. AT_CMD_SYNC = 0,
  97. AT_CMD_ASYNC_URC,
  98. AT_CMD_ASYNC_DATA,
  99. } at_cmd_type_t;
  100. /*=============================================================================
  101. * MQTT State
  102. *=============================================================================*/
  103. typedef enum {
  104. MQTT_STATE_DISCONNECTED = 0,
  105. MQTT_STATE_CONNECTING,
  106. MQTT_STATE_CONNECTED,
  107. MQTT_STATE_DISCONNECTING,
  108. MQTT_STATE_RECONNECTING,
  109. } mqtt_state_t;
  110. /*=============================================================================
  111. * MQTT Configuration Structure
  112. *=============================================================================*/
  113. typedef struct {
  114. rt_uint8_t enabled;
  115. rt_uint8_t client_idx;
  116. char host[MQTT_MAX_HOST_LEN];
  117. rt_uint16_t port;
  118. char client_id[MQTT_MAX_CLIENT_ID_LEN];
  119. char username[MQTT_MAX_USERNAME_LEN];
  120. char password[MQTT_MAX_PASSWORD_LEN];
  121. char sub_topic[MQTT_MAX_TOPIC_LEN];
  122. char pub_topic[MQTT_MAX_TOPIC_LEN];
  123. rt_uint8_t qos;
  124. } mqtt_config_t;
  125. /*=============================================================================
  126. * MQTT Instance Structure
  127. *=============================================================================*/
  128. typedef struct {
  129. mqtt_config_t config;
  130. mqtt_state_t state;
  131. rt_tick_t last_activity;
  132. rt_uint32_t tx_count;
  133. rt_uint32_t rx_count;
  134. rt_uint32_t err_count;
  135. void (*recv_callback)(rt_uint8_t client_idx, const char *topic,
  136. const char *payload, rt_uint16_t len);
  137. } mqtt_instance_t;
  138. /*=============================================================================
  139. * MQTT Receive Buffer Structure - ALIGNED
  140. *=============================================================================*/
  141. typedef struct __attribute__((aligned(8))) {
  142. rt_bool_t data_ready; /* Flag: data waiting to be processed */
  143. char topic[MQTT_MAX_TOPIC_LEN]; /* Received topic */
  144. char payload[MQTT_MAX_PAYLOAD_SIZE]; /* Received payload */
  145. rt_uint16_t payload_len; /* Payload length */
  146. } mqtt_recv_buf_t;
  147. /*=============================================================================
  148. * MQTT Callback Function Type
  149. *=============================================================================*/
  150. typedef void (*mqtt_recv_handler_t)(rt_uint8_t client_idx, const char *topic,
  151. const char *payload, rt_uint16_t len);
  152. /*=============================================================================
  153. * URC Handler Type
  154. *=============================================================================*/
  155. typedef void (*urc_handler_t)(const char *urc);
  156. /*=============================================================================
  157. * Global Variables
  158. *=============================================================================*/
  159. extern rt_device_t g_ym310_uart;
  160. extern rt_mutex_t g_mqtt_mutex;
  161. extern mqtt_instance_t g_mqtt_instances[MQTT_INSTANCE_MAX];
  162. extern mqtt_recv_buf_t g_mqtt_recv_bufs[MQTT_INSTANCE_MAX];
  163. extern rt_thread_t g_init_thread;
  164. extern rt_thread_t g_mqtt_thread;
  165. extern rt_thread_t g_maintain_thread;
  166. extern volatile rt_tick_t g_last_mqtt_success_tick;
  167. /*=============================================================================
  168. * AT Core API
  169. *=============================================================================*/
  170. int ym310_at_core_init(void);
  171. void ym310_at_core_deinit(void);
  172. at_resp_type_t ym310_at_exec_cmd(const char *cmd, char *resp,
  173. rt_uint16_t resp_size, rt_int32_t timeout_ms);
  174. at_resp_type_t ym310_at_exec_cmd_with_retry(const char *cmd, char *resp,
  175. rt_uint16_t resp_size, rt_int32_t timeout_ms,
  176. rt_uint8_t retry_max);
  177. at_resp_type_t ym310_at_exec_async(const char *cmd, const char *urc_key,
  178. char *urc_buf, rt_uint16_t urc_size,
  179. rt_int32_t timeout_ms);
  180. at_resp_type_t ym310_at_exec_async_with_data(const char *cmd, const char *data, rt_uint16_t data_len,
  181. const char *urc_key, char *urc_buf, rt_uint16_t urc_size,
  182. rt_int32_t timeout_ms);
  183. int ym310_at_wait_for(const char *expected, char *buf, rt_uint16_t buf_size,
  184. rt_int32_t timeout_ms);
  185. int ym310_at_register_urc(const char *urc_prefix, urc_handler_t handler);
  186. void ym310_at_unregister_urc(const char *urc_prefix);
  187. int ym310_at_send_raw(const char *data, rt_uint16_t len);
  188. int ym310_at_send_line(const char *line);
  189. rt_err_t ym310_at_mutex_lock(rt_int32_t timeout_ms);
  190. void ym310_at_mutex_unlock(void);
  191. /*=============================================================================
  192. * Utility Functions
  193. *=============================================================================*/
  194. rt_bool_t ym310_str_starts_with(const char *str, const char *prefix);
  195. int ym310_str_extract_int(const char *str, const char *prefix);
  196. int ym310_str_extract_nth_int(const char *str, int n);
  197. int ym310_parse_creg_response(const char *resp_buf, int *n, int *stat);
  198. int ym310_parse_cgreg_response(const char *resp_buf, int *n, int *stat);
  199. int ym310_parse_cgatt_response(const char *resp_buf, int *state);
  200. int ym310_parse_csq_response(const char *resp_buf, int *rssi, int *ber);
  201. int ym310_parse_qipact_response(const char *resp_buf, int *context_id, int *state, char *ip_addr, int ip_addr_size);
  202. /*=============================================================================
  203. * Module Init API
  204. *=============================================================================*/
  205. rt_thread_t ym310_start_init_thread(void);
  206. void ym310_init_thread_stop(void);
  207. /*=============================================================================
  208. * MQTT API
  209. *=============================================================================*/
  210. int ym310_mqtt_init(void);
  211. void ym310_mqtt_deinit(void);
  212. rt_thread_t ym310_start_mqtt_thread(void);
  213. mqtt_state_t ym310_mqtt_get_state(rt_uint8_t client_idx);
  214. rt_bool_t ym310_mqtt_is_connected(rt_uint8_t client_idx);
  215. int ym310_mqtt_set_recv_callback(rt_uint8_t client_idx,
  216. void (*callback)(rt_uint8_t, const char*,
  217. const char*, rt_uint16_t));
  218. int ym310_mqtt_open_network(rt_uint8_t client_idx);
  219. int ym310_mqtt_close_network(rt_uint8_t client_idx);
  220. int ym310_mqtt_connect(rt_uint8_t client_idx);
  221. int ym310_mqtt_disconnect(rt_uint8_t client_idx);
  222. int ym310_mqtt_subscribe(rt_uint8_t client_idx, const char *topic, rt_uint8_t qos);
  223. int ym310_mqtt_unsubscribe(rt_uint8_t client_idx, const char *topic);
  224. void ym310_mqtt_force_reconnect(rt_uint8_t client_idx);
  225. void ym310_mqtt_force_reconnect_all(void);
  226. /*=============================================================================
  227. * MQTT Send API
  228. *=============================================================================*/
  229. int ym310_mqtt_send_primary(const char *payload, rt_uint16_t len);
  230. int ym310_mqtt_send_secondary(const char *payload, rt_uint16_t len);
  231. int ym310_mqtt_send_to(rt_uint8_t client_idx, const char *topic,
  232. const char *payload, rt_uint16_t len, rt_uint8_t qos);
  233. /*=============================================================================
  234. * MQTT Stats API
  235. *=============================================================================*/
  236. int ym310_mqtt_get_stats(rt_uint8_t client_idx, rt_uint32_t *tx_count,
  237. rt_uint32_t *rx_count, rt_uint32_t *err_count);
  238. int ym310_mqtt_reset_stats(rt_uint8_t client_idx);
  239. /*=============================================================================
  240. * MQTT Config API
  241. *=============================================================================*/
  242. int ym310_mqtt_update_config(rt_uint8_t client_idx, mqtt_config_t *config);
  243. int ym310_mqtt_get_config(rt_uint8_t client_idx, mqtt_config_t *config);
  244. /*=============================================================================
  245. * Maintenance API
  246. *=============================================================================*/
  247. rt_thread_t ym310_start_maintain_thread(void);
  248. void ym310_maintain_thread_stop(void);
  249. rt_bool_t ym310_check_network_connected(void);
  250. rt_bool_t ym310_check_mqtt_connected(rt_uint8_t client_idx);
  251. int ym310_module_reinit(void);
  252. int ym310_ntp_sync_time(void);
  253. int ym310_gps_init(void);
  254. int ym310_gps_get_info(void);
  255. void ym310_gps_deinit(void);
  256. #ifdef __cplusplus
  257. }
  258. #endif
  259. #endif /* __YM310_MQTT_H__ */