这是我使用谷歌翻译器翻译的葡萄牙语-巴西语文章,所以如果有任何语言错误,我很抱歉。 ------------------------------ 以实用且简单的方式在蓝牙迷你打印机上打印。 by Adriando Santos 另外添加一个TBluetooth类型的组件,重命名为BT。 Delphi中有02个蓝牙组件。 注意不要插入错误的组件。 编码的第一部分是输入用于将我们的应用程序连接到打印机的 UUID。 它对所有打印机始终相同。 //UUID para impressoras Bluetooth const UUID = '{00001101-0000-1000-8000-00805F9B34FB}'; 如上所示创建常量并始终使用相同的 UUID。 现在让我们声明一些方法和变量,它们将在整个过程中帮助我们。 找到 Private 部分并添加如下方法,然后按 Ctrl + Shift + C。 FSocket : TBluetoothSocket; procedure ListarDispositivosPareadosNoCombo; function ObterDevicePeloNome(ANomeDevice: string) : TBluetoothDevice; function ConectarImpressora(ANomeDevice: string): Boolean; 请注意,我们有一个 TBluetoothSocket 类型的变量和 03 方法。 方法名称已经是不言自明的了。 无论如何让我们明白: ListarDesistemasPareadosNoCombo 方法将执行与智能手机/平板电脑配对的设备的“发现”过程,并将它们添加到 ComboBox。 注意:该方法“不知道”谁是打印机或其他设备,也就是说,如果您有蓝牙耳机与该设备或任何其他设备配对,它将出现在组合中。 GetDeviceByName 方法负责通过搜索名称返回正确的设备。 最后,ConectarImpressora 方法将自己连接到我们要打印文本的设备。 03完整的方法如下。 这是一个简短的解释: 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; ListarDesistemasPareadosNoComboBox 方法首先清除组合框中的项目以避免数据重复。 接下来,我们使用蓝牙组件并调用 PairedDevices 方法强制循环遍历配对设备列表。 此循环逐个将设备添加到 ComboBox。 GetDeviceByName 方法做了类似的事情,不同之处在于它比较方法参数中收到的设备名称并返回 TBluetoothDevice 的实例,以便我们可以发送打印命令。 最后我们有 ConectarImpressora 方法,它在参数中接收打印机的名称,调用 GetDeviceByName 方法,然后使用我们的 Socket *未提及的 Connect 方法连接打印机。 在本文这一部分开头声明的 FSocket 变量将接收我们要用于打印的打印机的地址。 FSocket := lDevice.CreateClientSocket(StringToGUID(UUID), False); 如果我们能够连接打印机,此函数的结果将返回成功。 要在我们看到打印之前关闭基本示例,请编写调用方法的 OnShow 事件以列出组合框中配对的设备。 在 ComboBox 调用的 OnChange 事件中: 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; 此事件将在 ListBox 项中包含一个 Check,表明我们已成功选择打印机。 发送打印 如果我们示例的汇编到目前为止一切顺利,那么现在我们可以发送打印命令。 它们将使用许多开发人员都知道的 ESC/POS 标准发送,尤其是那些使用点阵打印的开发人员。 注意:阅读打印机手册非常重要,因为许多命令因打印机而异。 完美,将以下代码插入打印按钮。 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; 您会注意到我们使用 FSocket 变量来发送命令。 至少出于上面注释的原因,我不会详细介绍每个命令,每个打印机都有其默认值。 在这种方法中,您会找到用于跳过行、输入粗体、斜体、条形码打印等的命令。 这就是了解打印机手册很重要的原因。