News & Events
Imprimindo em mini-impressoras Bluetooth de modo prático e fácil.
- 26 de outubro de 2020
- Posted by: Adriano Santos
- Category: Android delphi Delphi for Android ios mobile Mobile Studio Notícias
Eu já gravei aulas falando sobre a impressão através de mini-impressoras Bluetooth e a repercussão foi sempre grande. Isso se deve a nossa grande dependência atual por dispositivos móveis cada vez menores e mais portáteis. Hoje diversas empresas já enviam seus colaboradores para rua munidos de smartphone ou tablet e uma mini-impressora bluetooth. É mais comum do que imagina.
Bares, lanchonetes e restaurantes ainda não aderiram 100%, entretanto já fui há várias feiras de negócios e tecnologia e o que encontrei foram muitas “ilhas” de alimentação utilizando essas mini-impressoras. E por que será que esse fenômeno tem acontecido com mais frequência?
Imprimindo em mini-impressoras Bluetooth de modo prático e fácil
Essas impressoras térmicas gastam pouca energia, são fáceis de transportar, atendem o mercado e proporcionam mais praticidade ao estabelecimento comercial e/ou profissional que trabalha em campo, seja na rua (leituristas de contas de água, luz, etc) ou em locais fixos.
Mas como podemos integrar nosso aplicativo a essas impressoras? Eis a questão?
O processo pode ser mais simples do que imagina, mas é claro que precisa seguir alguns passos importantes para que essa integração seja bem feita.
Nesse artigo quero lhe mostrar como:
- Detectar e listar os dispositivos bluetooth pareados com o smartphone/tablet;
- Conectar-se a impressora;
- Imprimir um texto básico nela.
Preparando o aplicativo
A primeira coisa que desejo que faça é criar um app simples no Delphi utilizando o menu File > New > Multi-Device Application Delphi. Desenhe uma tela com apenas 01 label na parte superior com o texto “Impressão”, 01 componente ComboBox renomeado para cbxDevices e um TButton com o Text igual a “Imprimir”. Pode colocar tudo alinhado ao topo. Assim teremos um app simples. Insira também (se desejar) um ListBox e dentro dele um Item de ListBox. Coloque o ComboBox dentro desse Item de ListBox e alinhe-o de modo que o lado direito do Item de ListBox fique um pouco visível. Nós mostraremos um check nesse item.
Adicione também um componente do tipo TBluetooth e renomeie-o para BT. Existem 02 componentes Bluetooth no Delphi. Tome cuidado para não inserir o componente errado.
A primeira parte da codificação é inserir o UUID usado para conectar nosso app com a impressora. Ele é sempre o mesmo para todas as impressoras.
//UUID para impressoras Bluetooth
const
UUID = '{00001101-0000-1000-8000-00805F9B34FB}';
Crie uma constante como mostrado acima e use sempre esse mesmo UUID.
Agora vamos a declaração de alguns métodos e variáveis que vão nos ajudar no processo todo. Encontre a seção Private e adicione os métodos como abaixo, em seguida pressione Ctrl + Shift + C.
FSocket : TBluetoothSocket;
procedure ListarDispositivosPareadosNoCombo;
function ObterDevicePeloNome(ANomeDevice: string) : TBluetoothDevice;
function ConectarImpressora(ANomeDevice: string): Boolean;
Repare que temos uma variável do tipo TBluetoothSocket e 03 métodos. Os nomes dos métodos já são autoexplicativos. De qualquer forma vamos entender:
O métodos ListarDispositivosPareadosNoCombo fará o processo de “discovery” dos dispositivos pareados com o smartphone/tablet e adicionará no ComboBox.
Atenção: O método “não sabe” quem é uma impressora ou um outro dispositivo, ou seja, se você tiver um fone de ouvido bluetooth pareado com o dispositivo ou qualquer outro aparelho, ele aparecerá no combo.
O método ObterDevicePeloNome é responsável por devolver o Device correto procurando-o pelo seu nome.
E por fim o médoto ConectarImpressora fará a conexão propriamente dita ao dispositivo que desejamos imprimir o texto. Os 03 métodos completos encontram-se abaixo. Vamos a uma breve explicação:
function TfrmPrincipal.ConectarImpressora(ANomeDevice: string): Boolean;
var
lDevice : TBluetoothDevice;
begin
Result := False;
lDevice := ObterDevicePeloNome(ANomeDevice);
if lDevice <> nil then
begin
FSocket := lDevice.CreateClientSocket(StringToGUID(UUID), False);
if FSocket <> nil then
begin
FSocket.Connect; //Conectando-se a impressora
Result := FSocket.Connected;
end;
end;
end;
procedure TfrmPrincipal.ListarDispositivosPareadosNoCombo;
var
lDevice : TBluetoothDevice;
begin
cbxDevices.Clear;
for lDevice in BT.PairedDevices do
cbxDevices.Items.Add(lDevice.DeviceName);
end;
function TfrmPrincipal.ObterDevicePeloNome(
ANomeDevice: string): TBluetoothDevice;
var
lDevice : TBluetoothDevice;
begin
Result := nil;
for lDevice in BT.PairedDevices do
if lDevice.DeviceName.Equals(ANomeDevice) then
Result := lDevice;
end;
O método ListarDispositivosPareadosNoComboBox inicia-se limpando os itens do combobox para evitar duplicidade dos dados. Em seguida nós forçamos um loop na lista de dispositivos pareados usando o componente Bluetooth e chamando o método PairedDevices. Esse loop vai adicionando dispositivo por dispositivo no ComboBox.
O método ObterDevicePeloNome faz algo semelhante, a diferença é que ele compara o nome do dispositivo recebido no parâmetro do método e devolve uma instância de TBluetoothDevice para que possamos enviar os comandos de impressão.
Por fim temos o método ConectarImpressora, que recebe o nome da impressora no parâmetro, chama o método ObterDevicePeloNome e então se conecta a impressora usando o método Connect do nosso Socket *Não mencionado ainda.
A variável FSocket declarada no início dessa seção do artigo receberá o endereço da impressora que vamos usar para impressão.
FSocket := lDevice.CreateClientSocket(StringToGUID(UUID), False);
O Result dessa função devolve sucesso se conseguirmos conectar a impressora.
Pra fechar o exemplo base antes de vermos a impressão, codifique o evento OnShow chamado o método para Listar os dispositivos pareados no combobox. E no evento OnChange do ComboBox chame:
if (cbxDevices.Selected <> nil) and (cbxDevices.Selected.Text <> EmptyStr) then
begin
if ConectarImpressora(cbxDevices.Selected.Text)
then lsboxImpressora.ItemData.Accessory := TListBoxItemData.TAccessory.aCheckmark
else lsboxImpressora.ItemData.Accessory := TListBoxItemData.TAccessory.aNone;
end;
Esse evento incluirá um Check no item de ListBox indicando que selecionamos a impressora com sucesso.
Enviando a Impressão
Se tudo correu bem até aqui na montagem de nosso exemplo, então agora poderemos enviar os comandos de impressão. Eles serão enviados usando o padrão ESC/POS conhecido por muitos desenvolvedores, principalmente por quem já trabalhou com impressão matricial.
Atenção: É muito importante a leitura do manual da impressora, pois muitos comandos variam de impressora para impressora.
Perfeito, insira o código a seguir no botão de Impressão.
procedure TfrmPrincipal.btnImprimirClick(Sender: TObject);
begin
//ESC/POS
if (FSocket <> nil) and (FSocket.Connected) then
begin
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(27) + chr(64)));
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(27) + chr(97) + chr(1)));
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(27) + chr(33) + chr(8)));
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(27) + chr(33) + chr(16)));
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(27) + chr(33) + chr(32)));
FSocket.SendData(TEncoding.UTF8.GetBytes('TDevRocks Software' + chr(13)));
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(27) + chr(100) + chr(1)));
FSocket.SendData(TEncoding.UTF8.GetBytes('Datecs DPP 250' + chr(13)));
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(27) + chr(100) + chr(1)));
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(27) + chr(33) + chr(0)));
FSocket.SendData(TEncoding.UTF8.GetBytes('Imprimindo direto para Bluetooth '));
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(27) + chr(100) + chr(1)));
FSocket.SendData(TEncoding.UTF8.GetBytes('Imprimindo direto para Bluetooth '));
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(27) + chr(100) + chr(1)));
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(27) + chr(97) + chr(0)));
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(27) + chr(100) + chr(5)));
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(29) + chr(107) + chr(2) + '8983847583721' + chr(0)));
FSocket.SendData(TEncoding.UTF8.GetBytes(chr(27) + chr(100) + chr(5)));
end;
end;
Você irá notar que usamos a variável FSocket para envio dos comandos. Não entrarei em detalhes sobre cada comando pelo menos motivo da nota logo acima, cada impressora possui seus padrões.
Nesse método você encontrará comandos para pular de linha, colocar em negrito, itálico, impressão de código de barras, e etc. Por isso a importância de conhecer o manual da sua impressora.
Certificação Especialista Mobile
Sabia que temos um conteúdo EXCLUSIVO que pode ser acessado de modo vitalício e contém essa e outras dicas importantíssimas sobre mobile?
Legal não? Inclusive você pode obter suporte da nossa equipe e de mim através da nossa plataforma EAD.
O curso Certificação Especialista Mobile é um verdadeiro Guia de Sobrevivência do desenvolvedor mobile. São mais de 50 aulas exclusivas tratando dos temas mais cabeludos em mobile.
- Acesso Vitalício
- Suporte
- Aulas gravadas
- 100% concluído
- Código-Fonte atualizado e revisado
Certificação Especialista Mobile
12x de R$ 59,70
ou
R$ 597,00 à vista
(Grade Completa do Curso)