Criada no Brasil em 2005, POSXML (acrônimo para Point Of Sale eXtended Markup Language) é uma linguagem de programação usada para criar aplicações para um terminal P.O.S., do inglês, Point Of Sale ou Point Of Service.
Geralmente, o desenvolvimentos de aplicações para terminais POS, são realizados através de uma linguagem de programação chamada C ou C++, o que demanda um conhecimento profundo das especificações técnicas da máquina (Hardware) e um programador qualificado para exercer tal tarefa. Seu propósito principal é facilitar o trabalho de desenvolvimento de aplicações para os terminais POS, pois possui um conjunto de instruções e comandos previamente programados que interagem diretamente com a máquina, por assim dizer, reduzindo consideravelmente o tempo de programação de aplicações.
Características da Linguagem A estrutura do POSXML A linguagem POSXML, assim como o próprio nome sugere, segue o padrão aberto de linguagem XML, amplamente difundido atualmente na indústria de software. O padrão XML é totalmente flexível e possibilita uma rápida expansão da linguagem.
A linguagem POSXML é organizada e estruturada em forma de TAGs apresentando níveis e subníveis de um conjunto de comandos e instruções que formam a estrutura lógica de um aplicativo POSXML.
Exemplo:
Display <stringvariable value="" variable="sTicketInfo"/> <stringvariable value="" variable="sCityInfo"/> <integervariable value="0" variable="iQtdTickets"/> <integervariable value="0" variable="iInvalidInfo"/>
<!-- Function Display MAIN Menu --> <function name="fMainMenu"> <integervariable value="0" variable="iOption"/>
<!-- Main Menu --> <menu options="MENU PRINCIPAL:\\1.VENDA DE INGRESSO\2.RELATORIO\3.SAIR" variable="$(iOption)"/>
<!-- 1.VENDA DE INGRESSO --> <if operator="equalto" value="1" variable="$(iOption)"> ... </if> ... </function>
A primeira versão da linguagem POSXML exigia que todos os programas escritos na linguagem possuíssem uma TAG Pai ou TAG Root identificada por um identificador/nome válido. A partir da nova versão online, onde os programadores podem escrever os programas em POSXML na WEB, disponível em formato Cloud Computing, a "TAG Pai" ou "TAG Root" foi abolida, simplificando o processo de programação.
A única limitação que o programador encontra é o tamanho do aplicativo, que não pode ultrapassar 32 kbytes de código compilado! Para se ter uma ideia da compilação oferecida pela plataforma, um aplicativo comum de 1600 linhas de códigos POSXML e 76 kbytes, quando compilado tem seu tamanho reduzido para 15 kbytes.
Exemplo:
<function name="display_test"> <display line="1" column="0" message="Aplicativo POSXML" /> <display line="2" column="0" message="Empresa A"/> <waitkey /> <cleandisplay /> </function>
Por padrão, a estrutura da linguagem XML possui alguns caracteres reservados sendo respeitados também pela linguagem POSXML e são escritos da forma correta: * < ; < * > ; > * & ; & * &apos ; ' * " ; "
Exemplo:
<function name="mostramensagem"> <display line="0" colunm="0" message="< = menor" /> <waitkey /> </function>
<function name="display_test"> <callfunction name="mostramensagem" /> </function>
Assim como no XML, a linguagem POSXML aceita a definição de seções de comentários que facilita a documentação do programa.
Exemplo:
<function name="mostramensagem"> <display line="0" column="0" message="< = menor" /> <waitkey /> </function>
<function name="display_test"> <!-- Este exemplo demonstra a utilização de uma --> <!-- função que apresenta uma mensagem no display --> <callfunction name="mostramensagem"/> </function>
Linguagem Compilada
Assim como a grande maioria das linguagens de programação existentes, POSXML também é compilada em um formato específico, de tamanho reduzido para que possa ser executado no terminal POS através de um framework (máquina virtual). Um programa escrito em POSXML, quando compilado, transforma-se em um conjunto de bytecodes que são interpretados pela máquina virtual resultando na execução do programa no terminal POS.
Cada comando, função ou instrução do programa escrito em POSXML, quando compilado, se transforma em um bytecode único que o identifica na biblioteca de comandos do framework (máquina virtual).
Exemplo:
<display line="0" column="0" message="Exemplo de Bytecode" /> Bytecode compilado: d0 \x0A 0 \x0A Exemplo de Bytecode \x0A \x0D
O perfeito funcionamento de um programa compilado em POSXML no terminal fica por conta de uma máquina virtual, chamada de framework, que trabalha sobre o sistema operacional do equipamento POS. Em outras palavras, uma aplicação em POSXML compilada e instalada no terminal POS fica localizada na 4a. camada de softwares encontrados no aparelho, como pode-se observar a figura abaixo:
center
O modelo usado de compilação em bytecodes que podem ser interpretados por uma máquina virtual, permite que um programa escrito em linguagem POSXML possa ser usado, ou melhor, possa ser interpretado pela máquina virtual em diferentes terminais POS, desde que a marca e modelos especificados possuam um framework próprio. Isso significa que, uma vez programada uma aplicação para um determinado modelo de terminal POS, o programador pode escolher usar a mesma aplicação em outro terminal, cuja máquina virtual seja compatível com tal equipamento, não havendo a necessidade de nenhuma alteração ou implementação no código-fonte POSXML original do primeiro equipamento.
Tal portabilidade assegura que, haverá um esforço mínimo, ou nenhum esforço para migração de aplicações entre terminais POS de diferentes marcas e diferentes modelos.
center
A linguagem
De fácil leitura e sua forma estruturada em formato XML, a linguagem POSXML é caracterizada por um conjunto de comandos e instruções próprios que interagem com o equipamento e torna fácil tarefas como a impressão de dados, a leitura de dados em um cartão com tarja magnética, a entrada de dados através de um teclado numérico, entre outras funções do terminal POS.
Sintaxe
Os comandos e instruções do POSXML devem obrigatoriamente obedecer algumas regras de formação, e uma delas é a observância quanto ao uso de letras maiúsculas e minúsculas (case sensitive). Alguns comandos pertencentes à linguagem não requerem parâmetros, ao contrário de outros comandos que precisam de parâmetros para interagir com a máquina.
Exemplos:
Comandos que não exigem instruções ou parâmetros. <exit /> <cleandisplay /> <waitkey /> Comandos que requerem instruções e parâmetros para interação com o equipamento. <display line="1" column="1" message="POSXML" /> <menu variable="$(option)" options="OPTION 1\OPTION 2\OPTION 3" /> <waitkeytimeout seconds="10"/>
Os nomes atribuídos à funções, variáveis e funções também devem obedecer às regras de escrita em letras maiúsculas e minúsculas, portanto, se um programador criar uma função chamada "calcula_digito", ele não terá êxito se fizer uma chamada na função "Calcula_Digito", ou seja, a invocação de uma função, aplicativo ou variável deve obedecer o nome exatamente igual ao nome atribuído pelo programador.
Comandos e instruções
Por se tratar de uma linguagem estruturada e baseada no formato XML, o POSXML é uma linguagem que está constantemente evoluindo, e novos comandos e instruções podem ser adicionados em sua biblioteca a qualquer momento. Inicialmente a linguagem contava com não menos que duas dezenas de comandos básicos, indispensáveis para se criar um programa, digamos, no mínimo funcional em um terminal POS, com poucos recursos, apenas o básico de display (visor), teclado numérico, cartão magnético e impressão.
Com a evolução da linguagem, atualmente são quase uma centena de comandos e instruções que lidam com arquivos, imagens, operadores matemáticos, funções para manipular variáveis do tipo string, definição de variáveis, operadores lógicos, classes para se trabalhar com protocolo ISO 8583 (protocolo padrão para intercâmbio de informações nas operações com cartões de crédito), comandos e instruções para trabalhar com transações EMV e com transações Contacless, entre outros.
Lista de comandos/instruções da linguagem
if Instrução de tomada de decisão ou comparação lógica else Condição lógica em um bloco da instrução if while Instrução que permite a execução de um código multiplas vezes break O comando break possibilita a saída imediata do loop while function Define um bloco de código que pode ser posteriormente executado callfunction Realiza uma chamada em uma função previamente definida execute Executa um aplicativo POSXML compilado e armazenado no POS exit Encerra imediatamente a execução do aplicativo POSXML getcardvariable Obtém o número do cartão e o armazena diretamente em uma variável system.readcard Aguarda até que um cartão seja passado ou uma tecla seja pressionada system.inputtransaction Instrução para receber os dados do cartão em uma transação contactless menu Monta um menu na tela do terminal, baseado no número de linhas do POS menuwithheader Monta um menu com cabeçalho, baseado no número de linhas do POS displaybitmap Exibe um bitmap monocromático no display do POS display Exibe uma mensagem customizada no display do terminal POS cleandisplay Apaga todo conteúdo do display do terminal POS system.gettouchscreen Captura as coordenadas (x e y) de onde o display foi pressionado print Imprime uma mensagem customizada em tamanho de fonte padrão printbig Imprime uma mensagem customizada em tamanho de fonte dupla printbitmap Imprime um bitmap monocromático presente no terminal POS printbarcode Imprime um código de barras no formato I25, na horizontal ou vertical checkpaperout Verificar se o compartimento de papel ainda contém papel paperfeed Envia um sinal para a impressora adicionando linhas em branco no ticket inputfloat Permite a entrada de um valor com ponto (.) através da tecla (*) inputformat Permite a entrada de um valor baseado em um formato pré-definido inputinteger Permite a entrada de um valor inteiro inputoption Armazena em uma variável a opção de um item de menu inputmoney Permite a entrada de um valor monetário crypto.crc Calculo CRC 16 bits, suporte a CRC-CCITT crypto.encryptdecrypt Rotinas de criptografia com algoritmos DES, 3DES ou NEWDES crypto.lrc Gera um byte de LRC da string em buffer crypto.xor Realiza uma operação binária XOR entre os bytes de 2 strings downloadfile Faz o download de um arquivo previamente cadastrado no WALK Manager filesystem.filesize Retorna o tamanho de um arquivo na memória do POS filesystem.listfiles Lista os arquivos de um diretório salvando-os em um arquivo filesystem.space Verifica o espaço (livre e utilizado) e o número de arquivos na memória file.open Abre um arquivo para leitura ou escrita file.close Fecha um arquivo que foi previamente aberto com file.open file.read Lê um arquivo que foi previamente aberto com file.open file.write Grava um arquivo que foi previamente aberto com file.open readfile Realiza a leitura de um arquivo WALK dbfile (chave/valor) readfilebyindex Realiza a leitura de uma chave de um arquivo WALK dbfile editfile Permite escrever um arquivo no formato WALK dbfile (chave/valor) deletefile Efetua a exclusão de um arquivo da memória do terminal POS iso8583.initfieldtable Inicia a tabela de campos ISO8583 baseado em um arquivo especificado iso8583.initmessage Inicia a montagem de uma mensagem ISO iso8583.putfield Insere um campo na mensagem, obrigatoriamente em ordem crescente iso8583.endmessage Finaliza a montagem da mensagem ISO iso8583.transactmessage Acrescenta size, header e trailer e envia a mensagem ISO ao autorizador iso8583.analyzemessage Inicia o processo de análise e decomposição dos campos da mensagem iso8583.getfield Extrai um campo de uma mensagem previamente analisada openserialport Abre a porta serial para comunicação com periféricos externos writeserialport Escreve um buffer na porta serial readserialport Lê um buffer de um dispositivo externo capturado pela porta serial closeserialport Fecha a porta serial getdatetime