SIMCom A7680C内嵌mqtt协议使用

利用模组内嵌的mqtt协议实现客户端订阅消息与发布消息

1. 实现网络初始化

  

  1 /**
  2  * @brief 
  3  * 
  4  */
  5 void Network_Module_Control(void){
  6     static uint32_t led_blink_time = 0;
  7     uint16_t i,j;
  8     switch(Modem_Power_State)
  9     {
 10         case MODEM_OFF:
 11         {   //If the CO isn't calibrated or low battery,the GSM function won't work.
 12             if((g_Data_Area.dat.CO_Step0==0)||(g_Data_Area.dat.CO_Step1==0)||g_dp_data.battery_percentage==0){
 13                 reboot_CNT = 0;
 14             }
 15             if(reboot_CNT!=0 || g_dp_data.CO_Detect_State==ALARM_SET)
 16             {
 17                 if(g_dp_data.CO_Detect_State == ALARM_SET){
 18                     printf("alarm gsm rst\n");
 19                 }
 20                 else if(flagReport==0){  //none data have to send.
 21                     reboot_CNT = 0;
 22                     break;
 23                 }
 24                 else{
 25                     if(reboot_CNT) reboot_CNT--;
 26                 }
 27                 network_sleep_flag = 0;
 28                 set_modem_state(MODEM_START_UP);
 29             }
 30             else
 31             {
 32                 if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 100) {
 33                     if(Allow_Led_Blink==2){
 34                         for(i=0;i<4;i++){
 35                             LED3 = 0;
 36                             delay_ms(500);
 37                             LED3 = 1;
 38                             delay_ms(500);
 39                         }
 40                     }
 41                     Allow_Led_Blink = 0;
 42                     PowerEn = 1;
 43                     network_sleep_flag = 1;
 44                     Modem_State_Delay_Time = HAL_GetTick();
 45                 }
 46             }
 47             break;
 48         }
 49         case MODEM_START_UP:
 50         {
 51             Gsm_Uart_Init();
 52             PowerEn = 0;
 53             Modem_State_Delay_Time = HAL_GetTick();
 54             set_modem_state(MODEM_POWER_DELAY);
 55             break;
 56         }
 57         case MODEM_POWER_DELAY:
 58         {
 59             if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 1000)
 60             {
 61                 Modem_State_Delay_Time = HAL_GetTick();
 62                 set_modem_state(MODEM_ON_OFF_ACTIVE);
 63             }
 64             break;
 65         }
 66         case MODEM_ON_OFF_ACTIVE:
 67         {
 68            if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 10)
 69             {
 70                 PowerKey = 1;        //Power key ON
 71                 Modem_State_Delay_Time = HAL_GetTick();
 72                 set_modem_state(MODEM_WAITING_FOR_ON);
 73             }
 74             break;
 75         }
 76         case MODEM_WAITING_FOR_ON:
 77         {
 78             if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 1000)
 79             {
 80                 PowerKey = 0;        //Power key OFF
 81                 Modem_State_Retry_Count = 0;
 82                 set_modem_state(MODEM_AT_REQUEST);
 83             }
 84             break;
 85         }
 86         case MODEM_AT_REQUEST:
 87         {
 88             RX_Clear();
 89             Modem_Put_String((char*)"AT", false, true);
 90             Modem_State_Retry_Count++;
 91             Modem_State_Delay_Time = HAL_GetTick();
 92             Old_Modem_Power_State = Modem_Power_State; 
 93             set_modem_state(MODEM_OK_RESPONSE);
 94             break;
 95         }
 96         case MODEM_ATE_REQUEST:
 97         {
 98             RX_Clear();
 99             // Send the first command - ATE0 - to turn off command echo and reset the buffer index
100             Modem_Put_String((char*)"ATE0", false, true);//return OK
101             Modem_State_Retry_Count++;
102             Modem_State_Delay_Time = HAL_GetTick();
103             Modem_Power_State++;
104             break;
105         }
106         case MODEM_WAITING_FOR_ATE_RESPONSE:
107         {
108             if (Process_Modem_Ascii_Output())
109             {
110                 Old_Modem_Power_State = Modem_Power_State; 
111                 if (!strcmp((const char*)Modem_Input_Buffer, "ATE0"))
112                 {
113                     Modem_State_Delay_Time = HAL_GetTick();
114                     set_modem_state(MODEM_WAITING_OK);
115                 }
116                 else if(!strcmp((const char*)Modem_Input_Buffer, "+CGEV: ME DETACH"))//+CGEV: ME DETACH
117                 {
118                     set_modem_state(MODEM_SHUT_DOWN);
119                 }
120                 Modem_Input_Buffer_Index = 0;
121             }
122             else if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 1000)
123             {
124                 if(Modem_State_Retry_Count < 10)
125                 {
126                     set_modem_state(--Modem_Power_State);
127                 }
128                 else
129                 {
130                     set_modem_state(MODEM_SHUT_DOWN);
131                 }
132             }
133             break;
134         }
135         case MODEM_GMR_REQUEST:
136         {
137             RX_Clear();
138             Modem_Put_String((char*)"ATI", false, true);
139             Modem_State_Retry_Count++;
140             Modem_State_Delay_Time = HAL_GetTick();
141             Old_Modem_Power_State = Modem_Power_State; 
142             set_modem_state(MODEM_OK_RESPONSE);
143             break;
144         }
145         case MODEM_CPSMS_REQUEST:
146         {
147             RX_Clear();
148             Modem_Put_String((char*)"AT+CPSMS=0", false, true); //close PSM mode
149             Modem_State_Retry_Count++;
150             Modem_State_Delay_Time = HAL_GetTick();
151             Old_Modem_Power_State = Modem_Power_State; 
152             set_modem_state(MODEM_OK_RESPONSE);
153             break;
154         }
155         case MODEM_ICCID_REQUEST :
156         {
157             if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 100)
158             {
159                 // Modem_Put_String((char*)"ATS0=1", false, true);
160                 // set_modem_state(MODEM_ON);
161                 if(!(Network_Regist_State&BIT0))
162                 {
163                     //Execution command reads on SIM the ICCID
164                     Modem_State_Retry_Count++;
165                     RX_Clear();
166                     //+ICCID: 898604B61522C0001115
167                     Modem_Put_String((char*)"AT+CICCID", false, true);
168 //                    Modem_Put_String((char*)"AT+CPIN?", false, true);
169                     Modem_Input_Buffer_Index = 0; 
170                     Modem_State_Delay_Time = HAL_GetTick(); 
171                     Modem_Power_State++;
172                 }
173                 else
174                 {
175                     set_modem_state(MODEM_IMEI_REQUEST);
176                 }
177             }
178             break;
179         }
180         case MODEM_WAITING_FOR_ICCID_RESPONSE :
181         {
182             Old_Modem_Power_State = Modem_Power_State;
183             if (Process_Modem_Ascii_Output())
184             {
185                 j=strlen("+ICCID: ");
186                 if (!strncmp((const char*)Modem_Input_Buffer, "+ICCID: ",j))
187                 {
188                     //Fill in the ICCID Buffer.
189                     for(i=0;i<(Modem_Input_Buffer_Index-j);i++)
190                     {
191                         Gsm_Data_Group.cSimICCID[i]=Modem_Input_Buffer[i+j];
192                     }
193 
194                     while(i<sizeof(Gsm_Data_Group.cSimICCID))    //truncation.
195                     {
196                         Gsm_Data_Group.cSimICCID[i++]=0;
197                     }
198                     Network_Regist_State |= BIT0;
199                     Modem_State_Delay_Time = HAL_GetTick();
200                     set_modem_state(MODEM_WAITING_OK);
201                 }
202                 // else if (!strcmp((const char*)Modem_Input_Buffer, "+CME ERROR: SIM not inserted")){
203                 //     set_modem_state(MODEM_SHUT_DOWN);
204                 // }
205                 Modem_Input_Buffer_Index = 0;
206             }
207             else if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 1000)
208             {
209                 if (Modem_State_Retry_Count < 8)
210                 {
211                     Modem_Power_State--;
212                 }
213                 else
214                 {
215                     set_modem_state(MODEM_SHUT_DOWN);
216                 }
217             }
218             break;
219         }
220         case MODEM_IMEI_REQUEST:
221         {
222              if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 100)
223             {
224                 if(!(Network_Regist_State&BIT1))
225                 {
226                     //execution command return the product serial number
227                     Modem_State_Retry_Count++;
228                     RX_Clear();
229                     Modem_Put_String((char*)"AT+CGSN", false, true);
230                     Modem_Input_Buffer_Index = 0;
231                     Modem_State_Delay_Time = HAL_GetTick();
232                     Modem_Power_State++;
233                 }
234                 else
235                 {
236                     set_modem_state(MODEM_CIMI_REQUEST);
237                 }
238             }
239             break;
240         }
241         case MODEM_WAITING_FOR_IMEI_RESPONSE:
242         {
243             Old_Modem_Power_State = Modem_Power_State;
244             if (Process_Modem_Ascii_Output())
245             {
246                 if(Modem_Input_Buffer_Index>=15)
247                 {
248                     for (i=0,j=1;i<Modem_Input_Buffer_Index;i++)    //skip first pos
249                     {
250                         if(Modem_Input_Buffer[i]>='0'&& '9'>=Modem_Input_Buffer[i])
251                         {
252                             Gsm_Data_Group.cIMEI[j++]=Modem_Input_Buffer[i];
253                             if(j>=16)break;
254                         }
255                     }
256                     Network_Regist_State |= BIT1;
257                     Gsm_Data_Group.cIMEI[0] = '0';  //first pos fill in '0'
258                     Gsm_Data_Group.cIMEI[16] = 0;   //tail pos fill in 'NULL'
259                     // printf("imei=%s\n",Gsm_Data_Group.cIMEI);
260                     Modem_State_Delay_Time = HAL_GetTick();    
261                     set_modem_state(MODEM_WAITING_OK);           
262                 }
263                 Modem_Input_Buffer_Index = 0;  
264             }
265             else if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 1000)
266             {
267                 if (Modem_State_Retry_Count < 5)
268                 {
269                     Modem_Power_State--;                            
270                 }
271                 else
272                 {
273                     set_modem_state(MODEM_SHUT_DOWN);
274                 }
275             }
276             break;
277         }
278         case MODEM_CIMI_REQUEST :
279         {
280             if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 100)
281             {
282                 if(!(Network_Regist_State&BIT2))
283                 {
284                     //Execution command reads on SIM the IMSI
285                     Modem_State_Retry_Count++;
286                     RX_Clear();
287                     Modem_Put_String((char*)"AT+CIMI", false, true);
288                     Modem_Input_Buffer_Index = 0;
289                     Modem_State_Delay_Time = HAL_GetTick();  
290                     Modem_Power_State++;
291                 }
292                 else
293                 {
294                     set_modem_state(MODEM_REGISTRATION_REQUEST);
295                 }
296             }
297             break;
298         }
299         case MODEM_WAIT_CIMI_RESPONSE:
300         {
301             Old_Modem_Power_State = Modem_Power_State;
302             if (Process_Modem_Ascii_Output())
303             {
304                 if(Modem_Input_Buffer_Index>=15)
305                 {
306                     for (i=0,j=0;i<Modem_Input_Buffer_Index;i++)
307                     {
308                         if(Modem_Input_Buffer[i]>='0'&& '9'>=Modem_Input_Buffer[i])
309                         {
310                             Gsm_Data_Group.cSimIMSI[j++]=Modem_Input_Buffer[i];
311                             if(j>=15)break;
312                         }
313                     }
314                     Gsm_Data_Group.cSimIMSI[15] = 0;
315                     Network_Regist_State |= BIT2;
316                     Modem_State_Delay_Time = HAL_GetTick();    
317                     set_modem_state(MODEM_WAITING_OK);           
318                 }
319                 Modem_Input_Buffer_Index = 0;  
320             }
321             else if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 1000)
322             {
323                 if (Modem_State_Retry_Count < 5)
324                 {
325                     Modem_Power_State--;                            
326                 }
327                 else
328                 {
329                     set_modem_state(MODEM_SHUT_DOWN);
330                 }
331             }
332             break;
333         }
334         case MODEM_REGISTRATION_REQUEST :
335         {
336             // Use the left over delay time to add a pause before we send the next request
337             if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 1000)
338             {
339                 // Send the command AT+CREG? to enquire the network registration state
340                 Modem_State_Retry_Count++;
341                 RX_Clear();
342                 Modem_Put_String((char*)"AT+CGREG?", false, true);  //answer is "+CREG:0,1"or"+CREG:0,5"
343                 
344                 Modem_Input_Buffer_Index = 0;    
345                 Modem_State_Delay_Time = HAL_GetTick();
346                 Modem_Power_State = MODEM_WAITING_CGREG_RESPONSE;
347             }
348             break;
349         }
350         case MODEM_WAITING_CGREG_RESPONSE:
351         {
352             Old_Modem_Power_State = Modem_Power_State;
353             if (Process_Modem_Ascii_Output())
354             {
355                 if (!strcmp((const char*)Modem_Input_Buffer, "+CGREG: 0,1") || !strcmp((const char*)Modem_Input_Buffer, "+CGREG: 0,5")){
356                     // Assume all other responses indicate success
357                     Network_Regist_State |= BIT3;
358                     set_modem_state(MODEM_WAITING_OK);
359                 }
360                 else {
361                     i=strlen("+CGREG: ");
362                     if (!strncmp((const char*)Modem_Input_Buffer, "+CGREG: ", i)){
363                         /// Modem is trying to register
364                         set_modem_state(MODEM_WAITING_OK);
365                     }
366                 }
367                 Modem_State_Delay_Time = HAL_GetTick(); 
368                 Modem_Input_Buffer_Index = 0;
369             }
370             else if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 1000)
371             {
372                 if (Modem_State_Retry_Count < 60)
373                 {
374                     Modem_Power_State--;
375                 }
376                 else
377                 {
378                     set_modem_state(MODEM_SHUT_DOWN);          //shutdown
379                 }
380             }
381             break;
382         }
383         case MODEM_WAITING_OK :
384         {
385             if (Process_Modem_Ascii_Output())
386             {
387                 if (!strcmp((const char*)Modem_Input_Buffer, "OK"))
388                 {
389                     if(Old_Modem_Power_State == MODEM_WAITING_CGREG_RESPONSE)
390                     {
391                         // Three routes from here as this may have been the ok following
392                         // the network registration enquiry
393                         if (Network_Regist_State&BIT3)
394                         {
395                             if(Network_Regist_State==0x0F)
396                             {
397                                 printf("GSM Online\n");
398                                 TCPIP_On();
399                                 set_modem_state(MODEM_ON);
400                                 Modem_State_Retry_Count = 0;
401                             }
402                             else
403                             {
404                                 set_modem_state(MODEM_ICCID_REQUEST);
405                             }
406                         }
407                         else        ///can not register
408                         {
409                             if (Modem_State_Retry_Count < 60)
410                             {
411                                 set_modem_state(--Old_Modem_Power_State);
412                                 Modem_State_Delay_Time = HAL_GetTick(); 
413                             }
414                             else
415                             {
416                                 Network_Regist_State = 0;
417                                 set_modem_state(MODEM_SHUT_DOWN);       // Registration has timed out
418                             }
419                         }
420                     }
421                     else 
422                     {
423                         if(Old_Modem_Power_State == MODEM_WAITING_FOR_ATE_RESPONSE){
424                             if(Allow_Led_Blink==1){
425                                 LED3 = 1;
426                                 for(i=0;i<5;i++){
427                                     LED3 = 0;
428                                     delay_ms(100);
429                                     LED3 = 1;
430                                     delay_ms(100);
431                                 }
432                                 Allow_Led_Blink=2;
433                             }
434                         }
435                         Modem_State_Retry_Count = 0;
436                         Modem_State_Delay_Time = HAL_GetTick(); 
437                         set_modem_state(++Old_Modem_Power_State); 
438                     }
439                 }
440                 Modem_Input_Buffer_Index = 0;
441             }
442             else if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 4000)//no response timeout; at least 3mins
443             {
444                 if (Modem_State_Retry_Count < 60)
445                 {
446                     set_modem_state(--Old_Modem_Power_State);
447                 }
448                 else
449                 {
450                     set_modem_state(MODEM_SHUT_DOWN);                  //shutdown
451                 }
452             }
453             break;
454         }
455         case MODEM_OK_RESPONSE:
456         {
457             if (Process_Modem_Ascii_Output())
458             {
459                 if (!strcmp((const char*)Modem_Input_Buffer, "OK"))
460                 {
461                     Modem_State_Retry_Count = 0;
462                     Modem_State_Delay_Time = HAL_GetTick(); 
463                     set_modem_state(++Old_Modem_Power_State);
464                 }
465                 Modem_Input_Buffer_Index = 0;
466             }
467             else if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 1500)//no response timeout
468             {
469                 if (Modem_State_Retry_Count < 30)
470                 {
471                     Modem_State_Delay_Time = HAL_GetTick();
472                     set_modem_state(Old_Modem_Power_State);
473                 }
474                 else
475                 {
476                     set_modem_state(MODEM_SHUT_DOWN);                  //shutdown
477                 }
478             }
479             break;
480         }
481         case MODEM_ON:
482         {
483             // This is an idle state in which we wait for the application to
484             // indicate that it wants to turn the modem power off.
485             Manage_Modem_TCPIP();
486             break;
487         }
488         case MODEM_SHUT_DOWN:
489         {
490             Network_Regist_State &=~ BIT3;
491             Modem_State_Delay_Time = HAL_GetTick(); 
492             set_modem_state(MODEM_WAITING_FOR_OFF);
493             break;
494         }
495         case MODEM_WAITING_FOR_OFF:
496         {
497             if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 200)
498             {
499                 PowerEn = 1;
500                 Modem_State_Delay_Time = HAL_GetTick(); 
501                 set_tcpip_state(TCPIP_OFF_LINE);
502                 set_modem_state(MODEM_PAUSE); 
503             }
504             break;
505         }
506         case MODEM_PAUSE:
507         {
508             if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 100)
509             {
510                 set_modem_state(MODEM_OFF); 
511             }
512             break;
513         }
514         default:
515         {
516             set_modem_state(MODEM_OFF); 
517             break;
518         }
519     }
520     //===================== LED task =========================
521     if(fTestTrigger&g_dp_data.flag){;;} //test outputing
522     else if(Allow_Led_Blink){
523         if(Allow_Led_Blink==1){
524             if((uint32_t)(HAL_GetTick()-led_blink_time) > 500){
525                 LED3 = !LED3;
526                 led_blink_time = HAL_GetTick();
527             }
528         }
529         else {
530             if((uint32_t)(HAL_GetTick()-led_blink_time) < 100){
531                 LED3 = 0;
532             }
533             else {
534                 LED3 = 1;
535                 if((uint32_t)(HAL_GetTick()-led_blink_time) >= 1000){
536                     led_blink_time = HAL_GetTick();
537                 }
538             }
539         }
540     }
541     else {
542         LED3 = 1;
543     }
544 }
Network_Module_Control

 

