PROTOCOLO DE COMUNICAÇÃO
As mensagens trocadas entre os sistemas deveram ser formatadas no padrão JSON. Para garantir que as mensagens trafeguem de forma consistente e completa, utiliza-se um protocolo simples para encapsular as mensagens. Nesse protocolo, cada mensagem é precedida por um conjunto de bytes que informa o tamanho total do pacote. Desse modo, os dados brutos recebidos pelo socket TCP seguem o formato abaixo:
-
Bytes 1 a 4: Prefixo, contendo o tamanho da mensagem (sem contar os 4 bytes iniciais), no formato signed little-endian.
-
Bytes 5 a n: Corpo da mensagem, codificado no formato ASCII.
Durante todo o tempo em que a conexão permanecer aberta, as partes poderão enviar, de forma opcional, uma mensagem especialmente construída para garantir que a conexão ainda é válida. Esta mensagem, do tipo “keep alive”, será composta apenas pelo prefixo de quatro bytes, sem o segmento de dados. O conteúdo do prefixo deverá ser o valor numérico “-1”, no formato signed little-endian.
A mensagem de keep alive poderá ser enviada a qualquer momento por qualquer um dos sistemas. Uma vez recebida, a mensagem de keep alive pode ser descartada sem que seja necessária nenhuma ação por parte do recebedor.
Todas as mensagens transmitidas deverão estar dentro de um envelope cujo conteúdo é descrito abaixo. O envelope deve ser codificado no formato JSON e conter a identificação do remetente (Sender), o tipo da mensagem (MessageType), a carga (Payload) e opcionalmente uma assinatura digital (Signature). O conteúdo de cada um dos campos é descrito na tabela abaixo:
CAMPO | TIPO | DESCRIÇÃO | EXEMPLO |
Sender | string | Informa a origem da mensagem (nome da OSA) | OSA |
MessageType | string | Informa o tipo da mensagem que está no campo Payload | MsgHandshake |
Payload | string | O conteúdo da mensagem | {"DateTime":"20201230164505.000"} |
Signature | string | Opicional. Assinatura digital usada para autenticar o remetente da mensagem |
Exemplo de um envelope, contendo um payload do tipo Handshake, sem assinatura digital:
{
"Sender":"Osa",
"Signature":null,
"Payload":{
"DateTime":"20120830220920.405"
},
"MessageType": "MsgHandshake"
}
A carga contém os dados da mensagem, e pode assumir diversos formatos de acordo com o tipo da mensagem. Além da serialização no formato JSON, os dados transmitidos na carga das mensagens seguem as seguintes convenções de formato, de acordo com o tipo:
- Strings: delimitadas entre aspas duplas (“).
- Valores null, sem delimitadores, indicam a ausência de conteúdo do campo.
- Números (integer, decimal): sem delimitadores, utilizando-se ponto para separação de casas decimais, quando necessário, e sem separadores de milhar.
- Datas: convertidas para strings no formato “yyyyMMddHHmmss.fff”.
- Booleanos: true ou false, sem delimitadores.
- Demais tipos de dados: convertidos para array de bytes e codificados no formato Base64.