Delphi 12.1CE BluetoothLEでHOGPの接続ができません
HOGPでのデータ取得をしたい
VBAを5年、Delphiは独学で1年半ほど使っています。
情報源はWebのみなので知識が偏っていて、初歩的なことがわからず不愉快な思いをさせたらすみません。
現状をご説明します。
デジタルはかりの計測重量をStringgridに順次入力させるのが目的です。
まずWin11ではかりと接続して、はかりからのデータ取得はできました。
しかし、一旦WinのBluetoothLE接続解除、はかりの電源OFFをして再接続をすると
ペアリングはしているようなのですが、接続ができません。
一旦デバイス登録を削除して初回接続した状態にすれば、問題なくデータ取得できます。
毎回デバイス削除→接続をすればいいのですが、面倒なのでアプリ側のOnClickイベントで完結させたいと思っています。
プログラムの進捗状況は、
①デバイス削除した状態だと、DiscoverDevices→EndDiscoverDevicesは成功しますが、その後のDiscoverServicesから進みません。
②デバイスのペアリングができている状態(初回接続成功後、BLE接続解除もしくははかり電源OFF→再接続できない状態)の場合は、DiscoverServicesでサービス取得成功(Human interface device)できましたが、GetCharacteristicはnilになってしまいます。
以下、コードを掲載いたします。
作成コード
private
var
BLElist: TBluetoothLEDeviceList;
BLEdevice: TBluetoothLEDevice;
BLESlist: TBluetoothGattServiceList;
BLEservice: TBluetoothGattService;
BLEcharlist: TBluetoothGattCharacteristicList;
BLEchar: TBluetoothGattCharacteristic;
const
HidUUID: TBluetoothUUID = '{00001812-0000-1000-8000-00805f9b34fb}';
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
BluetoothLE1.DiscoverDevices(2500, [HidUUID]);
end;
procedure TForm1.BluetoothLE1.EndDiscoverDevices(const Sender: TObject;
const ADeviceList: TBluetoothLEDeviceList);
var
i: Integer;
begin
Listbox1.Items.Clear;
BLElist := ADeviceList;
for i := 0 to BLElist.count - 1 do
begin
BLEdevice := BLElist[i];
Listbox1.Items.Add(BLEdevice.DeviceName);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
BLEdevice := BLElist[Listbox1.ItemIndex];
BluetoothLE1.DiscoverServices(BLEdevice); //①の場合はこの後フリーズします
end;
procedure TForm1.BluetoothLE1.ServicesDiscovered(const Sender: TObject;
const AServiceList: TBluetoothGattServiceList);
var
i: Integer;
begin
BLESlist := AServiceList;
for i := 0 to BLESlist.count - 1 do
Listbox2.Items.Add(BLESlist[i].UUIDName);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
BLEservice := BLESlist[Listbox2.ItemIndex];
BLEservice.GetCharacteristic(HidUUID);
BLEdevice.ReadCharacteristic(BLEservice.GetCharacteristic(HidUUID))
end;
//②の場合にこれ以降進みません
procedure TForm1.BluetoothLE1.CharacteristicRead(const Sender: TObject;
const ACharacteristic: TBluetoothGattCharacteristic;
AGattStatus: TBluetoothGattStatus);
begin
end;
BluetoothLE1.DiscoverServices(BLEdevice) のときに接続にはなるようですが、
ペアリング状態のように、追加されたデバイスとしては表示されません。
そして40秒後に未接続になります。(以下記載の製品仕様の通り)
自分で試したこと
以下は、はかりのBLE仕様とHOGP接続の情報です。
・HOGP は計量データをキーボード入力Input Reportとして接続先1文字ずつ送信する。
・規格 Bluetooth5.0 Bluetooth Low Energy
・Core nRF52832 Nordic
・Role Peripheral
・Security Level LE Security Mode 1, Level 2
・HOGP
①Human Interface Device Service 0x1812
②Battery Service 0x180F
・Central側は、初回接続時またはペアリング登録解除時、接続後40秒以内にペアリングを実施する 。
Peripheral側は、ペアリング完了後に通信モードに移行する。
ペアリング要求が発生しない状態で40秒経過するとリセット。ペアリング登録情報を削除し、再度Advertisingを開始する。
エンバカデロ Bluetooth LE の使用 を見たのですが、これ以上理解できず、またインターネットでも情報がなく困っています。
初回接続した後に確実に再接続できればいいのですが、どうも不安定な場所なのか、PCとの相性とかなのかわかりませんが常に接続できません。
②の状況から進めてデータを出力させたいです。
ご協力お願いいたします。