相关资料:
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;

 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, 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 > - 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 > - 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 > then
for I:= to FPairedDevices.Count - 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 > - then
begin
LDevice := FPairedDevices[ComboboxPaired.ItemIndex] as TBluetoothDevice;
LServices := LDevice.GetServices;
for I := to LServices.Count - do
ComboBoxServices.Items.Add(LServices[I].Name + ' --> ' + GUIDToString(LServices[I].UUID));
ComboBoxServices.ItemIndex := ;
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 := to LServices.Count - 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;
end
end; //发送信息方法
procedure TForm1.SendData;
var
ToSend: TBytes;
LDevice: TBluetoothDevice;
begin
if (FSocket = nil) or (ItemIndex <> ComboboxPaired.ItemIndex) then
begin
if ComboboxPaired.ItemIndex > - 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();
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 := to ADevices.Count - do
ComboboxDevices.Items.Add(ADevices[I].DeviceName + ' -> ' + ADevices[I].Address);
ComboboxDevices.ItemIndex := ;
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;
end
end; //显示窗体时,建立蓝牙管理器,并检查是否开启
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 := ;
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);
end
end; {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();
if(ASocket <> nil) then
begin
FSocket := ASocket;
while not Terminated do
begin
FData := ASocket.ReadData;
if length(FData) > then
Synchronize(procedure
begin
Form1.DisplayR.Lines.Add(TEncoding.UTF8.GetString(FData));
Form1.DisplayR.GoToTextEnd;
end);
sleep();
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)的更多相关文章

  1. Android开源库--Gson谷歌官方json解析库

    官方文档地址:http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html 官方网站:http://code.go ...

  2. Android开发人员官方站点文档 - 国内踏得网镜像

    Android Developer 安卓开发人员官方站点无法正常訪问.即使FQ因为网络原因依旧訪问缓慢. 故整理相关字体.脚本.样式.页面资源,在踏得网server上建立了本地镜像.初始镜像时间201 ...

  3. 微信应用号开发知识贮备之altjs官方实例初探

    天地会珠海分舵注:随着微信应用号的呼之欲出,相信新一轮的APP变革即将发生.从获得微信应用号邀请的业内人士发出来的一张开发工具源码截图可以看到,reacjs及其相应的FLUX框架altjs很有可能会成 ...

  4. android Jni NDK开发环境搭建及其简单实例的编写

    android  Jni  NDK开发环境搭建及其简单实例的编写 由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下.遇到了些问题,然后总结下学习过程中 ...

  5. delphi开发学习四:TClientDataSet与TDataSetProvider控件使用实例

    1.TClientDataSet控件 通过TClientDataSet控件可以建立瘦客户端的应用程序,且数据执行效率较高,但它不能和数据库自动连接,程序中必须制定它如何获取数据.一般情况下,TClie ...

  6. android 百度地图开发实例(转载)

    因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点androi ...

  7. Android经典项目开发之天气APP实例分享

    原文:Android经典项目开发之天气APP实例分享 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/mzc186/article/details/5 ...

  8. delphi开发实例:保存字体设置的方法

    http://blog.csdn.net/delphi308/article/details/9906147 delphi开发实例:保存字体设置的方法 2013-08-11 22:37 446人阅读  ...

  9. Android NFC标签 开发深度解析 触碰的艺术

    有几天没有更新博客了,不过本篇却准备了许久,希望能带给每一位开发者最简单高效的学习方式.废话到此为止,下面开始正文. NFC(Near Field Communication,近场通信)是一种数据传输 ...

随机推荐

  1. 车牌识别LPR(四)-- 车牌定位

    第四篇:车牌定位 车牌定位就是采用一系列图像处理或者数学的方法从一幅图像中将车牌准确地定位出来.车牌定位提取出的车牌是整个车牌识别系统的数据来源,它的效果的好坏直接影响到整个系统的表现,只有准确地定位 ...

  2. Android下HelloWorld项目的R.java文件介绍

    R.java文件介绍 HelloWorld工程中的R.java文件 package com.android.hellworld; public final class R {     public s ...

  3. git跨平台换行符不兼容

    https://help.github.com/articles/dealing-with-line-endings/#platform-all

  4. mysqldump批量导出(多张表)表结构及表数据

    Mysql 批量导出表结构(数据) 仅导出结构,不导出数据: 1.导出數據库為dbname的表结构    mysqldump  -h主机地址 -u用户名 -p密码 -d dbname >db.s ...

  5. iOS开发:UINavigationController常用操作

    NavigationController常用操作: 更改bar的背景颜色:self.navigationController?.navigationBar.barTintColor =UIColor. ...

  6. UVa 10129 (并查集 + 欧拉路径) Play on Words

    题意: 有n个由小写字母的单词,要求判断是否存在某种排列使得相邻的两个单词,前一个单词末字母与后一个单词首字母相同. 分析: 将单词的两个字母看做节点,则一个单词可以看做一条有向边.那么题中所求的排列 ...

  7. [转]SQL、LINQ、Lambda

    原文链接:http://www.cnblogs.com/mr-hero/p/3532631.html SQL   LinqToSql   Lambda 1. 查询Student表中的所有记录的Snam ...

  8. 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)

    对于提交的苹果官方的app,在审核的时候会给我们一些crash文件,对于这些有用的文件,里面是关于我们的bug的一些信息,那么该如何去调试呢 第一步:在任意目录创建一个目录,用来调试crash,我这里 ...

  9. QPS、PV和需要部署机器数量计算公式(转)

    术语说明: QPS = req/sec = 请求数/秒 [QPS计算PV和机器的方式] QPS统计方式 [一般使用 http_load 进行统计] QPS = 总请求数 / ( 进程总数 *   请求 ...

  10. 【转】 IOS中定时器NSTimer的开启与关闭

    原文网址:http://blog.csdn.net/enuola/article/details/8099461 调用一次计时器方法: myTimer = [NSTimer scheduledTime ...