Delphi XE7已经内建了蓝牙功能,提供了System.Bluetooth.pas单元
顾名思义,System表示XE7的蓝牙功能可以在Windows,Android,IOS系统内使用
TBluetoothManager
TBluetoothDeviceList
TBluetoothAdapter
TBluetoothDevice
TBluetoothService
TBluetoothServiceList
TBluetoothSocket
TBluetoothManager是蓝牙管理器,用于蓝牙设备管理,包括发现蓝牙设备,获取配对设备,处理远程配对请求等功能
TBluetoothDeviceList是蓝牙设备列表,TBluetoothDeviceList = class(TObjectList<TBluetoothDevice>),可以通过TBluetoothManager.GetPairedDevices获得配对设备列表
TBluetoothAdapter本机蓝牙设备,实现配对、取消配对等功能,可通过TBluetoothManager.CurrentAdapter得到当前蓝牙设备
TBluetoothDevice远端蓝牙设备,每个远端设备可以提供若干个服务(TBluetoothService),
TBluetoothService远端蓝牙设备服务,包括服务名和UUID
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.
窗体文件
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。