将数据(打印)发送到蓝牙 (BLE) 打印机
Send data (to print) to a bluetooth (BLE) printer
我要将我的 Android 应用程序连接到 BLE 打印机 (Zebra ZD420),然后打印条形码标签。
首先,我使用以下代码来检索我可以使用的服务和特征。
procedure TForm5.BluetoothLE1ServicesDiscovered(const Sender: TObject;
const AServiceList: TBluetoothGattServiceList);
var
I, C: Integer;
begin
if AServiceList.Count > 0 then
begin
for I := 0 to AServiceList.Count - 1 do
begin
memo1.lines.Add((I + 1).ToString+' - '+AServiceList[I].UUIDName+' - '+AServiceList[I].UUID.ToString);
for C := 0 to AServiceList[I].Characteristics.Count - 1 do
memo1.lines.Add(' - '+AServiceList[I].Characteristics[C].UUIDName+' - '+AServiceList[I].Characteristics[C].UUID.ToString);
end;
end
else
memo1.lines.Add('- Not allow access or no services');
Listbox1.Enabled := True;
end;
那么我从打印机得到的结果如下
- Discovering services -->
1 - GAP - {00001800-0000-1000-8000-00805F9B34FB}
- Device Name - {00002A00-0000-1000-8000-00805F9B34FB}
- Appearance - {00002A01-0000-1000-8000-00805F9B34FB}
- Peripheral Privacy Flag - {00002A02-0000-1000-8000-00805F9B34FB}
- Reconnection Address - {00002A03-0000-1000-8000-00805F9B34FB}
- Peripheral Preferred Connection Parameters - {00002A04-0000-1000-8000-00805F9B34FB}
2 - GATT - {00001801-0000-1000-8000-00805F9B34FB}
- Service Changed - {00002A05-0000-1000-8000-00805F9B34FB}
3 - DEVICE INFORMATION - {0000180A-0000-1000-8000-00805F9B34FB}
- Model Number String - {00002A24-0000-1000-8000-00805F9B34FB}
- Serial Number String - {00002A25-0000-1000-8000-00805F9B34FB}
- Firmware Revision String - {00002A26-0000-1000-8000-00805F9B34FB}
- Hardware Revision String - {00002A27-0000-1000-8000-00805F9B34FB}
- Software Revision String - {00002A28-0000-1000-8000-00805F9B34FB}
- Manufacturer Name String - {00002A29-0000-1000-8000-00805F9B34FB}
- PnP ID - {00002A50-0000-1000-8000-00805F9B34FB}
4 - - {38EB4A80-C570-11E3-9507-0002A5D5C51B}
- - {38EB4A81-C570-11E3-9507-0002A5D5C51B}
- - {38EB4A82-C570-11E3-9507-0002A5D5C51B}
- - {38EB4A83-C570-11E3-9507-0002A5D5C51B}
- - {38EB4A84-C570-11E3-9507-0002A5D5C51B}
从这里开始:Zebra sample on GitHub
我试过这段代码:
const ZPRINTER_DIS_SERVICE_UUID = '{0000180A-0000-1000-8000-00805F9B34FB}'; // Or '180A'. Device Information Services UUID
const ZPRINTER_SERVICE_UUID='{38EB4A80-C570-11E3-9507-0002A5D5C51B}';
const READ_FROM_ZPRINTER_CHARACTERISTIC_UUID = '{38EB4A81-C570-11E3-9507-0002A5D5C51B}';
const WRITE_TO_ZPRINTER_CHARACTERISTIC_UUID = '{38EB4A82-C570-11E3-9507-0002A5D5C51B}';
const ZPL_TEST_LABEL = '~hi^XA^FO20,20^BY3^B3N,N,150,Y,N^FDHello WeChat!^FS^XZ\r\n';
首先我必须发现设备
BluetoothLE1.DiscoverDevices(1000);
DiscoverLEDevice 事件在 tListBox 中显示设备列表
procedure TForm6.BluetoothLE1DiscoverLEDevice(const Sender: TObject;
const ADevice: TBluetoothLEDevice; Rssi: Integer;
const ScanResponse: TScanResponse);
var
Name: string;
I: Integer;
DCount: Integer;
NumberOfDevices: Integer;
begin
DCount := BluetoothLE1.DiscoveredDevices.Count;
NumberOfDevices := Listbox1.Count;
for I := 0 to DCount - 1 do
begin
Name := BluetoothLE1.DiscoveredDevices[I].DeviceName;
if Name = '' then
Name := 'Unknown device';
Name := ' - '+ Name + ' - ' + BluetoothLE1.DiscoveredDevices[I].Identifier;
if NumberOfDevices = I then
Listbox1.Items.Add((NumberOfDevices + 1).ToString+Name)
else
Listbox1.Items[I] := (I + 1).ToString+Name;
end;
end;
然后尝试使用此过程发送数据
procedure TForm6.Button4Click(Sender: TObject);
var
Service:TBluetoothGattService;
Charateristic:TBluetoothGattCharacteristic;
guidServ:tguid;
guidChar:tguid;
begin
memo1.lines.Clear;
memo1.lines.add('Printing');
guidServ:=tguid.Create(ZPRINTER_SERVICE_UUID);
guidChar:=tguid.Create(WRITE_TO_ZPRINTER_CHARACTERISTIC_UUID);
memo1.lines.add(guidServ.ToString);
memo1.lines.add(guidChar.ToString);
Service:=BluetoothLE1.DiscoveredDevices[ListBox1.ItemIndex].GetService(guidServ);
Charateristic:=Service.GetCharacteristic(guidChar);
Charateristic.SetValueAsString(UTF8Encode(ZPL_TEST_LABEL));
// Charateristic.SetValueAsString(ZPL_TEST_LABEL,false);
memo1.lines.add('Data sent');
end;
没有出现错误,但不会打印任何标签!
下面的代码终于可以运行了!
procedure TForm6.Button4Click(Sender: TObject);
var
Service:TBluetoothGattService;
Charateristic:TBluetoothGattCharacteristic;
Device:TBluetoothLEDevice;
guidServ:tguid;
guidChar:tguid;
begin
memo1.lines.Clear;
memo1.lines.add('Printing');
guidServ:=tguid.Create(ZPRINTER_SERVICE_UUID);
guidChar:=tguid.Create(WRITE_TO_ZPRINTER_CHARACTERISTIC_UUID);
memo1.lines.add(guidServ.ToString);
memo1.lines.add(guidChar.ToString);
Device:=BluetoothLE1.DiscoveredDevices.Items[ListBox1.ItemIndex];
Service:=Device.GetService(guidServ);
Charateristic:=Service.GetCharacteristic(guidChar);
Charateristic.SetValueAsString(UTF8Encode(ZPL_TEST_LABEL));
BluetoothLE1.WriteCharacteristic(Device,Charateristic);
memo1.lines.add('Data sent');
end;
我要将我的 Android 应用程序连接到 BLE 打印机 (Zebra ZD420),然后打印条形码标签。 首先,我使用以下代码来检索我可以使用的服务和特征。
procedure TForm5.BluetoothLE1ServicesDiscovered(const Sender: TObject;
const AServiceList: TBluetoothGattServiceList);
var
I, C: Integer;
begin
if AServiceList.Count > 0 then
begin
for I := 0 to AServiceList.Count - 1 do
begin
memo1.lines.Add((I + 1).ToString+' - '+AServiceList[I].UUIDName+' - '+AServiceList[I].UUID.ToString);
for C := 0 to AServiceList[I].Characteristics.Count - 1 do
memo1.lines.Add(' - '+AServiceList[I].Characteristics[C].UUIDName+' - '+AServiceList[I].Characteristics[C].UUID.ToString);
end;
end
else
memo1.lines.Add('- Not allow access or no services');
Listbox1.Enabled := True;
end;
那么我从打印机得到的结果如下
- Discovering services -->
1 - GAP - {00001800-0000-1000-8000-00805F9B34FB}
- Device Name - {00002A00-0000-1000-8000-00805F9B34FB}
- Appearance - {00002A01-0000-1000-8000-00805F9B34FB}
- Peripheral Privacy Flag - {00002A02-0000-1000-8000-00805F9B34FB}
- Reconnection Address - {00002A03-0000-1000-8000-00805F9B34FB}
- Peripheral Preferred Connection Parameters - {00002A04-0000-1000-8000-00805F9B34FB}
2 - GATT - {00001801-0000-1000-8000-00805F9B34FB}
- Service Changed - {00002A05-0000-1000-8000-00805F9B34FB}
3 - DEVICE INFORMATION - {0000180A-0000-1000-8000-00805F9B34FB}
- Model Number String - {00002A24-0000-1000-8000-00805F9B34FB}
- Serial Number String - {00002A25-0000-1000-8000-00805F9B34FB}
- Firmware Revision String - {00002A26-0000-1000-8000-00805F9B34FB}
- Hardware Revision String - {00002A27-0000-1000-8000-00805F9B34FB}
- Software Revision String - {00002A28-0000-1000-8000-00805F9B34FB}
- Manufacturer Name String - {00002A29-0000-1000-8000-00805F9B34FB}
- PnP ID - {00002A50-0000-1000-8000-00805F9B34FB}
4 - - {38EB4A80-C570-11E3-9507-0002A5D5C51B}
- - {38EB4A81-C570-11E3-9507-0002A5D5C51B}
- - {38EB4A82-C570-11E3-9507-0002A5D5C51B}
- - {38EB4A83-C570-11E3-9507-0002A5D5C51B}
- - {38EB4A84-C570-11E3-9507-0002A5D5C51B}
从这里开始:Zebra sample on GitHub
我试过这段代码:
const ZPRINTER_DIS_SERVICE_UUID = '{0000180A-0000-1000-8000-00805F9B34FB}'; // Or '180A'. Device Information Services UUID
const ZPRINTER_SERVICE_UUID='{38EB4A80-C570-11E3-9507-0002A5D5C51B}';
const READ_FROM_ZPRINTER_CHARACTERISTIC_UUID = '{38EB4A81-C570-11E3-9507-0002A5D5C51B}';
const WRITE_TO_ZPRINTER_CHARACTERISTIC_UUID = '{38EB4A82-C570-11E3-9507-0002A5D5C51B}';
const ZPL_TEST_LABEL = '~hi^XA^FO20,20^BY3^B3N,N,150,Y,N^FDHello WeChat!^FS^XZ\r\n';
首先我必须发现设备
BluetoothLE1.DiscoverDevices(1000);
DiscoverLEDevice 事件在 tListBox 中显示设备列表
procedure TForm6.BluetoothLE1DiscoverLEDevice(const Sender: TObject;
const ADevice: TBluetoothLEDevice; Rssi: Integer;
const ScanResponse: TScanResponse);
var
Name: string;
I: Integer;
DCount: Integer;
NumberOfDevices: Integer;
begin
DCount := BluetoothLE1.DiscoveredDevices.Count;
NumberOfDevices := Listbox1.Count;
for I := 0 to DCount - 1 do
begin
Name := BluetoothLE1.DiscoveredDevices[I].DeviceName;
if Name = '' then
Name := 'Unknown device';
Name := ' - '+ Name + ' - ' + BluetoothLE1.DiscoveredDevices[I].Identifier;
if NumberOfDevices = I then
Listbox1.Items.Add((NumberOfDevices + 1).ToString+Name)
else
Listbox1.Items[I] := (I + 1).ToString+Name;
end;
end;
然后尝试使用此过程发送数据
procedure TForm6.Button4Click(Sender: TObject);
var
Service:TBluetoothGattService;
Charateristic:TBluetoothGattCharacteristic;
guidServ:tguid;
guidChar:tguid;
begin
memo1.lines.Clear;
memo1.lines.add('Printing');
guidServ:=tguid.Create(ZPRINTER_SERVICE_UUID);
guidChar:=tguid.Create(WRITE_TO_ZPRINTER_CHARACTERISTIC_UUID);
memo1.lines.add(guidServ.ToString);
memo1.lines.add(guidChar.ToString);
Service:=BluetoothLE1.DiscoveredDevices[ListBox1.ItemIndex].GetService(guidServ);
Charateristic:=Service.GetCharacteristic(guidChar);
Charateristic.SetValueAsString(UTF8Encode(ZPL_TEST_LABEL));
// Charateristic.SetValueAsString(ZPL_TEST_LABEL,false);
memo1.lines.add('Data sent');
end;
没有出现错误,但不会打印任何标签!
下面的代码终于可以运行了!
procedure TForm6.Button4Click(Sender: TObject);
var
Service:TBluetoothGattService;
Charateristic:TBluetoothGattCharacteristic;
Device:TBluetoothLEDevice;
guidServ:tguid;
guidChar:tguid;
begin
memo1.lines.Clear;
memo1.lines.add('Printing');
guidServ:=tguid.Create(ZPRINTER_SERVICE_UUID);
guidChar:=tguid.Create(WRITE_TO_ZPRINTER_CHARACTERISTIC_UUID);
memo1.lines.add(guidServ.ToString);
memo1.lines.add(guidChar.ToString);
Device:=BluetoothLE1.DiscoveredDevices.Items[ListBox1.ItemIndex];
Service:=Device.GetService(guidServ);
Charateristic:=Service.GetCharacteristic(guidChar);
Charateristic.SetValueAsString(UTF8Encode(ZPL_TEST_LABEL));
BluetoothLE1.WriteCharacteristic(Device,Charateristic);
memo1.lines.add('Data sent');
end;