2.实现mqtt协议应用

  

  1 /**
  2   * @brief
  3   * @retval none
  4   */
  5 void Manage_Modem_TCPIP(void)
  6 {
  7     static bool m_b_variable = false;
  8     static uint8_t ok_response = 0,last_fReport=0;
  9     static MQTT_PUSH_STATE_e Mqtt_Push_State = MQTT_PUSH_IDLE;
 10     char at_group[32];
 11     char *apn;
 12     switch(TCPIP_State)
 13     {
 14         case TCPIP_OFF_LINE:
 15         {
 16             break;
 17         }
 18         case TCPIP_START:
 19         {
 20             if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 6)
 21             {
 22                 TCPIP_State_Retry_Count=0;
 23                 m_b_variable = false;
 24                 set_tcpip_state(TCPIP_CGDCONT);
 25             }
 26             break;
 27         }
 28         case TCPIP_CGDCONT://APN
 29         {
 30             if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 200)
 31             {
 32                 Old_TCPIP_State = TCPIP_State;
 33                 TCPIP_State_Retry_Count++;  
 34                 RX_Clear();
 35                 if(!strncmp((const char*)Gsm_Data_Group.cSimICCID,(const char*)ATT_ICCID,5))//the first five digital
 36                 {//89011
 37                     apn = (char*)AT_ATT_CGDCONT;
 38                 }
 39                 else if(!strncmp((const char*)&Gsm_Data_Group.cSimICCID[2],(const char*)CHINA_ICCID,2))
 40                 {//china 898601,898606,898609
 41                     if((Gsm_Data_Group.cSimICCID[4]=='0')&&(Gsm_Data_Group.cSimICCID[5]=='1'||Gsm_Data_Group.cSimICCID[5]=='6'||Gsm_Data_Group.cSimICCID[5]=='9'))//for China Unicom-apn=scuiot
 42                     {
 43                         apn = (char*)AT_CHINA_UNICOM;
 44                     }
 45                     else
 46                     {
 47                         apn = (char*)AT_CHINA_CGDCONT;
 48                     }
 49                 }
 50                 else if(!strncmp((const char*)&Gsm_Data_Group.cSimICCID[2],(const char*)USA_ICCID,2))
 51                 {//USA 01
 52                     apn = (char*)AT_USA_CGDCONT;
 53                 }
 54                 else if(!strncmp((const char*)&Gsm_Data_Group.cSimICCID[2],(const char*)UK_ICCID,2))
 55                 {//Europe 44
 56                     apn = (char*)AT_UK_CGDCONT;
 57                 }
 58                 else if(!strncmp((const char*)&Gsm_Data_Group.cSimICCID[2],(const char*)CANADA_ICCID,2))
 59                 {//canada 30
 60                     apn = (char*)AT_CANADA_CGDCONT;
 61                 }
 62                 else if(!strncmp((const char*)&Gsm_Data_Group.cSimICCID[2],(const char*)NETHERLANDS_ICCID,2))
 63                 {//Netherlands 31
 64                     apn = (char*)AT_NETHERLANDS;
 65                 }
 66                 else 
 67                 {//35
 68                     apn = (char*)AT_IRELAND_CGDCONT;
 69                 }
 70                 ok_response = 0;
 71                 memset(encodingString,0,ENCODER_MAX);
 72                 sprintf( encodingString,"AT+CGDCONT=1,\"IP\",\"%s\"\r\n",apn );
 73                 Modem_Put_String((char*)encodingString, false, true);
 74                 Modem_Input_Buffer_Index = 0;
 75                 Modem_State_Delay_Time = HAL_GetTick(); 
 76                 set_tcpip_state(TCPIP_WAITING_OK);
 77             }
 78             break;
 79         }
 80         case TCPIP_CGATT_CHECK:
 81         {
 82             if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 50)
 83             {
 84                 Old_TCPIP_State = TCPIP_State;
 85                 TCPIP_State_Retry_Count++;
 86                 ok_response = 0;
 87                 RX_Clear();
 88                 //+CGATT: 1
 89                 if(TCPIP_State_Retry_Count==2){
 90                     Modem_Put_String((char*)"AT+CGATT=1", false, true);
 91                 }
 92                 else{
 93                     Modem_Put_String((char*)"AT+CGATT?", false, true);
 94                 }
 95                 Modem_Input_Buffer_Index = 0;
 96                 Modem_State_Delay_Time = HAL_GetTick(); 
 97                 set_tcpip_state(TCPIP_CGATT_RESULT);
 98             }
 99             break;
