Problemas com filtragem de String

Saudações.

Estou tendo problemas para realizar a filtragem de uma string. Meu projeto, recebe via serial a seguinte string:

"[SERVER] [DATA] 10/09/21 [HORA] 15:12 [N] 8 [Permissao_I] OK [Apelido_C1] A [Modo_C1] Set_Point [SetPoint_C1] 90 [Pedido_I_C1] 1 [P_I_C1] 1 [Apelido_C2] B [Modo_C2] Horario [C_I_H_C2] 0 [N_Irrigacoes_C2] 2 [Pedido_I_C2] 1 [P_I_C2] 1 [Apelido_C3] C [Modo_C3] Set_Point [SetPoint_C3] 50 [Pedido_I_C3] 1 [P_I_C3] 1 [Apelido_C4] D [Modo_C4] Set_Point [SetPoint_C4] 50 [Pedido_I_C4] 1 [P_I_C4] 1 [Apelido_C5] E [Modo_C5] Set_Point [SetPoint_C5] 50 [Pedido_I_C5] 1 [P_I_C5] 1 [Apelido_C6] F [Modo_C6] Set_Point [SetPoint_C6] 50 [Pedido_I_C6] 1 [P_I_C6] 1 [Apelido_C7] G [Modo_C7] Set_Point [SetPoint_C7] 50 [Pedido_I_C7] 0 [P_I_C7] 1 [Apelido_C8] [Modo_C8] Set_Point [SetPoint_C8] 50 [Pedido_I_C8] 0 [P_I_C8] 1 [Mensagem] Nada Consta".

E eu preciso armazenar as informações dessa string, e armazená-las nas variáveis entre colchetes.

Através de um laço for, armazeno as informações em sua respectiva variável, contida num array de classe, como segue o código:

for (int i=0; i<Sistema.N_C; i++) {
    //---------------------------------------------------------------------APELIDO
    if(string_parcial2.indexOf("[Apelido_C"+String(i+1)+"]")>=0){
      Pos = string_parcial2.indexOf("[Apelido_C"+String(i+1)+"]");
      string_parcial = string_parcial2.substring(Pos + String("[Apelido_Cx]").legth());
      Area[i].Apelido = string_parcial.substring(0, string_parcial.indexOf(" "));

Serial.println("Apelido"+String(i+1)+":"+string_parcial.substring(0,string_parcial.indexOf(" ")));
    }
    //-------------------------------------------------------------------------Pedido
    if(Resultado.indexOf("[Pedido_I_C" + String(i) + "]")>=0){
      Pos = Resultado.indexOf("[Pedido_I_C" + String(i) + "]");
      string_parcial = Resultado.substring(Pos + String("[Pedido_I_Cx]").length());
      Area[i].pedido = (string_parcial.substring(0, string_parcial.indexOf(" "))).toInt();
       Serial.println("Pedido "+String(i)+":"+string_parcial.substring(0, string_parcial.indexOf(" ")));
    }
    //-----------------------------------------------------------------------------Permissao
    if(Resultado.indexOf("[P_I_C" + String(i) + "]")>=0){
      Pos = Resultado.indexOf("[P_I_C" + String(i) + "]");
      string_parcial = Resultado.substring(Pos + String("[P_I_Cx]").length());
      Area[i].Permissao = (string_parcial.substring(0, string_parcial.indexOf(" "))).toInt();
      Serial.println("Permisssao "+String(i)+":"+string_parcial.substring(0, string_parcial.indexOf(" ")));
    }
    //-------------------------------------------------------------------------MODO
    if(Resultado.indexOf("[Modo_C" + String(i) + "]")>=0){
      Pos = Resultado.indexOf("[Modo_C" + String(i) + "]");
      string_parcial = Resultado.substring(Pos + String("[Modo_Cx]").length());
      Area[i].Modo = string_parcial.substring(0, string_parcial.indexOf(" "));
      Serial.println("Modo "+String(i)+":"+string_parcial.substring(0, string_parcial.indexOf(" ")));
      if (Area[i].Modo == "Horario") { //-----------------------------------------------------------------------Modo de Horario
        if(Resultado.indexOf("[C_I_H_C" + String(i) + "]")>=0){
          Pos = Resultado.indexOf("[C_I_H_C" + String(i) + "]");
          string_parcial = Resultado.substring(Pos + String("[C_I_H_Cx]").length());
          Area[i].comando_i_horario = (string_parcial.substring(0, string_parcial.indexOf(" "))).toInt(); 
          Area[i].Umidade = 0;
        }
      }
      else if (Area[i].Modo == "Set_Point") { //------------------------------------------------------------------------------Modo Set_Point
        Pos = Resultado.indexOf("[SetPoint_C" + String(i) + "]");
        string_parcial = Resultado.substring(Pos + String("[SetPoint_Cx]").length());
        Area[i].Set_Point = (string_parcial.substring(0, string_parcial.indexOf(" "))).toInt();
        Serial.println("SetPoint "+String(i)+":"+string_parcial.substring(0, string_parcial.indexOf(" ")));
      }
    }
  }

