Protocolo de Programação XVM


Todos os pacotes enviados para e pelo dispositivo começam com o caractere> (Maior) e terminam com a string <[CR] [LF] (Menor e Enter (caracteres com valor ASCII 13 e 10)).

As mensagens do protocolo XVM são compostas de quatro partes que são delimitadas por uma ";" (Ponto e vírgula), são as seguintes partes:

  1. Mensagem;
  2. ID = número do ID do dispositivo;
  3. # ID da mensagem;
  4. * Checksum;

Mensagens


As mensagens comummente começam com as letras S, Q, R ou C dependendo da ação a ser tomada e seguida das letras do comando. Em seguida segue uma série de caracteres variáveis que são os parâmetros do comando.
A primeira letra pode ser:

S = Set; é usado para gravar parâmetros no dispositivo.
Q = Query; Ele é usado para perguntar o valor dos parâmetros para o dispositivo.
C = clear; é usado para gravar variáveis em zero.
R = Response; indica a resposta do dispositivo a um comando S, Q ou C.


ID do dispositivo


O Equipamento sai de fábrica com um ID; que por default é os últimos 4 dígitos do seu numero serial.

  • O ID que é um identificador que pode ser modificado pelo usuário.
  • Ele é um número hexadecimal de 4 dígitos responsavel por permitir que você a reconheça o equipamento dentro da sua platafroma.
  • Alguns recursos especiais do equipamento, são acessados incluindo uma carácter apos o número de identificação.


Número da mensagem


O protocolo dos equipamentos Virloc sao baseados em pergunta e resposta, as mensagens são numeradas para identificar que a resposta pertence a uma determinada pergunta enviada. Quando o Virloc envia uma reporte gerado por um evento, a mensagem carrega um número identificador de 0x0001 a 0x7FFF e a plataforma em resposta a essa mensagem deve enviar uma confirmação (ACK) com o mesmo número de mensagem. Se a plataforma enviar um comando para o Virloc, a mensagem enviada deverá ter um número de 0x8000 para o 0xFFFF e o Virloc responderá a essa mensagem conforme apropriado, mas terá o mesmo número de mensagem que a gerou.

Check SUM


Em formato hexadecimal que é calculado por um XOR OR exclusivo com todos os códigos ASCII de caracteres que compõem a mensagem começando com ">" e terminando no último ";" incluído, mas não incluindo, o indicador "*" de Check SUM.

Cálculo de Check SUM


Exemplo em C:
/* get chksum */
 int r;<br>
 unsigned char chksum;
 
 chksum = 0;

 for (r = 0; r < strlen(modem.rxbuff); r++)
 {
 if ((modem.rxbuff[r] == '*') &&(modem.rxbuff[r-1] == ';'))
 break;
 else
 chksum = chksum ^ modem.rxbuff[r];
 }


Exemplo em C #:

public static string calculateChecksum(string data)
{
     int r;
     int calc = 0;
     byte caracter;
     string calculated_checksum;
 
     for (r = 0; r < data.Length; r++)
     {
       if ((data[r] == '*') && (data[r-1] == ';'))
         break;
     caracter = (byte)data[r];
     calc = calc ^ (byte)caracter;
     }
     calculated_checksum = calc.ToString("X");
     return calculated_checksum;
}


Se o check Sum calculado corresponder à recebida e não for uma mensagem de resposta, você deverá confirmar a recepção correta respondendo à seguinte mensagem:
> ACK; ID = 1017; # 0093; * 52 <[CR] [LF]

Onde:

> ACK Identificador de tipo de mensagem 
;
ID = 1017 ID do equipamento
; 
# 0093 Número da mensagem (o mesmo que foi recebido)
; 
* 52 check Sum desta mensagem
< Fim da mensagem
[CR] [LF] Fim da cadeia


Para determinar que não é uma mensagem de resposta, basta comparar que o número da mensagem recebida é menor que 0x8000. Isso ocorre porque as mensagens geradas pelo Virlocs têm um intervalo de 0x0000 a 0x7FFF e as geradas a partir do PC devem ter um intervalo de valores de 0x8000 a 0xFFFF. Se a recepção não for confirmada, o Virloc enviará a mensagem até XX vezes para cada tentativa de sessão de comunicação telefônica, ou seja, todas as mensagens devem ser respondidas.
Este protocolo é aquele usado por qualquer uma das mídias, com as quais todas as mensagens enviadas a ele serão respondidas com o número da mensagem correspondente, se as receberem bem. O dispositivo analisa a mensagem recebida, se for uma mensagem com resposta, responde com a mensagem correspondente e o número da mensagem igual ao recebido. Se a mensagem não tiver resposta, responda com> ACK; ID = 0003; # ABC0; * 2C <[CR] [LF].