100         }
101         case TCPIP_CGATT_RESULT:
102         {
103             if (Process_Modem_Ascii_Output())
104             {
105                 if (!strcmp((const char*)Modem_Input_Buffer, "+CGATT: 1"))
106                 {
107                     ok_response=1;
108                 }
109                 else if (!strcmp((const char*)Modem_Input_Buffer, "OK")){
110                     if(ok_response==1){
111                         ok_response = 0;
112                         TCPIP_State_Retry_Count = 0;
113                         set_tcpip_state(TCPIP_CMQTTCONNECT);
114                     }
115                 }
116                 Modem_Input_Buffer_Index = 0;
117             }
118             else if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 3000)
119             {
120                 Modem_State_Delay_Time = HAL_GetTick(); 
121                 if (TCPIP_State_Retry_Count < 5)           //no response
122                 {
123                     set_tcpip_state(Old_TCPIP_State);       //retry
124                 }
125                 else
126                 {
127                     set_tcpip_state(TCPIP_DEACTIVATE_IP);   //no response up to n times shutdown
128                 }
129             }
130             break;
131         }
132         case TCPIP_CMQTTCONNECT:  // Connect to a MQTT server
133         {
134             if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 50)
135             {
136                 Old_TCPIP_State = TCPIP_State;
137                 TCPIP_State_Retry_Count++;
138 
139                 m_b_variable = false;
140                 RX_Clear();
141                 if (TCPIP_State_Retry_Count > 3)           //no response
142                 {
143                     set_tcpip_state(TCPIP_DEACTIVATE_IP);       //retry
144                 }
145                 else if(ok_response==0){
146                     //OK \n +CMQTTSTART: 0
147                     Modem_Put_String((char*)"AT+CMQTTSTART", false, true);   
148                 }
149                 else if(ok_response==1){
150                     memset(encodingString,0,ENCODER_MAX);
151                     sprintf( encodingString,"AT+CMQTTACCQ=0,\"%s\"",client_id);
152                     Modem_Put_String((char*)encodingString, false, true);
153                 }
154                 else {
155                     //OK \n +CMQTTCONNECT: 0,0
156                     Modem_Put_String((char*)"AT+CMQTTCONNECT=0,\"tcp://ip:port\",60,1,\"user\",\"pwd\"", false, true);
157                 }
158                 Modem_Input_Buffer_Index = 0;
159                 Modem_State_Delay_Time = HAL_GetTick(); 
160                 set_tcpip_state(TCPIP_MQTTCON_RESP);
161             }
162             break;
163         }
164         case TCPIP_MQTTCON_RESP:{
165             if (Process_Modem_Ascii_Output()){
166                 if (!strcmp((const char*)Modem_Input_Buffer, "OK")){
167                     if(ok_response==1){
168                         ok_response = 2;
169                         set_tcpip_state(Old_TCPIP_State);
170                     }
171                 }
172                 else if (!strcmp((const char*)Modem_Input_Buffer, "+CMQTTSTART: 0")){
173                     ok_response=1;
174                     TCPIP_State_Retry_Count = 0;
175                     set_tcpip_state(Old_TCPIP_State);
176                 }
177                 else if (!strcmp((const char*)Modem_Input_Buffer, "+CMQTTCONNECT: 0,0")){
178                     ok_response=0;
179                     TCPIP_State_Retry_Count = 0;
180                     set_tcpip_state(TCPIP_CMQTT_TOPIC_SUB);
181                 }
182                 else if (!strcmp((const char*)Modem_Input_Buffer, "ERROR")){
183                     set_tcpip_state(TCPIP_DEACTIVATE_IP);
184                 }
185                 Modem_Input_Buffer_Index = 0;
186             }
187             else if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 15000)
188             {
189                 Modem_State_Delay_Time = HAL_GetTick(); 
190                 if (TCPIP_State_Retry_Count < 3)           //no response
191                 {
192                     set_tcpip_state(Old_TCPIP_State);       //retry
193                 }
194                 else
195                 {
196                     set_tcpip_state(TCPIP_DEACTIVATE_IP);   //no response up to n times shutdown
197                 }
198             }
199             break;
200         }
201         case TCPIP_CMQTT_TOPIC_SUB:   // Subscribe one topic from the server
202         {
203             if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 500)
204             {
205                 Old_TCPIP_State = TCPIP_State;
206                 TCPIP_State_Retry_Count++;
207                 RX_Clear();
208                 memset(topic_group,0,32);
209                 sprintf( topic_group,"sys/%s/down",topic_sub);
210                 //+CMQTTSUB: 0,0
211                 memset(at_group,0,32);
212                 sprintf( at_group,"AT+CMQTTSUB=0,%d,0",strlen(topic_group));
213                 Modem_Put_String((char*)at_group, false, true);
214                 
215                 Modem_Input_Buffer_Index = 0;
216                 set_tcpip_state(TCPIP_TOPIC_RESP);
217                 Modem_State_Delay_Time = HAL_GetTick();
218             }
219             break;
220         }
221         case TCPIP_TOPIC_RESP:
222         {
223             if (Process_Modem_Ascii_Output())
224             {
225                 if (!strcmp((const char*)Modem_Input_Buffer, "+CMQTTSUB: 0,0")){
226                     TCPIP_State_Retry_Count = 0;
227                 }
228                 else if (!strcmp((const char*)Modem_Input_Buffer, ">")){
229                     Modem_Put_String((char*)topic_group, false, true);
230                     Modem_State_Delay_Time = HAL_GetTick();
231                 }
232                 Modem_Input_Buffer_Index = 0;
233             }
234             else if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 8000)
235             {
236                 if(TCPIP_State_Retry_Count < 3)
237                 {
238                     set_tcpip_state(Old_TCPIP_State);
239                 }
240                 else
241                 {
242                     set_tcpip_state(TCPIP_SHUTDOWN);
243                 }
244                 Modem_State_Delay_Time = HAL_GetTick();
245             }
246             if(TCPIP_State_Retry_Count==0)
247             {
248                 tcp_flag = 0;
249                 Modem_State_Delay_Time = HAL_GetTick();
250                 memset(topic_group,0,32);
251                 sprintf( topic_group,"sys/%s/up",topic_push);
252                 memset(Modem_Input_Buffer,0,MODEM_INPUT_BUF_LENGTH);
253                 Modem_Put_String((char*)"AT+CSQ", false, true);
254                 tcp_flag = 0;      //wait for csq response = 800ms
255                 TCPIP_State_Retry_Count = 0;
256                 reboot_CNT = 0;
257                 Mqtt_Push_State = MQTT_PUSH_IDLE;
258                 set_tcpip_state(TCPIP_ON_LINE);
259             }
260             break;
261         }
262         case TCPIP_ON_LINE:
263         {
264             //-------------------- Data receiving ----------------------------
265             if (Process_Modem_Ascii_Output())
266             {
267                 if (!strcmp((const char*)Modem_Input_Buffer, ">")){
268                     tcp_flag |= f1TopicRDY;
269                 }
270                 else if (!strncmp((const char*)Modem_Input_Buffer, "+CSQ:",strlen("+CSQ:"))){
271                     Gsm_Data_Group.CSQ_Value = get_csq((char*)Modem_Input_Buffer);
272                 }
273                 else if (!strcmp((const char*)Modem_Input_Buffer, "OK")){
274                     tcp_flag |= f1TCP_OK_RET;
275                 }
276                 else if (!strcmp((const char*)Modem_Input_Buffer, "+CMQTTPUB: 0,0")){
277                     tcp_flag |= f1TCP_Send_Succeed;
278                 }
279                 else if (!strcmp((const char*)Modem_Input_Buffer, "ERROR")){
280                     tcp_flag |= f1TCP_Offline;
281                 }
282                 if(!strcmp((const char*)Modem_Input_Buffer, "+CGEV: ME DETACH"))//+CGEV: ME DETACH
283                 {
284                     tcp_flag |= f1TCP_Offline;
285                 }
286                 Modem_Input_Buffer_Index = 0;
287             }
288             else {
289                 switch(Mqtt_Push_State){
290                     case MQTT_PUSH_IDLE:{
291                         if(!(f1TCP_OK_RET&tcp_flag))    //wait for csq response
292                         {
293                             if((uint32_t)(HAL_GetTick()-Modem_State_Delay_Time) > 500){
294                                 tcp_flag |= f1TCP_OK_RET;
295                             }
296                         }
297                         else{
298                             if(TCPIP_State_Retry_Count>=3){
299                                 set_tcpip_state(TCPIP_SHUTDOWN);
300                             }
301                             else if(flagReport!=0){
302                                 Data_Encoder(); //all data to encodingString
303                                 last_fReport = flagReport;
304                                 Mqtt_Push_State++;
305                             }
306                             else{
307                                 if(g_dp_data.CO_Detect_State == ALARM_SET){
308                                     if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 45000){
309                                         Modem_Put_String((char*)"AT+CSQ", false, true);
310                                         tcp_flag &=~ f1TCP_OK_RET;
311                                         flagReport |= CO_ALARM_REP;
312                                     }
313                                 }
314                                 else if((uint32_t)(HAL_GetTick()-Modem_State_Delay_Time) >= 3000) {
315                                     set_tcpip_state(TCPIP_SHUTDOWN);
316                                 }
317                             }
318                         }
319                         break;
320                     }
321                     case MQTT_SET_TOPIC_LENGTH:{    // '>'
322                         tcp_flag &=~ f1TopicRDY;
323                         memset(at_group,0,32);
324                         sprintf( at_group,"AT+CMQTTTOPIC=0,%d",strlen(topic_group));
325                         Modem_Put_String((char*)at_group, false, true);
326                         Modem_State_Delay_Time = HAL_GetTick();
327                         Mqtt_Push_State++;
328                         break;
329                     }
330                     case MQTT_PUSH_TOPIC:{          //'OK'
331                         if(f1TopicRDY&tcp_flag){
332                             tcp_flag&=~f1TCP_OK_RET;
333                             Modem_Put_String((char*)topic_group, false, true);
334                             Modem_State_Delay_Time = HAL_GetTick();
335                             Mqtt_Push_State++;
336                         }
337                         else if((uint32_t)(HAL_GetTick()-Modem_State_Delay_Time) > 5000){
338                             TCPIP_State_Retry_Count++;
339                             Mqtt_Push_State = MQTT_PUSH_IDLE;
340                         }
341                         break;
342                     }
343                     case MQTT_PUSH_DATA_LENGTH:{    // '>'
344                         if(f1TCP_OK_RET&tcp_flag){
345                             tcp_flag &=~ f1TopicRDY;
346                             memset(at_group,0,32);
347                             sprintf( at_group,"AT+CMQTTPAYLOAD=0,%d",(EnLength<<1));
348                             Modem_Put_String((char*)at_group, false, true);
349                             Modem_State_Delay_Time = HAL_GetTick();
350                             Mqtt_Push_State++;
351                         }
352                         else if((uint32_t)(HAL_GetTick()-Modem_State_Delay_Time) > 5000){
353                             TCPIP_State_Retry_Count++;
354                             Mqtt_Push_State = MQTT_PUSH_IDLE;
355                         }
356                         break;
357                     }
358                     case MQTT_PAYLOAD_DATA:{    // 'OK'
359                         if(f1TopicRDY&tcp_flag){
360                             tcp_flag&=~f1TCP_OK_RET;
361                             Modem_Put_String((char*)encodingString, false, true);
362                             Modem_State_Delay_Time = HAL_GetTick();
363                             Mqtt_Push_State++;
364                         }
365                         else if((uint32_t)(HAL_GetTick()-Modem_State_Delay_Time) > 5000){   //time out
366                             TCPIP_State_Retry_Count++;
367                             Mqtt_Push_State = MQTT_PUSH_IDLE;
368                         }
369                         break;
370                     }
371                     case MQTT_PUSH_DATA:{   //OK \n +CMQTTPUB: 0,0
372                         if(f1TCP_OK_RET&tcp_flag){
373                             tcp_flag &=~ f1TCP_Send_Succeed;
374                             memset(at_group,0,32);
375                             sprintf( at_group,"AT+CMQTTPUB=0,0,%d",(EnLength<<1));
376                             Modem_Put_String((char*)at_group, false, true);
377                             Modem_State_Delay_Time = HAL_GetTick();
378                             Mqtt_Push_State++;
379                         }
380                         else if((uint32_t)(HAL_GetTick()-Modem_State_Delay_Time) > 5000){   //time out
381                             TCPIP_State_Retry_Count++;
382                             Mqtt_Push_State = MQTT_PUSH_IDLE;
383                         }
384                         break;
385                     }
386                     case MQTT_PUSH_WAIT:{
387                         if(f1TCP_Send_Succeed&tcp_flag){
388                             flagReport&=~last_fReport;
389                             TCPIP_State_Retry_Count = 0;
390                             Mqtt_Push_State = MQTT_PUSH_IDLE;
391                         }
392                         else if((uint32_t)(HAL_GetTick()-Modem_State_Delay_Time) > 5000){
393                             TCPIP_State_Retry_Count++;
394                             Mqtt_Push_State = MQTT_PUSH_IDLE;
395                         }
396                         break;
397                     }
398                     default:{
399                         Mqtt_Push_State = MQTT_PUSH_IDLE;
400                         break;
401                     }
402                 }
403             }
404 
405             if(f1TCP_Offline&tcp_flag)
406             {
407                 set_tcpip_state(TCPIP_SHUTDOWN);
408             }
409             break;
410         }
411         case TCPIP_SHUTDOWN:
412         {
413             Old_TCPIP_State = TCPIP_State; 
414             if(ok_response==0){
415                 Modem_Put_String((char*)"AT+CMQTTDISC=0,120", false, true);
416                 ok_response++;
417             }
418             else if(ok_response==1){
419                 Modem_Put_String((char*)"AT+CMQTTREL=0", false, true);
420                 ok_response++;
421             }
422             else if(ok_response==2){
423                 Modem_Put_String((char*)"AT+CMQTTSTOP", false, true);
424                 ok_response++;
425             }
426             else{
427                 set_tcpip_state(TCPIP_DEACTIVATE_IP);
428                 break;
429             }
430             Modem_Input_Buffer_Index = 0;
431             Modem_State_Delay_Time = HAL_GetTick();
432             set_tcpip_state(TCPIP_WAITING_SHUTDOWN_OK);
433             break;
434         }
435         case TCPIP_WAITING_SHUTDOWN_OK:
436         {
437             if (Process_Modem_Ascii_Output())
438             {
439                 if (!strcmp((const char*)Modem_Input_Buffer, "OK")){
440                     set_tcpip_state(Old_TCPIP_State);
441                 }
442                 Modem_Input_Buffer_Index = 0;
443             }
444             else if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 1000)
445             {
446                 Modem_State_Delay_Time = HAL_GetTick();
447                 set_tcpip_state(Old_TCPIP_State);
448             }
449             break;
450         }
451         case TCPIP_DEACTIVATE_IP :
452         {
453             Modem_Shut_Down();
454             set_tcpip_state(TCPIP_OFF_LINE);
455             break;
456         }
457         case TCPIP_WAITING_OK:
458         {
459             if (Process_Modem_Ascii_Output())
460             {
461                 if (!strcmp((const char*)Modem_Input_Buffer, "OK"))
462                 {
463                     TCPIP_State_Retry_Count = 0;
464                     Modem_State_Delay_Time = HAL_GetTick();
465                     set_tcpip_state(++Old_TCPIP_State);      //success execute next step
466                 }
467                 else if (!strcmp((const char*)Modem_Input_Buffer, "ERROR"))
468                 {
469                     Modem_State_Delay_Time = HAL_GetTick();
470                     if (TCPIP_State_Retry_Count < 20)
471                     {
472                         set_tcpip_state(Old_TCPIP_State);      //retry
473                     }
474                     else
475                     {
476                         set_tcpip_state(TCPIP_DEACTIVATE_IP);  //shutdown
477                     }
478                 }
479                 Modem_Input_Buffer_Index = 0;
480             }
481             else if((uint32_t)(HAL_GetTick() - Modem_State_Delay_Time) > 3000)
482             {
483                 Modem_State_Delay_Time = HAL_GetTick(); 
484                 if (TCPIP_State_Retry_Count < 20)
485                 {
486                     set_tcpip_state(Old_TCPIP_State);
487                 }
488                 else
489                 {
490                     set_tcpip_state(TCPIP_DEACTIVATE_IP);
491                 }
492             }
493             break;
494         }
495         default:
496         {
497             set_tcpip_state(TCPIP_OFF_LINE);
498             break;
499         }
500     }
501 }
Manage_Modem_TCPIP

 

posted on 2025-12-18 10:18  Milo_lu  阅读(2)  评论(0)    收藏  举报

导航