Android 通过蓝牙连接并接收来自Arduino的文本[信息]

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

我正在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程序代码为:

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;
结束;
结束。