Connexion via Bluetooth avec Delphi XE7 à l'aide d'une imprimante portable

j'essaie de communiquer avec un Sewoo LK-P32 imprimante via Bluetooth. Pour cela, je suis en utilisant Delphi XE7. J'ai fait quelques exemples qui viennent avec Delphi et n'ont pas de succès. J'ai mis l'imprimante jumelée dans la tablette et même alors je ne suis pas en mesure d'imprimer en continu.

quand j'imprime quelque chose doit redémarrer l'application, pour que je puisse imprimer quelque chose à nouveau. Ci-dessous mes sources.

quelqu'un Pourrait-il m'aider? Appuyer sur cette question? Mon temps est court pour essayer d'autres technologies.

méthode qui initie la communication avec l'imprimante

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éthode qui envoie le texte à l'imprimante

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; 
16
demandé sur toesslab.ch 2015-04-29 17:36:39

2 réponses

dans votre boucle, vous continuez à assigner lDevice. Si il y a une deuxième dissociée de l'appareil, puis lDevice pointe vers que. Vous avez besoin de haut Exit une fois que vous avez détecté qu'il est couplé.

de plus, personnellement, je n'aime pas soulever des exceptions délibérément. Si une instance de classe est nulle, alors vous devriez sortir, et y percer..

Par exemple

if FBluetoothManager = nil then
begin
  Memo1.Lines.Add('FBluetoothManager esta nulo');
  Exit;
end;
0
répondu Rohit Gupta 2015-05-17 05:42:24

j'ai recréé votre programme, et j'ai le même problème, mais le changement de votre code, ça fonctionne pour moi maintenant.

Le problème est ici

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

tout d'abord, je recommande D'ajouter Fsocket comme propriété privée, et de ne créer qu'un seul objet fsocket. Ainsi, votre code sera changé en

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;

après la connexion, vous pouvez appeler un TTimer pour envoyer ce que vous voulez, o créer une vérification de méthode si Fsocket est connecté.

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;

vous pouvez aussi ajouter un sommeil entre 2 commandes, pour être sûr que les données sont reçues et exécutées par votre imprimante.

dans mon cas, j'ai utilisé un module Arduino width Bluetooth HC-06.

0
répondu Lionel Siero 2015-05-25 05:03:46