mqttRecv.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "usart.h"
  2. #include "string.h"
  3. #include "ring_buffer.h"
  4. #include "mqttRecv.h"
  5. #include "main.h"
  6. #include "parseDeviceMessage.h"
  7. /*
  8. * 函数名:Receive_MQTT_DataPack(void)
  9. * 输入参数:无
  10. * 输出参数:无
  11. * 返回值:无
  12. * 函数作用:当接收到mqtt订阅的信息时,将其写入保存到环形缓冲区
  13. */
  14. void Receive_MQTT_DataPack(void)
  15. {
  16. if (strstr((const char *)UART0_RX_BUF, "QMTRECV") != NULL)
  17. {
  18. if(strstr((const char *)UART0_RX_BUF,"reboot"))
  19. {
  20. NVIC_SystemReset();//收到了重启标志进行重启
  21. }
  22. UART0_RX_MQTT_SUB_STAT = 1; // MQTT信息标志位
  23. int i = 0;
  24. while (UART0_RX_BUF[i] != '{')
  25. {
  26. i++; // 移位到json信息开始处
  27. }
  28. for (; i < strlen(UART0_RX_BUF); i++)
  29. {
  30. ring_buffer_write(UART0_RX_BUF[i], &mqttRecv);
  31. if (UART0_RX_BUF[i] == '}')
  32. {
  33. break;
  34. }
  35. }
  36. Clear_DMA_Buffer();
  37. }
  38. else if(strstr((const char *)UART0_RX_BUF, "QMTSTAT:")!=NULL)//为MQTT链路产生变化
  39. {
  40. NVIC_SystemReset();//暂时不做区分
  41. }
  42. }
  43. /*
  44. * 函数名:bool MQTT_BUFFER_READ(uint8_t* json)
  45. * 输入参数:json --> 指向目标缓冲区
  46. * 输出参数:无
  47. * 返回值:true成功找到了json信息 false未找到json信息
  48. * 函数作用:从环形缓冲区中读出json信息
  49. */
  50. bool MQTT_BUFFER_READ(uint8_t *json)
  51. {
  52. static uint8_t json_len = 0;
  53. static uint8_t json_buf[128];
  54. uint8_t recv_data;
  55. bool found_json_end = false;
  56. bool json_start = false;
  57. while (ring_buffer_read(&recv_data, &mqttRecv) != -1)
  58. {
  59. if (recv_data == '{')
  60. {
  61. json_start = true;
  62. json_len = 0;
  63. }
  64. // 如果当前在JSON范围内
  65. if (json_start)
  66. {
  67. json_buf[json_len++] = recv_data;
  68. // 如果找到了JSON的结束符号
  69. if (recv_data == '}')
  70. {
  71. found_json_end = true;
  72. // 处理JSON数据
  73. json_buf[json_len] = '\0'; // 添加字符串结束符
  74. strcpy(json, (char *)json_buf); // 将JSON数据拷贝到输出缓冲区中
  75. // 清空JSON缓冲区
  76. memset(json_buf, 0, sizeof(json_buf));
  77. json_len = 0;
  78. json_start = false;
  79. }
  80. }
  81. if (found_json_end)
  82. {
  83. break;
  84. }
  85. }
  86. return found_json_end;
  87. }