Android 通过蓝牙连接并接收来自Arduino的文本[信息]
我正在XE7移动应用程序上尝试[通过蓝牙]接收来自Arduino的消息 C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\Object Pascal\Mobile Samples\Device Sensors and Services\Bluetooth\Classic Bluetooth Basic app中的示例在从蓝牙连接读取时崩溃 Arduino sketch闪烁将数据发送到“Bluetooth SPP Pro[来自Google Play]”,显示接收到的数据,但XE7上的示例无法识别数据。 那么,如何从Arduino/蓝牙模块接收数据? 应用程序崩溃时的XE7程序代码为:Android 通过蓝牙连接并接收来自Arduino的文本[信息],android,bluetooth,Android,Bluetooth,我正在XE7移动应用程序上尝试[通过蓝牙]接收来自Arduino的消息 C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\Object Pascal\Mobile Samples\Device Sensors and Services\Bluetooth\Classic Bluetooth Basic app中的示例在从蓝牙连接读取时崩溃 Arduino sketch闪烁将数据发送到“Bluetooth SPP Pro[来自Goo
procedure TTEchoClassicForm.ListenClick(Sender: TObject);
var
s: TBluetoothServerSocket;
client: TBluetoothSocket;
Buff: TBytes;
begin
client := nil;
s := Manager.CurrentAdapter.CreateServerSocket('Test windows socket', TestServiceClass_UUID, Secure.IsChecked);
try
Memo1.Lines.Add('Accept. Waiting connection.');
client := s.Accept(StrToInt(Seconds.Text)*1000);
Memo1.Lines.Add('Accept. reading');
Buff := client.ReadData;
Memo1.Lines.Add('Received: ' + TEncoding.UTF8.GetString(Buff));
except
on E: Exception do
Memo1.Lines.Add('Exception ' + E.Message );
end;
s.Free;
client.Free;
end;
所有形式代码为:
unit EchoClassicForm;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
FMX.Memo, FMX.StdCtrls, FMX.Controls.Presentation, FMX.Edit, FMX.ListBox,
System.Bluetooth;
type
TTEchoClassicForm = class(TForm)
CBDevices: TComboBox;
KnownDevices: TButton;
Listen: TButton;
Seconds: TEdit;
Edit1: TEdit;
Send: TButton;
Secure: TCheckBox;
Memo1: TMemo;
procedure KnownDevicesClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ListenClick(Sender: TObject);
procedure SendClick(Sender: TObject);
private
{ Private declarations }
procedure DiscoveryEnd(const Sender: TObject; const ADeviceList: TBluetoothDeviceList);
function FindBTDevice(Device: string): TBluetoothDevice;
public
{ Public declarations }
end;
var
TEchoClassicForm: TTEchoClassicForm;
Manager: TBluetoothManager;
Adapter: TBluetoothAdapter;
PairedDevices: TBluetoothDeviceList;
DiscoveredDevices: TBluetoothDeviceList;
TestServiceClass_UUID: TGUID;
implementation
{$R *.fmx}
procedure TTEchoClassicForm.DiscoveryEnd(const Sender: TObject;
const ADeviceList: TBluetoothDeviceList);
var
I: Integer;
LDevice: TBluetoothCustomDevice;
begin
DiscoveredDevices := ADeviceList;
Memo1.Lines.Add('Devices discovered: ');
for I := 0 to ADeviceList.Count - 1 do
begin
LDevice := ADeviceList.Items[I];
Memo1.Lines.Add(LDevice.Address + ': ' + LDevice.DeviceName);
end;
end;
function TTEchoClassicForm.FindBTDevice(Device: string): TBluetoothDevice;
var
I: integer;
LDevice: TBluetoothDevice;
KnownDevices: TBluetoothDeviceList;
begin
KnownDevices := Manager.GetPairedDevices(Manager.CurrentAdapter);
for I := 0 to KnownDevices.Count - 1 do
begin
LDevice := KnownDevices.Items[I];
if Device = LDevice.DeviceName then Exit(LDevice);
end;
KnownDevices := Manager.LastDiscoveredDevices;
for I := 0 to KnownDevices.Count - 1 do
begin
LDevice := KnownDevices.Items[I];
if Device = LDevice.DeviceName then Exit(LDevice);
end;
Result := nil;
end;
procedure TTEchoClassicForm.FormCreate(Sender: TObject);
begin
Manager := TBluetoothManager.Current;
Manager.OnDiscoveryEnd := DiscoveryEnd;
TestServiceClass_UUID := StringToGUID('{B62C4E8D-62CC-404b-BBBF-BF3E3BBB1374}');
end;
procedure TTEchoClassicForm.KnownDevicesClick(Sender: TObject);
var
I: integer;
begin
PairedDevices := Manager.CurrentAdapter.PairedDevices;
CBDevices.Items.Clear;
for I := 0 to PairedDevices.Count - 1 do
CBDevices.Items.Add(PairedDevices.Items[I].DeviceName);
end;
procedure TTEchoClassicForm.ListenClick(Sender: TObject);
var
s: TBluetoothServerSocket;
client: TBluetoothSocket;
Buff: TBytes;
begin
client := nil;
s := Manager.CurrentAdapter.CreateServerSocket('Test windows socket', TestServiceClass_UUID, Secure.IsChecked);
try
Memo1.Lines.Add('Accept. Waiting connection.');
client := s.Accept(StrToInt(Seconds.Text)*1000);
Memo1.Lines.Add('Accept. reading');
Buff := client.ReadData;
Memo1.Lines.Add('Received: ' + TEncoding.UTF8.GetString(Buff));
except
on E: Exception do
Memo1.Lines.Add('Exception ' + E.Message );
end;
s.Free;
client.Free;
end;
procedure TTEchoClassicForm.SendClick(Sender: TObject);
var
I : Integer;
cad : String;
LDevice: TBluetoothDevice;
Buff: TBytes;
LSockect: TBluetoothSocket;
cad := '';
for I := 0 to Length(Buff) - 1 do
begin
cad := cad + Format('%0.2X(%d) ', [Buff[I], Buff[I]]);
//hex dec
end;
Memo1.Lines.Add('Sending(' + IntToStr(Length(Buff)) + '): ');
Memo1.Lines.Add(cad);
LDevice := FindBTDevice(CBDevices.Selected.Text);
if (LDevice <> nil) then
begin
LSockect := LDevice.CreateClientSocket(TestServiceClass_UUID, Secure.IsChecked);
try
Memo1.Lines.Add('Connecting:');
Application.ProcessMessages;
LSockect.Connect;
Memo1.Lines.Add('Connected. waiting before send');
Application.ProcessMessages;
Memo1.Lines.Add('Sending Data');
Application.ProcessMessages;
LSockect.SendData(Buff);
LSockect.Close;
Memo1.Lines.Add('Data Sent');
Application.ProcessMessages;
except
on E: Exception do
Memo1.Lines.Add('Exception ' + E.Message );
end;
LSockect.Free;
end;
end.
unitechoclasticform;
接口
使用
System.SysUtils、System.TYPE、System.UITYPE、System.Classes、System.VARIANT、,
FMX.类型,FMX.控件,FMX.窗体,FMX.图形,FMX.对话框,FMX.布局,
FMX.Memo、FMX.StdCtrls、FMX.Controls.Presentation、FMX.Edit、FMX.ListBox、,
蓝牙系统;
类型
TTEchoClassicForm=类(TForm)
cbd设备:TComboBox;
知识:t按钮;
听:t按钮;
秒:TEdit;
编辑1:TEdit;
发送:t按钮;
安全:t检查盒;
备忘录1:TMemo;
程序knowndeviceclick(发送方:TObject);
过程表单创建(发送方:ToObject);
过程列表单击(发送方:ToObject);
程序SendClick(发送者:ToObject);
私有的
{私有声明}
程序发现(const发送方:TObject;const代理方:TBluetoothDeviceList);
函数FindBTDevice(设备:字符串):t Bluetooth设备;
公众的
{公开声明}
结束;
变量
TechClassicForm:TTechClassicForm;
管理者:蓝鹰管理者;
转接器:t蓝牙转接器;
PairedDevices:TBluetoothDeviceList;
发现的设备:t蓝色牙齿设备列表;
TestServiceClass_UUID:TGUID;
实施
{$R*.fmx}
发现程序(const发送方:TObject;
康斯特阿德维克斯特:蓝牙魔术师);
变量
I:整数;
d设备:t蓝灯设备;
开始
发现的设备:=阿德维克主义者;
Memo1.Lines.Add('发现的设备:');
对于I:=0到ADeviceList。计数-1 do
开始
l设备:=设备列表项[I];
Memo1.Lines.Add(LDevice.Address+':'+LDevice.DeviceName);
结束;
结束;
函数TTechocClassicForm.FindBTDevice(设备:字符串):TBluetoothDevice;
变量
I:整数;
设备:t蓝牙装置;
知识:蓝牙魔术师;
开始
KnownDevices:=Manager.GetPairedDevices(Manager.CurrentAdapter);
对于I:=0的已知设备。计数-1 do
开始
l设备:=已知设备项[I];
如果设备=LDevice.DeviceName,则退出(LDevice);
结束;
已知设备:=Manager.LastDiscoveredDevices;
对于I:=0的已知设备。计数-1 do
开始
l设备:=已知设备项[I];
如果设备=LDevice.DeviceName,则退出(LDevice);
结束;
结果:=无;
结束;
流程:ClassicForm.FormCreate(发件人:ToObject);
开始
管理者:=t蓝色管理者。当前;
Manager.OnDiscoveryEnd:=发现者;
TestServiceClass_UUID:=StringToGUID({B62C4E8D-62CC-404b-BBBF-BF3E3BBB1374});
结束;
程序:ClassicForm.KnowndeviceClick(发送方:ToObject);
变量
I:整数;
开始
PairedDevices:=Manager.CurrentAdapter.PairedDevices;
CBDevices.Items.Clear;
对于I:=0到PairedDevices.Count-1 do
CBDevices.Items.Add(PairedDevices.Items[I].DeviceName);
结束;
程序:ClassicForm.ListenClick(发件人:ToObject);
变量
s:T蓝色牙套;
客户:T蓝色牙套;
Buff:TBytes;
开始
客户:=零;
s:=Manager.CurrentAdapter.CreateServerSocket('Test windows socket',TestServiceClass_UUID,Secure.IsChecked);
尝试
Memo1.Lines.Add('Accept.Waiting connection');
客户机:=s.Accept(stroint(Seconds.Text)*1000);
备忘录1.行。添加('Accept.reading');
Buff:=client.ReadData;
Memo1.Lines.Add('Received:'+TEncoding.UTF8.GetString(Buff));
除了
关于E:Exception-do
备注1.行。添加('Exception'+E.消息);
结束;
s、 免费的;
客户。免费;
结束;
程序:ClassicForm.SendClick(发件人:ToObject);
变量
I:整数;
cad:字符串;
设备:t蓝牙装置;
Buff:TBytes;
lsocket:t蓝色牙套;
cad:='';
对于I:=0到长度(Buff)-1 do
开始
cad:=cad+格式(“%0.2X(%d)”[Buff[I],Buff[I]];
//十六进制十二进制
结束;
Memo1.Lines.Add('Sending('+IntToStr(Length(Buff))+'):');
备忘录1.线条添加(cad);
LDevice:=FindBTDevice(CBDevices.Selected.Text);
如果(零)那么
开始
lsocket:=LDevice.CreateClientSocket(TestServiceClass_UUID,Secure.IsChecked);
尝试
备注1.行。添加('Connecting:');
Application.ProcessMessages;
lsocket.Connect;
备注1.Lines.Add('Connected.waiting before send');
Application.ProcessMessages;
备注1.行。添加(“发送数据”);
Application.ProcessMessages;
lsocket.SendData(Buff);
lsocket.Close;
备注1.行。添加(“已发送数据”);
Application.ProcessMessages;
除了
关于E:Exception-do
备注1.行。添加('Exception'+E.消息);
结束;
lsocket.Free;
结束;
结束。