Todos os dias nas lojas, vemos diferentes balcões - todos os tipos de soluções incorporadas com botões misteriosos. Atrás de tais mesas de caixa há caixas que gritam "Galya, nós cancelamos". Isso é inconveniente para caixas e compradores.
A interface do checkout se torna mais amigável ao longo do tempo, e o Gali já é menos necessário, mas o checkout ainda permanece um artefato complicado e complexo.

Meu nome é Vladimir Sarbeev, sou desenvolvedor Android no MySklad. E tenho certeza de que a caixa registradora pode ser compacta e conveniente. Além disso, você pode transformar seu smartphone em uma caixa.
No MyStore, criamos o aplicativo móvel Kassa MyStore. Esta é uma bilheteria completa dentro do smartphone.
Funciona assim: após a autorização, o caixa pode abrir e fechar turnos, vender mercadorias diretamente ou mediante reserva, levar em consideração o dinheiro. Você pode conectar dispositivos necessários para trabalhar no Caixa. Eles estão na foto:

1 - bilheteria Atol Sigma 10; 2 - o aplicativo não é suportado, integração com funcionários
3 - bilheteria Atol 11F; 4 - Verifone VX820 terminal; 5 - terminal PAX S90
6 - bilheteria Shtrikh-Nano-F; 7 - bilheteria Atol 15F; 8 - bilheteria Bar-ON-LINE
9 - scanner de código de barras; 10 - terminal PayMe; 11 - balcão de caixa MSPOS-K
O smartphone em si não pode imprimir recibos de dinheiro e aceitar pagamentos com cartão de crédito; portanto, são necessários balcões e terminais de pagamento. É necessário um scanner de hardware se a câmera do smartphone não for adequada para a substituição completa do scanner de código de barras.
Olho que tudo vê
Mesmo antes do lançamento do MySklad, o Cash desk, decidimos que a câmera é uma câmera, mas o usuário pode ter um scanner de código de barras de hardware que ele deseja usar.
Podemos trabalhar com scanners na forma de um HID comum (dispositivo de interface humana). Depois de ler o código de barras, obtemos uma sequência de caracteres no scanner. Esta é talvez a integração mais fácil. O mais simples, se não dois "buts".
Em primeiro lugar, estando “pronto para uso”, um scanner pode não transmitir o que deveria. Em segundo lugar, nem todos os modelos de scanner nos sinalizam que a leitura do código de barras está completa.
O primeiro “mas” é resolvido simplesmente: se o scanner começar a transmitir não o que deve digitalizar, você precisará encontrar as instruções para o scanner e configurá-lo usando os códigos de barras de serviço. Normalmente, as instruções são completas em papel ou em formato eletrônico do fabricante. Depois de descrever as configurações disponíveis, ele contém códigos de barras que são digitalizados na sequência desejada. Assim, você pode configurar o scanner conforme necessário.
O segundo "mas" é um problema mais sério. O zoológico de scanners é extenso e nem todos os dispositivos mostram o fim de uma linha de leitura. Existem duas opções para resolver esse problema. A primeira é usar os mesmos códigos de barras de serviço para definir uma configuração que transmitirá o caractere de quebra de linha após a leitura. Se você não tiver sorte com o modelo e a primeira opção não for adequada, poderá definir o sufixo do scanner. Usando os códigos de barras de serviço, adicione um caractere no final da sequência de leitura, pelo qual você pode capturar o final da entrada.
Eu conecto mesa de dinheiro
Portanto, o aplicativo está lá, o scanner de código de barras está conectado, mas ainda não conseguimos imprimir o cheque. Para isso, precisamos da bilheteria. No MySklad, apoiamos o KKT Atol e o Shtrikh, também o MSPOS, vou falar sobre isso em outro artigo.
No que diz respeito à integração com o caixa, a quantidade de código de ferro começou a crescer inexoravelmente. Decidimos colocar todo o trabalho com o equipamento conectado em uma biblioteca separada. O próprio aplicativo de caixa registradora se tornou um cliente puxando uma biblioteca através do gradle.
Dependendo do modelo, você pode conectar via USB, Bluetooth ou Wi-Fi. E também de acordo com o protocolo UART, que é um acoplamento rígido da caixa registradora e um dispositivo Android em um caso. Além disso, diferentes fornecedores diferem radicalmente na implementação da conexão do cliente ao checkout. Wrapper Java sobre as bibliotecas nativas .so, um complemento sobre a biblioteca jPOS de código aberto e até o núcleo fiscal acessado por meio de um serviço com uma interface AIDL (linguagem de definição de interface do Android).
Nas primeiras tentativas de integrar um dispositivo de um fabricante, ficamos satisfeitos com o esquema de interação do dispositivo KKM:

Mas, levando em consideração o número de implementações de driver, métodos de conexão e uniformidade de funcionalidade, decidimos repensar o trabalho com hardware. Como resultado, o esquema anterior chegou a este formulário:

T é um wrapper de driver de baixo nível específico
O Gerenciador de dispositivos oculta a implementação da conexão do cliente. Basta criar um assistente de conexão, que requer que você selecione sequencialmente o fabricante, o tipo de conexão e especifique as configurações. No caso de uma conexão bem-sucedida, ele nos retorna um objeto que implementa a interface KKMDevice.
O KKMDevice oculta os detalhes do trabalho com um driver de fornecedor individual. Os invólucros de cada fabricante específico contêm um link para o driver T e os delegados que implementam certos conjuntos de funções. Por exemplo, FiscalDelegate, NonFiscalDelegate, DeviceInfoDelegate.
Vou observar alguns pontos gerais de integração:
- Fique atento às atualizações do driver. Além de correções de bugs e maior velocidade, ocorrem frequentemente saltos de qualidade. Acredite, a transição de comandos HEX de baixo nível para uma interface semelhante a Java e dela para tarefas json facilita muito o trabalho e torna o código mais compreensível.
- Durante a duração das operações, bloqueie a interface do usuário com uma barra de progresso. A placa diz que o botão "Pagar" pressionado várias vezes seguidas com um PCC conectado é um prenúncio de críticas no rastreador de tarefas.
- Verifique se as operações com o CCP são executadas estritamente em sequência. Uma corrida de fluxo “bem-sucedida” pode desligar o KKT, enquanto a barra de progresso girando ao mesmo tempo também é uma aplicação.
- Se você precisar configurar a transferência de dados para o operador de dados fiscais, aconselho a selecionar o número máximo de parâmetros em uma lista predefinida. Como inserir dados manualmente com uma unidade fiscal militar é uma ótima maneira de dar um tiro no pé, mas no lado do usuário ao usar o aplicativo.
Uma unidade fiscal é um dispositivo que coleta e processa informações sobre operações de negociação. Pode custar mais do que as próprias bilheterias. Se a unidade não estiver configurada corretamente, pode ser necessário zerar o processo. Para fazer isso, abra a bilheteria e imediatamente a garantia voa.
Aquisição
Portanto, temos a interface do caixa, podemos digitalizar as mercadorias por código de barras e imprimir o cheque. Resta acrescentar a capacidade de pagar com cartão.
Nosso aplicativo integra suporte para terminais PayMe e Inpas. Os primeiros são conectados via Bluetooth, enquanto os últimos podem ser conectados via USB ou Wi-Fi.
O esquema de conexão para terminais de pagamento é muito semelhante à conexão de um PCC, a menos que seja necessária autorização adicional.
Mas existem diferenças sérias - ao lidar com o comportamento anormal do dispositivo. Portanto, no PCC, qualquer operação foi aprovada com êxito ou não. Se a operação falhar, você pode tentar novamente ou cancelá-lo. Tudo o resto acontece sem intervenção.
No caso de terminais, é necessário monitorar possíveis interrupções do processo de pagamento a qualquer momento. Um cartão bancário pode não ser considerado ou haverá fundos insuficientes no cartão. Você não pode esperar por uma resposta do banco ou aguardar, mas obtenha um código HTTP 5xx em resposta. E em qualquer um dos estágios, a conexão pode simplesmente cair.
Além disso, você não poderá liberar um aplicativo que funcione adequadamente com o suporte do terminal Inpas sem certificação. A certificação inclui a verificação da disponibilidade e a operação correta de todas as operações do usuário do terminal e o processamento de eventos, como desconexão da rede depois que o comprador já anexou um cartão ao terminal.
Ao testar o terminal, é necessário considerar com qual banco ou sistema de pagamento ele está associado. Em alguns casos, mesmo no modo de desenvolvimento, o dinheiro é reembolsado apenas através da conta pessoal da conta, e não automaticamente.
Você também precisa se lembrar de que o banco também participa do processo de pagamento. Por exemplo, a ausência de um cheque-slip pode ocorrer se não houver uma configuração necessária na conta pessoal do banco.
Conclusão
Conectar vários dispositivos a um aplicativo Android é um processo complicado, mas interessante. Conversamos sobre ele como um todo, para descrever todos os obstáculos, é claro, não é realista.
Se você tiver alguma dúvida, terei prazer em respondê-las nos comentários. Se as perguntas forem digitadas em um artigo separado, escreva :)