Integrando impressora térmica bluetooth portátil com aplicativos Delphi Multi-Device

impressora-termica-bolso-android-w8-bluetooth-recibos-taxi-849811-MLB20674273238_042016-F

Neste post iremos implementar um aplicativo mobile para efetuar a impressão diretamente em uma impressora térmica bluetooth sem utilização alguma de SDKs de terceiros, tudo 100% Delphi nativo. No exemplo iremos focar apenas nos métodos necessários para demonstrarmos a integração.

Postado a pouco tempo, foi visto como efetuar a integração de seu aplicativo mobile feito em Delphi com uma impressora bluetooth utilizando seu SDK feito em java. Esse modelo de integração é interessante quando precisamos utilizar alguma funcionalidade especifica do fabricante. http://community.embarcadero.com/blog-drafts?view=entry&id=8616

Em sua maioria estas impressoras trabalham da mesmo forma que a “moderníssima” Impressora Epson LX 300 (se você não conhece este modelo de impressora peça auxilio à um adulto).

Nesse passado não muito distante, a impressão poderia ser realizada através do envio de comandos ESC/POS para a porta paralela onde a impressora estava conectada. E é desta mesma forma que iremos proceder, mas ao invés de enviarmos comandos para a porta paralela iremos envia-los através de uma porta Bluetooth.

Como todo bom Delpheiro você deve estar pensando que o Delphi provavelmente já tenha um componente que fará a conexão Bluethooth para nós e depois só precisaremos enviar os comandos de impressão.
E como todo bom Delfeiro, você está certo!

O Delphi possui o componente TBluetooth, que encapsula todo o mecanismos de comunicação Bluetooth do seu dispositivo mobile. É ele por exemplo que é responsável por listar os dispositivos pareados em nosso mobile, alem de efetuar a conexão com os dispositivo bluetooth e enviar comandos para este dispositivo.

Então vamos por a mão massa:

Para nosso exemplo crie uma aplicação multi-device em branco. (File\New\Mult-Device Application\Bank Application).

Antes de tudo devemos configurar o projeto para que o aplicativo tenha permissão para acessar o Bluetooth do mobile, então no menu Project\Options\Uses Permissions, habilite as opções Bluetooth e Bluetooth admin.

Project Options

Coloque um componente TBluetooth no formulário e altere sua propriedade Enable para True. Em nosso exemplo deixaremos o componente sempre ativo.

Coloque um ComboBox, no qual iremos listar os dispositivos Bluetooth pareados em nosso mobile.

O comando é bem simples, o método PairedDevices do componente TBluetooth retorna a lista de dispositivos pareados, desta forma só precisamos percorrer a lista e popular o nosso ComboBox.

Coloque um botão para efetuar a chamada deste código.
Assim quando você clicar neste botão o ComboBox será atualizado com a lista de dispositivos pareados.

Vamos para nossa segunda funcionalidade, a conexão com o dispositivo.

Primeiramente é preciso selecionar o dispositivo que será conectado. Um dispositivo Bluetooth é encapsulado pela classe TBluetoothDevice. Criaremos uma função que nos retorne o dispositivo usando como parâmetro seu nome, que estará selecionado no ComboBox.

As conexões Bluetooth são encapsuladas por uma classe Socket, a TBluetoothSocket. Esta classe é instanciada por um TBluetoothDevice. Executando o método ObterDevicePeloNome, teremos como retorno um TBluetoothDevice. E este objeto possui o método CreateClientSocket que irá criar nosso objeto Socket.

