User:Jenerps
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:
- Mensagem;
- ID = número do ID do dispositivo;
- # ID da mensagem;
- * 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].