DELPHIでAndriodを使ってble通信をしてみます。
1.MICRO BITのKEY押し状態をAndriod上に表示する。
2.AndroidからMicroBitへ文字列を送信する。
できるとこんな感じになります。
結構簡単に通信できました。。
コードはこんな感じです。
| unit Main; |
| interface |
| uses |
| System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, |
| FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, |
| FMX.Objects, FMX.Edit, FMX.Controls.Presentation, System.Bluetooth, |
| System.Bluetooth.Components; |
| const |
| UUID_BUTTON_SERVICE : TBluetoothUUID = '{E95D9882-251D-470A-A062-FA1922DFA9A8}'; |
| UUID_BUTTON1_CHARACTERRISTIC : TBluetoothUUID = '{E95DDA90-251D-470A-A062-FA1922DFA9A8}'; |
| UUID_BUTTON2_CHARACTERRISTIC : TBluetoothUUID = '{E95DDA91-251D-470A-A062-FA1922DFA9A8}'; |
| UUID_UART_SERVICE : TBluetoothUUID = '{6E400001-B5A3-F393-E0A9-E50E24DCCA9E}'; |
| UUID_UART_TX_CHARACTERRISTIC : TBluetoothUUID = '{6E400003-B5A3-F393-E0A9-E50E24DCCA9E}'; |
| type |
| TForm42 = class(TForm) |
| Connect: TButton; |
| Edit1: TEdit; |
| Send: TButton; |
| ButtonA: TCircle; |
| Label1: TLabel; |
| BTLableA: TLabel; |
| ButtonB: TCircle; |
| BtLabelB: TLabel; |
| BluetoothLE1: TBluetoothLE; |
| procedure BluetoothLE1CharacteristicRead(const Sender: TObject; |
| const ACharacteristic: TBluetoothGattCharacteristic; |
| AGattStatus: TBluetoothGattStatus); |
| procedure BluetoothLE1EndDiscoverDevices(const Sender: TObject; |
| const ADeviceList: TBluetoothLEDeviceList); |
| procedure BluetoothLE1EndDiscoverServices(const Sender: TObject; |
| const AServiceList: TBluetoothGattServiceList); |
| procedure ConnectClick(Sender: TObject); |
| procedure SendClick(Sender: TObject); |
| procedure FormCreate(Sender: TObject); |
| private |
| { private 宣言 } |
| public |
| { public 宣言 } |
| end; |
| var |
| Form42: TForm42; |
| GBleDevice : TBluetoothLEDevice; |
| BackColor : TColor; |
| implementation |
| {$R *.fmx} |
| procedure TForm42.BluetoothLE1CharacteristicRead(const Sender: TObject; |
| const ACharacteristic: TBluetoothGattCharacteristic; |
| AGattStatus: TBluetoothGattStatus); |
| begin |
| if(ACharacteristic.UUID = UUID_BUTTON1_CHARACTERRISTIC) then |
| begin |
| if ACharacteristic.GetValueAsInt8(0) <> 0 then |
| ButtonA.Fill.Color := TAlphaColorRec.Red |
| else |
| ButtonA.Fill.Color := BackColor; |
| end |
| else |
| if(ACharacteristic.UUID = UUID_BUTTON2_CHARACTERRISTIC) then |
| begin |
| if ACharacteristic.GetValueAsInt8(0) <> 0 then |
| ButtonB.Fill.Color := TAlphaColorRec.Red |
| else |
| ButtonB.Fill.Color := BackColor; |
| end; |
| end; |
| procedure TForm42.BluetoothLE1EndDiscoverDevices(const Sender: TObject; |
| const ADeviceList: TBluetoothLEDeviceList); |
| var |
| i : uint32; // ARM なので最適化 |
| begin |
| if ADeviceList.Count > 0 then begin |
| for i := 0 to Pred(ADeviceList.Count) do begin |
| if Pos('BBC micro:bit', ADeviceList[i].DeviceName) > 0 then begin |
| Label1.Text := ADeviceList[i].DeviceName ;// ' (' + ADeviceList[i].Address + ')'; |
| BluetoothLE1.CancelDiscovery; |
| GBleDevice := ADeviceList[i]; |
| GBleDevice.DiscoverServices; |
| exit; |
| end; |
| end; |
| end; |
| end; |
| procedure TForm42.BluetoothLE1EndDiscoverServices(const Sender: TObject; |
| const AServiceList: TBluetoothGattServiceList); |
| var |
| i : uint32; // ARM なので最適化 |
| LGattService : TBluetoothGattService; |
| begin |
| LGattService := BluetoothLE1.GetService(GBleDevice, UUID_BUTTON_SERVICE); |
| if LGattService <> nil then |
| begin |
| for i := 0 to Pred(LGattService.Characteristics.Count) do |
| begin |
| if LGattService.Characteristics[i].UUID = UUID_BUTTON1_CHARACTERRISTIC then |
| begin |
| GBleDevice.SetCharacteristicNotification(LGattService.Characteristics[i], True); |
| end |
| else |
| if LGattService.Characteristics[i].UUID = UUID_BUTTON2_CHARACTERRISTIC then |
| begin |
| GBleDevice.SetCharacteristicNotification(LGattService.Characteristics[i], True); |
| end; |
| end; |
| end; |
| end; |
| procedure TForm42.ConnectClick(Sender: TObject); |
| begin |
| if( not BluetoothLE1.Enabled ) then |
| begin |
| BluetoothLE1.Enabled := True; |
| BluetoothLE1.DiscoverDevices(1000); // 10秒 |
| Connect.Text := 'Disconnect'; |
| Label1.Text := ''; |
| end |
| else |
| begin |
| BluetoothLE1.CancelDiscovery; |
| BluetoothLE1.Enabled := False; |
| GBleDevice := NIL; |
| Connect.Text := 'Connect'; |
| end; |
| end; |
| procedure TForm42.FormCreate(Sender: TObject); |
| BackColor := ButtonA.Fill.Color; |
| end; |
| procedure TForm42.SendClick(Sender: TObject); |
| var |
| i : uint32; // ARM なので最適化 |
| LGattService : TBluetoothGattService; |
| LCharact : TBluetoothGattCharacteristic; |
| begin |
| if GBleDevice = NIL then exit; |
| if GBleDevice.IsConnected = false then exit; |
| LGattService := BluetoothLE1.GetService(GBleDevice, UUID_UART_SERVICE); |
| if LGattService = NIL then exit; |
| // LCharact := LGattService.GetCharacteristic(UUID_UART_TX_CHARACTERRISTIC); |
| for i := 0 to Pred(LGattService.Characteristics.Count) do |
| begin |
| if LGattService.Characteristics[i].UUID = UUID_UART_TX_CHARACTERRISTIC then |
| begin |
| LGattService.Characteristics[i].SetValueAsString(Edit1.Text+'#', True); |
| GBleDevice.WriteCharacteristic(LGattService.Characteristics[i]); |
| exit; |
| end; |
| end; |
| end; |
microbit側はmicrobit アドベントカレンダー25日にて公開予定です。
それでは。
http://qa65.blogspot.jp/2017/12/microbitble.html


