標籤:ons cto over nstat ddr proc 印表機 hone sage
Android執行個體-Delphi開發藍芽官方執行個體解析(XE10+小米2+小米5)
相關資料:
1.http://blog.csdn.net/laorenshen/article/details/41149803
2.http://www.cnblogs.com/findumars/p/5149128.html
一、理清概念
1.藍牙裝置:是指代有藍芽通訊的手機、電腦、平板、印表機、耳機等。
2.裝置名稱:是指裝置開啟藍芽功能後,在其他裝置中顯示的名字,1用的A、B、C等。
3.藍芽關態:如果A手機沒有開啟藍芽功能,A手機是不能使用搜尋的。就算A開啟藍芽,其他的裝置沒開啟,A也是搜尋不到的,如E。
4.服務名稱:每一個裝置上開啟藍芽時,都會提供不同的服務,服務的名稱是在其他裝置上顯示的。
5.服務是從哪裡來的?其實開啟藍芽功能,只是裝置開啟此功能,但沒有實際的應用功能。必須由某個程式或應用建立相關的服務,其他裝置才能與此裝置通訊。
二、Delphi中提供了什嗎?
1.藍芽相關功能在System.Bluetooth.pas單元。
2.Bluetooth.pas提供的對像
TBluetoothManager:藍芽管理器。用於藍牙裝置管理,包括髮現藍牙裝置,擷取配對裝置,處理遠程配對請求等功能。
TBluetoothDeviceList:是藍牙裝置列表。可以通過TBluetoothManager.GetPairedDevices獲得配對裝置列表
TBluetoothAdapter:本機藍牙裝置,實現配對、解除配對等功能,可通過
TBluetoothDevice:遠端藍牙裝置,每個遠端裝置可以提供若干個服務
TBluetoothService:遠端藍牙裝置服務,包括服務名和UUID
TBluetoothServiceList:服務列表。可通過TBluetoothDevice.GetServices獲得遠端裝置服務列表
TBluetoothSocket:藍芽通訊通訊端。
三、執行個體解析
小米手機2
1.開啟藍芽
2.點擊“發現裝置”,過一會就會在下面的列表中顯示出所有搜尋到的藍牙裝置。
3.在出現的藍牙裝置列表中,選一個。比如“小米手機5”。
4.點擊“配對”,這時小米手機5會收到配對資訊。
5.這時配對裝置列表中就會出現小米手機5,選中它。
6.點擊“服務”,出現N個服務,但這時你不知道怎麼與小米手機5通訊。對的還少個服務。
7.操作小米手機5中的第三步。
8.在服務列表中選中最下方的(暈,不知道為什麼名字是個空串)。
9.進入服務示範頁面。
10.點“傳送簡訊給”不好意思,我不小心點了二下,所以小米手機5收到二次。
11.這時小米手機5就收到了資訊。
小米手機5
1.開啟藍芽
2.接受小米手機2的配對請求。
3.點擊“建立文本服務”
PS:
1.同一個程式裡包括了發送資訊,與接收資訊。所以程式可以在二個手機上測試。
2.現在只能小米手機2給小米手機5發資訊,為什麼呢?因為小米手機2沒有建服務呀。
3.如果小米手機5的程式退出,你會發現小米手機2上查看服務,剛才小米手機5建立的服務不見了。
4.圖片本來很清楚,但為了文章的大小,就成了現在的慘不忍睹了。望大家見諒。
Delphi官方執行個體源碼:
unit Unit1;interfaceuses 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, FMX.ScrollBox;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; override; end; TForm1 = class(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; Label1: TLabel; procedure ButtonDiscoverClick(Sender: TObject); procedure ButtonPairClick(Sender: TObject); procedure ButtonUnPairClick(Sender: TObject); procedure ButtonPairedDeviceClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure ButtonOpenReadingSocketClick(Sender: TObject); procedure ButtonConnectToRFCOMMClick(Sender: TObject); procedure ButtonCloseReadingSocketClick(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FreeSocketClick(Sender: TObject); function ManagerConnected:Boolean; function GetServiceName(GUID: string): string; procedure ComboBoxPairedChange(Sender: TObject); procedure ButtonServicesClick(Sender: TObject); private { Private declarations } FBluetoothManager: TBluetoothManager; FDiscoverDevices: TBluetoothDeviceList; FPairedDevices: TBluetoothDeviceList; FAdapter: TBluetoothAdapter; FData: TBytes; FSocket: TBluetoothSocket; ItemIndex: Integer; ServerConnectionTH: TServerConnectionTH; procedure DevicesDiscoveryEnd(const Sender: TObject; const ADevices: TBluetoothDeviceList); procedure PairedDevices; procedure SendData; public { Public declarations } end;Const ServiceName = ‘Basic Text Server‘; ServiceGUI = ‘{B62C4E8D-62CC-404B-BBBF-BF3E3BBB1378}‘;var 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}//配對(Pair)procedure TForm1.ButtonPairClick(Sender: TObject);begin if ManagerConnected then if ComboboxDevices.ItemIndex > -1 then FAdapter.Pair(FDiscoverDevices[ComboboxDevices.ItemIndex]) else ShowMessage(‘沒有選擇的裝置(No device selected)‘);end;//解除配對(UnPair)procedure TForm1.ButtonUnPairClick(Sender: TObject);begin if ManagerConnected then if ComboboxPaired.ItemIndex > -1 then FAdapter.UnPair(FPairedDevices[ComboboxPaired.ItemIndex]) else ShowMessage(‘未選擇配對裝置(No Paired device selected)‘);end;procedure TForm1.ComboBoxPairedChange(Sender: TObject);begin LabelNameSarver.Text := ComboBoxPaired.Items[ComboBoxPaired.ItemIndex];end;procedure TForm1.PairedDevices;var I: Integer;begin ComboboxPaired.Clear; if ManagerConnected then begin FPairedDevices := FBluetoothManager.GetPairedDevices; if FPairedDevices.Count > 0 then for I:= 0 to FPairedDevices.Count - 1 do ComboboxPaired.Items.Add(FPairedDevices[I].DeviceName) else ComboboxPaired.Items.Add(‘沒有配對裝置(No Paired Devices)‘); end;end;//配對裝置(Paired Devices)procedure TForm1.ButtonPairedDeviceClick(Sender: TObject);begin PairedDevices; ComboboxPaired.DropDown;end;//服務(Services)procedure TForm1.ButtonServicesClick(Sender: TObject);var LServices: TBluetoothServiceList; LDevice: TBluetoothDevice; I: Integer;begin ComboBoxServices.Clear; if ManagerConnected then if ComboboxPaired.ItemIndex > -1 then begin LDevice := FPairedDevices[ComboboxPaired.ItemIndex] as TBluetoothDevice; LServices := LDevice.GetServices; for I := 0 to LServices.Count - 1 do ComboBoxServices.Items.Add(LServices[I].Name + ‘ --> ‘ + GUIDToString(LServices[I].UUID)); ComboBoxServices.ItemIndex := 0; ComboBoxServices.DropDown; end else ShowMessage(‘未選擇配對裝置(No paired device selected)‘);end;//釋放客戶通訊端(Free Client Socket)procedure TForm1.FreeSocketClick(Sender: TObject);begin FreeAndNil(FSocket); DisplayR.Lines.Add(‘客戶通訊端釋放(Client socket set free)‘); DisplayR.GoToLineEnd;end;//清空(Clear)procedure TForm1.Button2Click(Sender: TObject);begin DisplayR.ReadOnly := False; DisplayR.SelectAll; DisplayR.DeleteSelection; DisplayR.ReadOnly := True;end;function TForm1.GetServiceName(GUID: string): string;var LServices: TBluetoothServiceList; LDevice: TBluetoothDevice; I: Integer;begin LDevice := FPairedDevices[ComboboxPaired.ItemIndex] as TBluetoothDevice; LServices := LDevice.GetServices; for I := 0 to LServices.Count - 1 do begin if StringToGUID(GUID) = LServices[I].UUID then begin Result := LServices[I].Name; break; end; end;end;//傳送簡訊給 - >(Send text to ->)procedure TForm1.ButtonConnectToRFCOMMClick(Sender: TObject);begin if ManagerConnected then try SendData; except on E : Exception do begin DisplayR.Lines.Add(E.Message); DisplayR.GoToTextEnd; FreeAndNil(FSocket); end; end;end;//判斷藍芽的狀態function TForm1.ManagerConnected:Boolean;begin if FBluetoothManager.ConnectionState = TBluetoothConnectionState.Connected then begin Labeldiscoverable.Text := FBluetoothManager.CurrentAdapter.AdapterName; Result := True; end else begin Result := False; DisplayR.Lines.Add(‘沒有發現藍牙裝置(No Bluetooth device Found)‘); DisplayR.GoToTextEnd; endend;//發送資訊方法procedure TForm1.SendData;var ToSend: TBytes; LDevice: TBluetoothDevice;begin if (FSocket = nil) or (ItemIndex <> ComboboxPaired.ItemIndex) then begin if ComboboxPaired.ItemIndex > -1 then begin LDevice := FPairedDevices[ComboboxPaired.ItemIndex] as TBluetoothDevice; DisplayR.Lines.Add(GetServiceName(ServiceGUI)); DisplayR.GoToTextEnd; FSocket := LDevice.CreateClientSocket(StringToGUID(ServiceGUI), False); if FSocket <> nil then begin ItemIndex := ComboboxPaired.ItemIndex; FSocket.Connect; ToSend := TEncoding.UTF8.GetBytes(Edit1.Text); FSocket.SendData(ToSend); DisplayR.Lines.Add(‘簡訊已發送(Text Sent)‘); DisplayR.GoToTextEnd; end else ShowMessage(‘Out of time -15s-‘); end else ShowMessage(‘未選擇配對裝置(No paired device selected)‘); end else begin ToSend := TEncoding.UTF8.GetBytes(Edit1.Text); FSocket.SendData(ToSend); DisplayR.Lines.Add(‘簡訊已發送(Text Sent)‘); DisplayR.GoToTextEnd; end;end;//發現裝置(Discover devices)procedure TForm1.ButtonDiscoverClick(Sender: TObject);begin ComboboxDevices.Clear; if ManagerConnected then begin FAdapter := FBluetoothManager.CurrentAdapter; FBluetoothManager.StartDiscovery(10000); FBluetoothManager.OnDiscoveryEnd := DevicesDiscoveryEnd; end;end;procedure TForm1.DevicesDiscoveryEnd(const Sender: TObject; const ADevices: TBluetoothDeviceList);begin TThread.Synchronize(nil, procedure var I: Integer; begin FDiscoverDevices := ADevices; for I := 0 to ADevices.Count - 1 do ComboboxDevices.Items.Add(ADevices[I].DeviceName + ‘ -> ‘ + ADevices[I].Address); ComboboxDevices.ItemIndex := 0; end);end;//建立文本服務(Create text service)procedure TForm1.ButtonOpenReadingSocketClick(Sender: TObject);begin if (ServerConnectionTH = nil) and ManagerConnected then begin try 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; except on E : Exception do begin DisplayR.Lines.Add(E.Message); DisplayR.GoToTextEnd; end; end; end;end;//刪除文字服務(Remove text service)procedure TForm1.ButtonCloseReadingSocketClick(Sender: TObject);begin if ServerConnectionTH <> nil then begin ServerConnectionTH.Terminate; ServerConnectionTH.WaitFor; FreeAndNil(ServerConnectionTH); DisplayR.Lines.Add(‘ - 服務刪除(Service removed) -‘); DisplayR.GoToTextEnd; endend;//顯示表單時,建立藍芽管理器,並檢查是否開啟procedure TForm1.FormShow(Sender: TObject);begin try LabelServer.Text := ServiceName; LabelClient.Text := ‘Client of ‘+ServiceName; FBluetoothManager := TBluetoothManager.Current; FAdapter := FBluetoothManager.CurrentAdapter; if ManagerConnected then begin PairedDevices; ComboboxPaired.ItemIndex := 0; end; except on E : Exception do begin ShowMessage(E.Message); end; end;end;//關閉時,釋放線程procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin if ServerConnectionTH <> nil then begin ServerConnectionTH.Terminate; ServerConnectionTH.WaitFor; FreeAndNil(ServerConnectionTH); endend;{TServerConnection}constructor TServerConnectionTH.Create(ACreateSuspended: Boolean);begin inherited;end;//釋放資源destructor TServerConnectionTH.Destroy;begin FSocket.Free; FServerSocket.Free; inherited;end;//讀取線程的讀取資料方法procedure TServerConnectionTH.execute;var ASocket: TBluetoothSocket; Msg: string;begin while not Terminated do try ASocket := nil; while not Terminated and (ASocket = nil) do ASocket := FServerSocket.Accept(100); if(ASocket <> nil) then begin FSocket := ASocket; while not Terminated do begin FData := ASocket.ReadData; if length(FData) > 0 then Synchronize(procedure begin Form1.DisplayR.Lines.Add(TEncoding.UTF8.GetString(FData)); Form1.DisplayR.GoToTextEnd; end); sleep(100); end; end; except on E : Exception do begin Msg := E.Message; Synchronize(procedure begin Form1.DisplayR.Lines.Add(‘伺服器關閉通訊端(Server Socket closed): ‘ + Msg); Form1.DisplayR.GoToTextEnd; end); end; end;end;end.
Android執行個體-Delphi開發藍芽官方執行個體解析(XE10+小米2+小米5)