Delphi XE7已经内建了蓝牙功能,提供了System.Bluetooth.pas单元
顾名思义,System表示XE7的蓝牙功能可以在Windows,Android,IOS系统内使用
System.Bluetooth单元中主要包含一下几个类
TBluetoothManager
TBluetoothDeviceList
TBluetoothAdapter
TBluetoothDevice
TBluetoothService
TBluetoothServiceList
TBluetoothSocket
TBluetoothManager是蓝牙管理器,用于蓝牙设备管理,包括发现蓝牙设备,获取配对设备,处理远程配对请求等功能
TBluetoothDeviceList是蓝牙设备列表,TBluetoothDeviceList = class(TObjectList<TBluetoothDevice>),可以通过TBluetoothManager.GetPairedDevices获得配对设备列表
TBluetoothAdapter本机蓝牙设备,实现配对、取消配对等功能,可通过TBluetoothManager.CurrentAdapter得到当前蓝牙设备
TBluetoothDevice远端蓝牙设备,每个远端设备可以提供若干个服务(TBluetoothService),
TBluetoothService远端蓝牙设备服务,包括服务名和UUID
TBluetoothService = record Name: string; UUID: TBluetoothUUID; end;
TBluetoothServiceList服务列表 = class(TList<TBluetoothService>);可通过TBluetoothDevice.GetServices获得远端设备服务列表
TBluetoothSocket蓝牙通讯套接字,通过 TBluetoothDevice.CreateClientSocket(StringToGUID(ServiceGUI),True/False)创建,下面是一个XE7自带的例子
unit Unit1; interface uses System.SysUtils,System.Types,System.UITypes,System.Classes,System.Variants,FMX.Types,FMX.Controls,FMX.Forms,FMX.Graphics,FMX.Dialogs,System.Bluetooth,FMX.Layouts,FMX.ListBox,FMX.StdCtrls,FMX.Memo,FMX.Controls.Presentation,FMX.Edit,FMX.TabControl; type TServerConnectionTH = class(TThread) private { Private declarations } FServerSocket: TBluetoothServerSocket; FSocket: TBluetoothSocket; FData: TBytes; protected procedure Execute; override; public Public declarations } constructor Create(ACreateSuspended: Boolean); destructor Destroy; end; TForm1 = (TForm) ButtonDiscover: TButton; ButtonPair: TButton; ButtonUnPair: TButton; ButtonPairedDevices: TButton; DisplayR: TMemo; Edit1: TEdit; Button2: TButton; FreeSocket: TButton; Labeldiscoverable: TLabel; ComboBoxDevices: TComboBox; ComboBoxPaired: TComboBox; Panel1: TPanel; TabControl1: TTabControl; TabItem1: TTabItem; TabItem2: TTabItem; LabelNameSarver: TLabel; ButtonServices: TButton; ComboBoxServices: TComboBox; PanelClient: TPanel; LabelClient: TLabel; ButtonConnectToRFCOMM: TButton; PanelServer: TPanel; ButtonCloseReadingSocket: TButton; ButtonOpenReadingSocket: TButton; LabelServer: TLabel; procedure ButtonDiscoverClick(Sender: TObject); ButtonPairClick(Sender: TObject); ButtonUnPairClick(Sender: TObject); ButtonPairedDeviceClick(Sender: TObject); FormShow(Sender: TObject); ButtonOpenReadingSocketClick(Sender: TObject); ButtonConnectToRFCOMMClick(Sender: TObject); ButtonCloseReadingSocketClick(Sender: TObject); Button2Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); FreeSocketClick(Sender: TObject); function ManagerConnected:Boolean; function GetServiceName(GUID: string): ; ComboBoxPairedChange(Sender: TObject); ButtonServicesClick(Sender: TObject); FBluetoothManager: TBluetoothManager; FDiscoverDevices: TBluetoothDeviceList; FPairedDevices: TBluetoothDeviceList; FAdapter: TBluetoothAdapter; FData: TBytes; FSocket: TBluetoothSocket; ItemIndex: Integer; ServerConnectionTH: TServerConnectionTH; procedure DevicesDiscoveryEnd(const Sender: TObject; const ADevices: TBluetoothDeviceList); PairedDevices; SendData; } ; Const ServiceName = 'Basic Text Server'; ServiceGUI = {B62C4E8D-62CC-404B-BBBF-BF3E3BBB1378}; Form1: TForm1; implementation $R *.fmx} $R *.NmXhdpiPh.fmx ANDROID$R *.LgXhdpiPh.fmx ANDROID$R *.SmXhdpiPh.fmx ANDROID$R *.Macintosh.fmx MACOS$R *.iPhone4in.fmx IOS$R *.Windows.fmx MSWINDOWS} TForm1.ButtonPairClick(Sender: TObject); begin if ManagerConnected then if ComboboxDevices.ItemIndex > -1 then FAdapter.Pair(FDiscoverDevices[ComboboxDevices.ItemIndex]) else ShowMessage(No device selected); ; TForm1.ButtonUnPairClick(Sender: TObject); if ComboboxPaired.ItemIndex > - FAdapter.UnPair(FPairedDevices[ComboboxPaired.ItemIndex]) No Paired device selected TForm1.ComboBoxPairedChange(Sender: TObject); begin LabelNameSarver.Text := ComboBoxPaired.Items[ComboBoxPaired.ItemIndex]; TForm1.PairedDevices; I: Integer; ComboboxPaired.Clear; then FPairedDevices := FBluetoothManager.GetPairedDevices; if FPairedDevices.Count > 0 for I:= to FPairedDevices.Count - do ComboboxPaired.Items.Add(FPairedDevices[I].DeviceName) ComboboxPaired.Items.Add(No Paired Devices); TForm1.ButtonPairedDeviceClick(Sender: TObject); PairedDevices; ComboboxPaired.DropDown; TForm1.ButtonServicesClick(Sender: TObject); LServices: TBluetoothServiceList; LDevice: TBluetoothDevice; I: Integer; ComboBoxServices.Clear; LDevice := FPairedDevices[ComboboxPaired.ItemIndex] as TBluetoothDevice; LServices := LDevice.GetServices; for I := to LServices.Count - ComboBoxServices.Items.Add(LServices[I].Name + --> ' + GUIDToString(LServices[I].UUID)); ComboBoxServices.ItemIndex := 0; ComboBoxServices.DropDown; end No paired device selected TForm1.FreeSocketClick(Sender: TObject); FreeAndNil(FSocket); DisplayR.Lines.Add(Client socket set free); DisplayR.GoToLineEnd; TForm1.Button2Click(Sender: TObject); DisplayR.ReadOnly := False; DisplayR.SelectAll; DisplayR.DeleteSelection; DisplayR.ReadOnly := True; function TForm1.GetServiceName(GUID: LDevice := FPairedDevices[ComboboxPaired.ItemIndex] TBluetoothDevice; LServices := LDevice.GetServices; do begin if StringToGUID(GUID) = LServices[I].UUID Result := LServices[I].Name; break TForm1.ButtonConnectToRFCOMMClick(Sender: TObject); try SendData; except on E : Exception do DisplayR.Lines.Add(E.Message); DisplayR.GoToTextEnd; FreeAndNil(FSocket); TForm1.ManagerConnected:Boolean; if FBluetoothManager.ConnectionState = TBluetoothConnectionState.Connected Labeldiscoverable.Text := Device discoverable as "'+FBluetoothManager.CurrentAdapter.AdapterName+"; Result := True; end else Result := False; DisplayR.Lines.Add(No Bluetooth device Found); DisplayR.GoToTextEnd; end TForm1.SendData; ToSend: TBytes; LDevice: TBluetoothDevice; if (FSocket = nil) or (ItemIndex <> ComboboxPaired.ItemIndex) TBluetoothDevice; DisplayR.Lines.Add(GetServiceName(ServiceGUI)); DisplayR.GoToTextEnd; FSocket := LDevice.CreateClientSocket(StringToGUID(ServiceGUI),False); if FSocket <> nil then ItemIndex := ComboboxPaired.ItemIndex; FSocket.Connect; ToSend := TEncoding.UTF8.GetBytes(Edit1.Text); FSocket.SendData(ToSend); DisplayR.Lines.Add(Text Sent); DisplayR.GoToTextEnd; end ShowMessage(Out of time -15s-); ToSend := TEncoding.UTF8.GetBytes(Edit1.Text); FSocket.SendData(ToSend); DisplayR.Lines.Add( TForm1.ButtonDiscoverClick(Sender: TObject); ComboboxDevices.Clear; FAdapter := FBluetoothManager.CurrentAdapter; FBluetoothManager.StartDiscovery(10000); FBluetoothManager.OnDiscoveryEnd := DevicesDiscoveryEnd; procedure TForm1.DevicesDiscoveryEnd( ADevices: TBluetoothDeviceList); FDiscoverDevices := ADevices; to ADevices.Count - ComboboxDevices.Items.Add(ADevices[I].DeviceName + -> ADevices[I].Address); ComboboxDevices.ItemIndex := TForm1.ButtonOpenReadingSocketClick(Sender: TObject); if (ServerConnectionTH = and ManagerConnected FAdapter := FBluetoothManager.CurrentAdapter; ServerConnectionTH := TServerConnectionTH.Create(True); ServerConnectionTH.FServerSocket := FAdapter.CreateServerSocket(ServiceName,StringToGUID(ServiceGUI),False); ServerConnectionTH.Start; DisplayR.Lines.Add( - Service created: "'+ServiceName+); DisplayR.GoToTextEnd; DisplayR.Lines.Add(E.Message); DisplayR.GoToTextEnd; TForm1.ButtonCloseReadingSocketClick(Sender: TObject); if ServerConnectionTH <> ServerConnectionTH.Terminate; ServerConnectionTH.WaitFor; FreeAndNil(ServerConnectionTH); DisplayR.Lines.Add( - Service removed - TForm1.FormShow(Sender: TObject); LabelServer.Text := ServiceName; LabelClient.Text := Client of '+ServiceName; FBluetoothManager := TBluetoothManager.Current; FAdapter := FBluetoothManager.CurrentAdapter; PairedDevices; ComboboxPaired.ItemIndex := on E : Exception do ShowMessage(E.Message); procedure TForm1.FormClose(Sender: TObject; Action: TCloseAction); ServerConnectionTH.Terminate; ServerConnectionTH.WaitFor; FreeAndNil(ServerConnectionTH); TServerConnection TServerConnectionTH.Create(ACreateSuspended: Boolean); inheriteddestructor TServerConnectionTH.Destroy; FSocket.Free; FServerSocket.Free; TServerConnectionTH.execute; ASocket: TBluetoothSocket; Msg: while not Terminated ASocket := nil; and (ASocket = ASocket := FServerSocket.Accept(100); if(ASocket <> FSocket := ASocket; do FData := ASocket.ReadData; if length(FData) > Synchronize(procedure Form1.DisplayR.Lines.Add(TEncoding.UTF8.GetString(FData)); Form1.DisplayR.GoToTextEnd; ); sleep(); Msg := E.Message; Synchronize(procedure Form1.DisplayR.Lines.Add(Server Socket closed: Msg); Form1.DisplayR.GoToTextEnd; end.
窗体文件
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。