Cada tipo de dispositivo Bluetooth pode utilizar um tipo de Socket diferente. Por exemplo, um fone se comunica de uma forma diferente que uma impressora, mas ambos são Bluetooth, e estas configurações são dadas por um parâmetro UUID no método de criação do Socket.
O UUID é um identificador único universal, por exemplo, seja qual for o fabricante de fones Bluetooth eles irão utilizar o mesmo UUID para esta comunicação. (https://en.wikipedia.org/wiki/Universally_unique_identifier)

As Impressoras BT usam uma SerialPortServiceClass, que é definida pelo UUID 00001101-0000-1000-8000-00805F9B34FB.

Defina uma variável global FSocket: TBluetoothSocket para armazenar o objeto de conexão, e assim poder ser utilizados em outros métodos, como no de impressão.

Em um TButton chame o método ConectarImpressora passando como parãmetro o dispositivo selecionado no ComboBox, como no exemplo abaixo:

Para finalizar basta enviarmos através do método SendData do Socket os comandos da impressora (A lista de comandos geralmente acompanham o manual do produto).

Neste método fizemos o envio de diversos comandos de impressão como, quebra de linha, mudança de fontes e impressão de um código de barras.

A partir deste momento seu aplicativo já está integrado com nossa impressora Bluetooth, e sem utilizar qualquer outra biblioteca que não acompanhe a instalação básica do Delphi.

Segue abaixo uma lista de UUID de vários tipos de conexões bluetooth:

ServiceDiscoveryServerServiceClassID= ‘{00001000-0000-1000-8000-00805F9B34FB}’;
BrowseGroupDescriptorServiceClassID = ‘{00001001-0000-1000-8000-00805F9B34FB}’;
PublicBrowseGroupServiceClass = ‘{00001002-0000-1000-8000-00805F9B34FB}’;
SerialPortServiceClass = ‘{00001101-0000-1000-8000-00805F9B34FB}’;
LANAccessUsingPPPServiceClass = ‘{00001102-0000-1000-8000-00805F9B34FB}’;
DialupNetworkingServiceClas = ‘{00001103-0000-1000-8000-00805F9B34FB}’;
IrMCSyncServiceClass = ‘{00001104-0000-1000-8000-00805F9B34FB}’;
OBEXObjectPushServiceClass= ‘{00001105-0000-1000-8000-00805F9B34FB}’;
OBEXFileTransferServiceClass = ‘{00001106-0000-1000-8000-00805F9B34FB}’;
IrMCSyncCommandServiceClass= ‘{00001107-0000-1000-8000-00805F9B34FB}’;
HeadsetServiceClass = ‘{00001108-0000-1000-8000-00805F9B34FB}’;
CordlessTelephonyServiceClass = ‘{00001109-0000-1000-8000-00805F9B34FB}’;
AudioSourceServiceClass = ‘{0000110A-0000-1000-8000-00805F9B34FB}’;
AudioSinkServiceClass= ‘{0000110B-0000-1000-8000-00805F9B34FB}’;
AVRemoteControlTargetServiceClass = ‘{0000110C-0000-1000-8000-00805F9B34FB}’;
AdvancedAudioDistributionServiceClass = ‘{0000110D-0000-1000-8000-00805F9B34FB}’;
AVRemoteControlServiceClass= ‘{0000110E-0000-1000-8000-00805F9B34FB}’;
VideoConferencingServiceClass = ‘{0000110F-0000-1000-8000-00805F9B34FB}’;
IntercomServiceClass = ‘{00001110-0000-1000-8000-00805F9B34FB}’;
FaxServiceClass = ‘{00001111-0000-1000-8000-00805F9B34FB}’;
HeadsetAudioGatewayServiceClass= ‘{00001112-0000-1000-8000-00805F9B34FB}’;
WAPServiceClass = ‘{00001113-0000-1000-8000-00805F9B34FB}’;
WAPClientServiceClass = ‘{00001114-0000-1000-8000-00805F9B34FB}’;
PANUServiceClass = ‘{00001115-0000-1000-8000-00805F9B34FB}’;
NAPServiceClass = ‘{00001116-0000-1000-8000-00805F9B34FB}’;
GNServiceClass = ‘{00001117-0000-1000-8000-00805F9B34FB}’;
DirectPrintingServiceClass = ‘{00001118-0000-1000-8000-00805F9B34FB}’;
ReferencePrintingServiceClass = ‘{00001119-0000-1000-8000-00805F9B34FB}’;
ImagingServiceClass= ‘{0000111A-0000-1000-8000-00805F9B34FB}’;
ImagingResponderServiceClass = ‘{0000111B-0000-1000-8000-00805F9B34FB}’;
ImagingAutomaticArchiveServiceClass = ‘{0000111C-0000-1000-8000-00805F9B34FB}’;
ImagingReferenceObjectsServiceClass = ‘{0000111D-0000-1000-8000-00805F9B34FB}’;
HandsfreeServiceClass = ‘{0000111E-0000-1000-8000-00805F9B34FB}’;
HandsfreeAudioGatewayServiceClass = ‘{0000111F-0000-1000-8000-00805F9B34FB}’;
DirectPrintingReferenceObjectsServiceClass = ‘{00001120-0000-1000-8000-00805F9B34FB}’;
ReflectedUIServiceClass = ‘{00001121-0000-1000-8000-00805F9B34FB}’;
BasicPringingServiceClass = ‘{00001122-0000-1000-8000-00805F9B34FB}’;
PrintingStatusServiceClass= ‘{00001123-0000-1000-8000-00805F9B34FB}’;
HumanInterfaceDeviceServiceClass = ‘{00001124-0000-1000-8000-00805F9B34FB}’;
HardcopyCableReplacementServiceClass = ‘{00001125-0000-1000-8000-00805F9B34FB}’;
HCRPrintServiceClas = ‘{00001126-0000-1000-8000-00805F9B34FB}’;
HCRScanServiceClass= ‘{00001127-0000-1000-8000-00805F9B34FB}’;
CommonISDNAccessServiceClass = ‘{00001128-0000-1000-8000-00805F9B34FB}’;
VideoConferencingGWServiceClass = ‘{00001129-0000-1000-8000-00805F9B34FB}’;
UDIMTServiceClass = ‘{0000112A-0000-1000-8000-00805F9B34FB}’;
UDITAServiceClass = ‘{0000112B-0000-1000-8000-00805F9B34FB}’;
AudioVideoServiceClass = ‘{0000112C-0000-1000-8000-00805F9B34FB}’;
SIMAccessServiceClass = ‘{0000112D-0000-1000-8000-00805F9B34FB}’;
PnPInformationServiceClass= ‘{00001200-0000-1000-8000-00805F9B34FB}’;
GenericNetworkingServiceClass = ‘{00001201-0000-1000-8000-00805F9B34FB}’;
GenericFileTransferServiceClass = ‘{00001202-0000-1000-8000-00805F9B34FB}’;
GenericAudioServiceClass= ‘{00001203-0000-1000-8000-00805F9B34FB}’;
GenericTelephonyServiceClass = ‘{00001204-0000-1000-8000-00805F9B34FB}’;

 

11 thoughts on “Integrando impressora térmica bluetooth portátil com aplicativos Delphi Multi-Device

  1. thiago disse:

    Qual modelo de impressora posso usar esse código?

    1. alanglei disse:

      Qualquer impressora Bluetooth que funcione com comandos ESC/POS

  2. thiago disse:

    onde compro uma impressora igual do video?

    1. alanglei disse:

      Esse eu comprei no aliexpress.com

  3. DANIEL disse:

    Este exemplo funcionaria com comandos EPL ou ZPL?

    1. alanglei disse:

      Vai depender da sua impressora… Ok!

  4. Jair RC disse:

    O tutorial é bem bacana e dá um grande ponta-pé inicial, mas seria possível, colocar como comentário, na parte em que faz o envio dos dados para a impressora, o que faz cada conjunto de comandos que estão sendo utilizados?? Tentei isolar cada bloco, mas o resultado é um pouco confuso e não consegui decifrar… o manual da impressora então (Datec DPP-250) tem todos os códigos, mas entender como usá-los está bem complicado….
    Agradeço sua ajuda.

  5. Paulo Freire disse:

    Excelente Alan, show de bola, parabéns mais uma vez.

  6. Diego Planche disse:

    Opa funcionou que é uma maravilha. Agora estou com problema na impressão de caracteres especiais, já tentei acho que todos os comandos esc, mas não consegui resolver. Teve esse problema?

  7. thiago disse:

    parabens Allan…. coloquei outra impressora bluetooth seguindo sua dica e funcionou….

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *