发送PING包的问题

时间:2021-07-06 06:10:29

标签: c mqtt sim800

我使用的是 STM32L073RZ MCU。所以在通过 AT 命令建立连接包后,我每 1 分钟向 MQTT 代理发布一次,而保持活动时间为 60 秒。发布包根据 RTC 定时器中断每一分钟执行一次。我想每 15 秒或 30 秒发送一次 PING 数据包。目前,PING 数据包正在执行,while 循环中没有任何问题,导致频繁执行。因此,当我将 PING 数据包的执行更改为每 15 秒执行一次时,它不会通过。例如执行CIPSEND AT命令后没有收到回复(“>”)。

main.c

extern volatile int on;
extern volatile int do_ping;
extern int wakeup;

  ConnectPacket();

  if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 15*2000, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)
  {
   Error_Handler();
  }


 while(1){

 if(on == 0 && wakeup==6){
      Count();
      temp();
      time();
      mqtt_id =+1;
      sprintf(strl,"ID:%d,0-CT:%u, 1-BT:320, 2-RT:%02d:%02d:%02d, 3-TEMP: %d",mqtt_id,count1, sTime.Hours,sTime.Minutes,sTime.Seconds, temperature3);
      publishPacket(strl);
      wakeup=0;
  }


  if (on ==1 && wakeup == 4){
      Count();
      temp();
      time();
      mqtt_id =+1;
      sprintf(strl,"ID:%d,0-CT:%u, 1-BT:320, 2-RT:%02d:%02d:%02d, 3-TEMP: %d",mqtt_id,count1, sTime.Hours,sTime.Minutes,sTime.Seconds, temperature3);
      publishPacket(strl);
      wakeup=0;
  }
  if(do_ping == 1){
     do_ping = 0;
     mqtt_id =+1;
     sprintf(strl,"ID:%d,0-CT:%u,1-BT:320,2-RT:%02d:%02d:%02d",mqtt_id,count1,sTime.Hours,sTime.Minutes,sTime.Seconds); 
     pingPacket();
  }
  }

do_ping 通过 rtc 中断在 it.c 中每 15 秒递增一次

it.c

int wakeup=0;
volatile int on = 0;
volatile int do_ping = 0;

void RTC_IRQHandler(void)
{
/* USER CODE BEGIN RTC_IRQn 0 */

/* USER CODE END RTC_IRQn 0 */
HAL_RTCEx_WakeUpTimerIRQHandler(&hrtc);
/* USER CODE BEGIN RTC_IRQn 1 */

wakeup = wakeup + 1;

if ((wakeup == 1) || (wakeup == 2) || (wakeup == 3) || (wakeup ==5)){
    do_ping = 1;
}

if(wakeup ==4 && on == 0){
    do_ping = 1;
}
/* USER CODE END RTC_IRQn 1 */
}

MQTT.c