Entretanto, esse código funciona apenas para uma quantidade de até 6 áreas, quando passa dessa quantidade, a função substring não consegue mais separar os dados.

Para resolver o problema, criei outra função para quebrar a string completa em 8 strings menores, como feito no código abaixo:

for (int i=0; i<8; i++){
    area[i].string_parcial=string_parcial2.substring(string_parcial2.indexOf([Apelido_C"+String(i+1)+"]"),string_parcial2.indexOf("[P_I_C"+String(i+1)+"]")+String("[P_I_Cx]").length()+2);
  }

Entretanto, o arduino consegue separar as strings menores para até 7 áreas. Quando é adicionado mais que 7, as substrings não são separadas.
Tentei realizar o processo com a função remove(), onde a cada laço, a substring já separada era excluída da string inteira, para o arduino conseguir processar com maior facilidade, mas também não funciona. Alguém pode me dar uma luz de como posso realizar essa separação das variáveis?

Desde já, grato.

guessing that the problem is recognizing the labels and values of each item in the string.

see code resulting in following

   0:               SERVER
   1:                 DATA  10/09/21
   2:                 HORA  15:12
   3:                    N  8
   4:          Permissao_I  OK
   5:           Apelido_C1  A
   6:              Modo_C1  Set_Point
   7:          SetPoint_C1  90
   8:          Pedido_I_C1  1
   9:               P_I_C1  1
  10:           Apelido_C2  B
  11:              Modo_C2  Horario
  12:             C_I_H_C2  0
  13:      N_Irrigacoes_C2  2
  14:          Pedido_I_C2  1
  15:               P_I_C2  1
  16:           Apelido_C3  C
  17:              Modo_C3  Set_Point
  18:          SetPoint_C3  50
  19:          Pedido_I_C3  1
const char msg [] = "[SERVER] [DATA] 10/09/21 [HORA] 15:12 [N] 8 [Permissao_I] OK [Apelido_C1] A [Modo_C1] Set_Point [SetPoint_C1] 90 [Pedido_I_C1] 1 [P_I_C1] 1 [Apelido_C2] B [Modo_C2] Horario [C_I_H_C2] 0 [N_Irrigacoes_C2] 2 [Pedido_I_C2] 1 [P_I_C2] 1 [Apelido_C3] C [Modo_C3] Set_Point [SetPoint_C3] 50 [Pedido_I_C3] 1 [P_I_C3] 1 [Apelido_C4] D [Modo_C4] Set_Point [SetPoint_C4] 50 [Pedido_I_C4] 1 [P_I_C4] 1 [Apelido_C5] E [Modo_C5] Set_Point [SetPoint_C5] 50 [Pedido_I_C5] 1 [P_I_C5] 1 [Apelido_C6] F [Modo_C6] Set_Point [SetPoint_C6] 50 [Pedido_I_C6] 1 [P_I_C6] 1 [Apelido_C7] G [Modo_C7] Set_Point [SetPoint_C7] 50 [Pedido_I_C7] 0 [P_I_C7] 1 [Apelido_C8] [Modo_C8] Set_Point [SetPoint_C8] 50 [Pedido_I_C8] 0 [P_I_C8] 1 [Mensagem] Nada Consta";


#include <stdio.h>
#include <string.h>

char s [1000];

int
tokens (
    const char  *msg,
    char       **tok,
    int          maxTok )
{
    strncpy (s, msg, sizeof(s)-1);

    int n = 0;
    tok [0] = strtok (s, "[");
    for (n++; (tok [n] = strtok (NULL, "[")) && n < maxTok; n++)
        ;

    return n;
}


#define MAX_TOKS 20
char *tok [MAX_TOKS];

int
main ()
{
    int nToks = tokens (msg, tok, MAX_TOKS);

    for (int n = 0; n < nToks; n++)  {
        printf (" %3d:", n);
        printf (" %20s", strtok (tok [n], "]"));
        printf (" %s",   strtok (NULL,    "]"));
        printf ("\n");
    }

    return 0;
}