Bluetooth Windows Socket - Can not connect to device: (10049)

0

I am having socket error problems with code 10049 when I try to connect a bluetooth SSP device, serial port service, in Delphi Tokyo 10.2 in the Windows environment using a TBluetoothSocket class. The error occurs at connection time (TBluetoothSocket.Connect), error occurs at line 152 of the main unit below, follows:

unit Main;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, System.Bluetooth,
  System.Bluetooth.Components, FMX.Layouts, FMX.ListBox, FMX.Edit,
  FMX.ScrollBox, FMX.Memo, FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base,
  FMX.ListView;

type
  TFormMain = class(TForm)
    ButtonDiscoverDevices: TButton;
    Bluetooth: TBluetooth;
    ListBoxDevices: TListBox;
    ListBoxServices: TListBox;
    ButtonOpenClose: TButton;
    Edit: TEdit;
    Panel: TPanel;
    ButtonSend: TButton;
    Timer: TTimer;
    ListView1: TListView;
    AniIndicator1: TAniIndicator;
    procedure ButtonDiscoverDevicesClick(Sender: TObject);
    procedure BluetoothDiscoveryEnd(const Sender: TObject;
      const ADeviceList: TBluetoothDeviceList);
    procedure ButtonOpenCloseClick(Sender: TObject);
    procedure ButtonSendClick(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure ListBoxDevicesChange(Sender: TObject);
  private
    { Private declarations }
    DeviceList: TBluetoothDeviceList;
    Device: TBluetoothDevice;
    SerialPort: TBluetoothService;
    Socket: TBluetoothSocket;
    Connected: Boolean;
    procedure ShowWaitIndicator;
    procedure HideWaitIndicator;
  public
    { Public declarations }
  end;

var
  FormMain: TFormMain;

implementation

{$R *.fmx}

procedure TFormMain.ShowWaitIndicator;
begin
  AniIndicator1.Enabled := True;
  AniIndicator1.Visible := True;
end;

procedure TFormMain.HideWaitIndicator;
begin
  AniIndicator1.Visible := False;
  AniIndicator1.Enabled := False;
end;

procedure TFormMain.ButtonDiscoverDevicesClick(Sender: TObject);
begin
  SerialPort.Name := '';
  Device := nil;
  DeviceList := nil;
  ButtonOpenClose.Enabled := False;
  ListBoxDevices.Clear;
  ListBoxServices.Clear;

  Bluetooth.DiscoverDevices(45000); // 45s
  ShowWaitIndicator;
end;

procedure TFormMain.BluetoothDiscoveryEnd(const Sender: TObject; const ADeviceList: TBluetoothDeviceList);
var I: Integer;
begin
  HideWaitIndicator;
  ListBoxDevices.Clear;
  for I := 0 to ADeviceList.Count - 1 do
    ListBoxDevices.Items.Add(ADeviceList.Items[I].DeviceName);
  DeviceList := ADeviceList;
end;

procedure TFormMain.ListBoxDevicesChange(Sender: TObject);
var
  DeviceIndex: Integer;
  LastServices: TBluetoothServiceList;
  I: Integer;
begin
  SerialPort.Name := '';
  ListBoxServices.Clear;
  ButtonOpenClose.Enabled := False;
  DeviceIndex := ListBoxDevices.ItemIndex;
  if DeviceIndex = -1 then
    Exit;

  /// Recuperar o dispositivo selecionado
  Device := nil;
  if DeviceList <> nil then
    if (DeviceIndex >= 0) and (DeviceIndex < DeviceList.Count) then
      Device := DeviceList.Items[DeviceIndex];
  if Device = nil then
    Exit;

  ShowWaitIndicator;
  Application.ProcessMessages;
  try
    /// Parear dispositivo
    if not Device.IsPaired then
      if not Bluetooth.Pair(Device) or not Device.IsPaired then
      begin
        ListBoxDevices.ItemIndex := -1;
        raise Exception.Create('Device ''' + Device.DeviceName + ''' is not paired');
      end;

    /// Pesquisar pelo serviço de serial port
    LastServices := Device.LastServiceList;
    ListBoxServices.Clear;
    for I := 0 to LastServices.Count - 1 do
    begin
      ListBoxServices.Items.Add(LastServices[I].Name);
      if LastServices[I].Name = 'SerialPort' then
        SerialPort := LastServices[I];
    end;
    if SerialPort.Name = '' then
      raise Exception.Create('SerialPort service not found');

    ButtonOpenClose.Enabled := True;
  finally
    HideWaitIndicator;
  end;
end;

procedure TFormMain.ButtonOpenCloseClick(Sender: TObject);
begin
  if Connected then
  begin
    Connected := False;
    try
      Socket.Close;
    except
    end;
    Socket := nil;
  end
  else
  begin
    Socket := Device.CreateClientSocket(SerialPort.UUID, True);
    Socket.Connect;
    Connected := Socket.Connected;
  end;

  if Connected then
  begin
    ButtonOpenClose.Text := 'Close';
    ButtonDiscoverDevices.Enabled := False;
    ListBoxDevices.Enabled := False;
    Edit.Enabled := True;
    ButtonSend.Enabled := True;
    Timer.Enabled := True;
  end
  else
  begin
    ButtonOpenClose.Text := 'Open';
    ButtonDiscoverDevices.Enabled := True;
    ListBoxDevices.Enabled := True;
    Edit.Enabled := False;
    ButtonSend.Enabled := False;
    Timer.Enabled := False;
  end;
end;

procedure TFormMain.ButtonSendClick(Sender: TObject);
begin
  Socket.SendData(TEncoding.ANSI.GetBytes(Edit.Text));
end;

procedure TFormMain.TimerTimer(Sender: TObject);
var
  Data: TBytes;
  ItemList: TListViewItem;
begin
  Data := Socket.ReceiveData(0);
  if Data <> nil then
  begin
    ItemList := ListView1.Items.Add;
    ItemList.Text := TEncoding.ANSI.GetString(Data);
  end;
end;

end.
    
asked by anonymous 17.07.2018 / 19:09

0 answers