void MQTTdata(uint8_t Raddress, uint16_t Rsize){

    while (ongoing) {
        switch (downloadState)
        {
        case 0:
            AT_Command((uint8_t*)"AT\r\n");
            HAL_UART_Receive(&huart1, gsmreply, sizeof(gsmreply), RX_TIMEOUT);
            if (strstr((char*)gsmreply, "OK"))downloadState = 1;
            else downloadState = 0;
            memset(gsmreply, 0, sizeof(gsmreply));
            break;
        case 1:
            AT_Command((uint8_t*)"AT+CSCLK=0\r\n");
            HAL_UART_Receive(&huart1, gsmreply, sizeof(gsmreply), RX_TIMEOUT);
            if (strstr((char*)gsmreply, "OK"))downloadState = 2;
            else downloadState = 1;
            memset(gsmreply, 0, sizeof(gsmreply));
            break;
        case 2:
            AT_Command((uint8_t*)"AT+CIPSHUT\r\n");
            HAL_UART_Receive(&huart1, gsmreply, sizeof(gsmreply), RX_TIMEOUT);
            if (strstr((char*)gsmreply, "OK"))downloadState = 3;
            else downloadState = 2;
            memset(gsmreply, 0, sizeof(gsmreply));
            break;
        case 3:
            AT_Command((uint8_t*)"AT+CGREG?\r\n");
            HAL_UART_Receive(&huart1, (uint8_t*)gsmreply, sizeof(gsmreply), RX_TIMEOUT);
            if (strstr((char*)gsmreply, "OK"))downloadState = 4;
            else downloadState = 3;
            memset(gsmreply, 0, sizeof(gsmreply));
            break;
        case 4:
            AT_Command((uint8_t*)"AT+CGATT=1\r\n");
            HAL_UART_Receive(&huart1, (uint8_t*)gsmreply, sizeof(gsmreply), RX_TIMEOUT);
            if (strstr((char*)gsmreply, "OK"))downloadState = 5;
            else downloadState = 4;
            memset(gsmreply, 0, sizeof(gsmreply));
            break;
        case 5:
            AT_Command((uint8_t*)"AT+CSTT=\"apn\",\"\",\"\"\r\n");
            HAL_UART_Receive(&huart1, (uint8_t*)gsmreply, sizeof(gsmreply), RX_TIMEOUT);
            if (strstr((char*)gsmreply, "OK"))downloadState = 6;
            else downloadState = 5;
            memset(gsmreply, 0, sizeof(gsmreply));
            break;
        case 6:
            AT_Command((uint8_t*)"AT+CIICR\r\n");
            HAL_UART_Receive(&huart1, (uint8_t*)gsmreply, sizeof(gsmreply), RX_TIMEOUT);
            if (strstr((char*)gsmreply, "OK"))downloadState = 7;
            else downloadState = 6;
            memset(gsmreply, 0, sizeof(gsmreply));
            break;
        case 7:
            AT_Command((uint8_t*)"AT+CIFSR\r\n");
            HAL_UART_Receive(&huart1, (uint8_t*)gsmreply, sizeof(gsmreply), RX_TIMEOUT);
            downloadState = 8;
            memset(gsmreply, 0, sizeof(gsmreply));
            break;
        case 8:
            AT_Command((uint8_t*)"AT+CIPSTART=\"TCP\",\"example\",\"port\"\r\n");
            HAL_UART_Receive(&huart1, (uint8_t*)gsmreply, sizeof(gsmreply), RX_TIMEOUT);
            if (strstr((char*)gsmreply, "OK"))downloadState = 9;
            else downloadState = 8;
            memset(gsmreply, 0, sizeof(gsmreply));
            break;
        case 9:
            AT_Command((uint8_t*)"AT+CIPSEND\r\n");
            HAL_UART_Receive(&huart1, (uint8_t*)gsmreply, sizeof(gsmreply), RX_TIMEOUT);
            if (strstr((char*)gsmreply, ">")){
                downloadState = 10;
            }
            else downloadState = 9;
            memset(gsmreply, 0, sizeof(gsmreply));
            break;
        case 10:
            HAL_UART_Transmit(&huart1, payload, 100, 30000);
            HAL_UART_Receive(&huart1, (uint8_t*)gsmreply, sizeof(gsmreply), 30000);
            //if (strstr((char*)gsmreply, "SEND OK"))downlaodState = 10;
            //else
            downloadState = 0;
            ongoing = 0;
            memset(gsmreply, 0, sizeof(gsmreply));
            break;
        }
    }
}

void Pingdata(uint8_t Raddress, uint16_t Rsize){

    while (ongoing) {
        switch (downloadState)
        {
        case 9:
            AT_Command((uint8_t*)"AT+CIPSEND\r\n");
            HAL_UART_Receive(&huart1, (uint8_t*)gsmreply, sizeof(gsmreply), RX_TIMEOUT);
            if (strstr((char*)gsmreply, ">")){
                downloadState = 10;
            }
            else downloadState = 9;
            memset(gsmreply, 0, sizeof(gsmreply));
            break;
        case 10:
            HAL_UART_Transmit(&huart1, payload, 100, 30000);
            HAL_UART_Receive(&huart1, (uint8_t*)gsmreply, sizeof(gsmreply), 30000);
            downloadState = 0;
            ongoing = 0;
            memset(gsmreply, 0, sizeof(gsmreply));
            break;
        }
    }
}

void ConnectPacket()
{
    ongoing = 1;
    MsgConstruct();
    MQTTdata(0, 100);
    
}

void pingPacket(){
    ongoing = 1;
    pingmsgConstruct();
    downloadState = 9;
    Pingdata(0, 100);
}

0 个答案:

没有答案
相关问题