@51K10mnr

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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秒後に未接続になります。(以下記載の製品仕様の通り)
画像1.png

自分で試したこと

以下は、はかりの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との相性とかなのかわかりませんが常に接続できません。
②の状況から進めてデータを出力させたいです。
ご協力お願いいたします。

0 likes

1Answer

「デジタルはかり」の HOGP接続ですが、
OS(Win11)とペアリングすると、(アプリ不要で)メモ帳 とかに 計測重量が タイピングされるものと思われます。←間違っていますか?
HOGPではなく、BLE UARTで接続することは できないのでしょうか?

0Like

Comments

  1. @51K10mnr

    Questioner

    コメントありがとうございます。
    おっしゃる通りメモ帳などにタイピングされます。
    Stringgridへの入力もできました。
    製品の接続条件はHOGPプロファイル使用の基盤で、BLE UARTで接続することは難しいです。

  2. おっしゃる通りメモ帳などにタイピングされます。

    そうですと、OSはBLEキーボードと認識しているということですね。
    Delphiアプリが介入してBLEを制御する目的はなんでしょうか?

  3. @51K10mnr

    Questioner

    データはキーボード入力と同じように転送されます。
    私がデータ記録用アプリとしてDelphiを使用していますので、再接続ができないデジタルはかりに対してDelphiのアプリからBLE再接続をしてデータ受信待機状態にしたいのです。

  4. DelphiのアプリからBLE再接続をしてデータ受信待機状態にしたい

    HGOP は OS が制御しているので、アプリからは 制御できないと思います。
    ペアリングを解除するだけでは、「デジタルはかり」は Advertising しませんか?
    (「デジタルはかり」の電源OFF/ONが必須ですか?)

  5. @51K10mnr

    Questioner

    PCのコントロールでペアリングを解除すればアドバタイジングを始めるので機器は見つけることはできます。
    ただ、毎回ペアリング解除をして接続を開始するのが面倒なのでアプリから再接続をしたいのですが無理でしょうか?
    クラシックの接続ならやったことはあるのですが、BLEのコンポーネントではアドバタイジングに対しての接続要求やペアリングのやり方がわからないので困っています。

  6. アプリから、コマンドでペアリング解除、再接続する方法はどうでしょうか。
    PowerShellを調べる必要がありますが・・・

  7. @51K10mnr

    Questioner

    まさにそれを行いたいのですが、DelphiのBLEに関する情報が少なすぎてわかりません><;
    また、私の知識不足でAPIやPowerShellなどはまだ理解できていない状況です。

Your answer might help someone💌