www - Conéctate a través de Bluetooth con Delphi XE7 usando una impresora portátil
zebra qln420 manual (2)
En tu bucle, sigues asignando a lDevice
. Si hay un segundo dispositivo no emparejado, entonces el lDevice
lo señala. Necesita Exit
superior una vez que haya detectado que está emparejado.
Además, personalmente no me gusta plantear excepciones deliberadamente. Si una instancia de clase es nula, entonces debería salir, nolt profundiza en ella ...
Por ejemplo
if FBluetoothManager = nil then
begin
Memo1.Lines.Add(''FBluetoothManager esta nulo'');
Exit;
end;
Estoy tratando de comunicarme con una impresora Sewoo LK-P32 a través de Bluetooth. Para esto estoy usando Delphi XE7 . Hice algunos ejemplos que vienen con Delphi y no estoy teniendo éxito. Puse la impresora emparejada en la tableta y aún así no puedo imprimir continuamente.
Cuando imprimo algo, tengo que reiniciar la aplicación, para poder imprimir algo nuevamente. Debajo de mis fuentes
¿Alguien podría ayudarme? ¿Apoyo en este tema? Me queda poco tiempo para probar otras tecnologías.
Método que inicia la comunicación con la impresora.
procedure TForm2.ButtonClickStart(Sender: TObject);
var
Msg, Texto: string;
I, B: Integer;
BluetoothAdapter: TBluetoothAdapter;
ListaDeAparelhosPareados: TBluetoothDeviceList;
LServices: TBluetoothServiceList;
begin
try
Memo1.Lines.Add(''Ponto 1'');
FBluetoothManager := TBluetoothManager.Current;
if FBluetoothManager = nil then
Memo1.Lines.Add(''FBluetoothManager esta nulo'');
Memo1.Lines.Add(''Ponto 2'');
BluetoothAdapter := FBluetoothManager.CurrentAdapter;
if BluetoothAdapter = nil then
Memo1.Lines.Add(''BluetoothAdapter esta nulo'');
ListaDeAparelhosPareados := BluetoothAdapter.PairedDevices;
Memo1.Lines.Add(''Ponto 3'');
if ListaDeAparelhosPareados = nil then
Memo1.Lines.Add(''ListaDeAparelhosPareados esta nulo'');
for I := 0 to ListaDeAparelhosPareados.Count - 1 do
begin
LDevice := ListaDeAparelhosPareados[I] as TBluetoothDevice;
if LDevice.IsPaired then
begin
LServices := LDevice.GetServices;
for B := 0 to LServices.Count - 1 do
begin
ServiceGUI := GUIDToString(LServices[B].UUID);
Guid := LServices[B].UUID;
ServiceName := LServices[B].Name;
Memo1.Lines.Add(LServices[B].Name + '' --> '' + ServiceGUI);
Memo1.GoToTextEnd;
end;
end;
end;
except
on E: Exception do
begin
Msg := E.Message;
Memo1.Lines.Add(''Erro ao Conectar na Impressora: '' + Msg);
Memo1.GoToTextEnd;
end;
end;
end;
Método que envía el texto a la impresora.
procedure TForm2.ButtonClickSendText(Sender: TObject);
var
FSocket: TBluetoothSocket;
ToSend: TBytes;
Msg, Texto: String;
begin
try
Memo1.Lines.Add(''Aparelho pareado:'' + BoolToStr(LDevice.IsPaired));
Memo1.Lines.Add(''Dados do Guid:'' + GUIDToString(Guid));
FSocket := LDevice.CreateClientSocket(Guid, true);
if FSocket = nil then
Memo1.Lines.Add(''FSocket nulo'');
Memo1.Lines.Add(''Criou Bluetooth Cliente.'');
Memo1.GoToTextEnd;
if FSocket <> nil then
begin
// FSocket.Connect;
FSocket.Connect;
Memo1.Lines.Add(''Criou socket cliente com o ServerSocket'');
Texto := #27 + ''|cA'' + ''Teste'' + #13#10;
ToSend := TEncoding.UTF8.GetBytes(Texto);
FSocket.SendData(ToSend);
Memo1.Lines.Add(''Enviou '' + Texto + '' para a impressora.'');
end
else
begin
Memo1.Lines.Add(''FSocket nulo.'');
end;
except
on E: Exception do
begin
Msg := E.Message;
Memo1.Lines.Add(''Erro ao Conectar na Impressora: '' + Msg);
Memo1.GoToTextEnd;
end;
end;
end;
Volví a crear su programa y obtengo el mismo problema, pero cambiar su código, ahora funciona bien para mí.
El problema esta aqui
if FSocket <> nil then
begin
// FSocket.Connect;
FSocket.Connect;
Memo1.Lines.Add(''Criou socket cliente com o ServerSocket'');
Texto := #27 + ''|cA'' + ''Teste'' + #13#10;
ToSend := TEncoding.UTF8.GetBytes(Texto);
FSocket.SendData(ToSend);
Memo1.Lines.Add(''Enviou '' + Texto + '' para a impressora.'');
end
Primero, recomiendo agregar Fsocket como propiedad privada y crear SOLO UN objeto fsocket. Por lo tanto, su código cambiará a
if (Assigned(LDevice)) And (Assigned(FSocket))
then Begin
if Not FSocket.Connected
then FSocket.Connect
End
Else Begin
FSocket := LDevice.CreateClientSocket(Guid, True);
Memo1.Lines.Add(''Device Socked created to ''+LDevice.DeviceName);
FSocket.Connect;
End;
Después de conectarse, puede llamar a un TTimer para enviar lo que desea, o crear un método para verificar si Fsocket está conectado.
if Assigned(FSocket)
then Begin
if FSocket.Connected
then Begin
Texto := #27 + ''|cA'' + ''Teste'' + #13#10;
ToSend := TEncoding.UTF8.GetBytes(Texto);
FSocket.SendData(ToSend);
Sleep(100);
End;
End;
Además, puede agregar una suspensión entre 2 comandos, para asegurarse de que la impresora reciba y ejecute los datos.
En mi caso utilicé un módulo Bluetooth hc-06 de ancho Arduino.