bluetoothctlで取得-書き込みと取得-通知を使用してBluetooth低電力機能BLEを実装する

bluetoothctlで取得-書き込みと取得-通知を使用してBluetooth低電力機能BLEを実装する

最近BlueZ 5.46 リリース「アプリケーションがGATT署名からデータを読み書きするための個人ファイル記述子を取得できるようにする」という新機能があります。 bluetoothctlコマンドのヘルプを見ると、新機能を使用してこれが可能になるようです。書くまたは通知を受け取るコマンドを実行しましたが、これまでは機能しません。 bluez.x86_64バージョン5.46-1.fc26(bluetoothdサービスの--experimentalフラグを使用)を使用してFedora 26をHM-10 Bluetooth Low Energyモジュールに接続する例:

bluetoothctl -v
5.46
sudo bluetoothctl
[bluetooth]# scan on
Discovery started
[CHG] Controller 28:B2:BD:07:04:49 Discovering: yes
[NEW] Device D4:36:39:DE:61:6B KeyDuino
[bluetooth]# scan off
[bluetooth]# connect D4:36:39:DE:61:6B
Attempting to connect to D4:36:39:DE:61:6B
[CHG] Device D4:36:39:DE:61:6B Connected: yes
...
[KeyDuino]# select-attribute 0000ffe1-0000-1000-8000-00805f9b34fb
[KeyDuino:/service0010/char0011]# acquire-write
Failed to acquire write: org.freedesktop.DBus.Error.UnknownMethod
[KeyDuino:/service0010/char0011]# acquire-notify
Failed to acquire notify: org.freedesktop.DBus.Error.UnknownMethod

受け取っています。書き込みできません: org.freedesktop.DBus.Error.UnknownMethod新しいコマンドを使用しようとすると、エラーメッセージが表示されます。 BLE機能のファイル記述子を取得するには?

そうしないと、通知と書き込みコマンドを使用して接続が機能する可能性があります。

[KeyDuino:/service0010/char0011]# notify on
[CHG] Attribute /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010/char0011 Notifying: yes
Notify started
[CHG] Attribute /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010/char0011 Value: 0x33
[CHG] Attribute /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010/char0011 Value: 0x32
[CHG] Attribute /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010/char0011 Value: 0x31
[KeyDuino:/service0010/char0011]# write 0x30 0x31 0x32
Attempting to write /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010/char0011

答え1

うーん...それで、--experimentalフラグを使用してBluetoothを実行していると思ったときに変更を保存していないようです。実験的機能を使用してデーモンを起動するには:

  1. 起動コマンドに--experimentalまたは-Eを含めるように.serviceファイルを編集します。
  2. systemctlデーモンの再ロード
  3. systemctl Bluetoothの再起動

次に、デーモンが正しいフラグで実行されていることを確認してください。

systemctl ステータス Bluetooth

その後、取得 - 書き込みまたは取得 - 通知を使用しようとすると、新しいエラーメッセージが表示され、デーモンがクラッシュしているように見えます。

[KeyDuino:/service0010/char0011]# acquire-write
Agent unregistered
[DEL] Controller 28:B2:BD:07:04:49 GBFedora01 [default]
[DEL] Primary Service0/char0011]# 
    /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service000c
    00001801-0000-1000-8000-00805f9b34fb
    Generic Attribute Profile
[DEL] Characteristic
    /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service000c/char000d
    00002a05-0000-1000-8000-00805f9b34fb
    Service Changed
[DEL] Descriptor
    /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service000c/char000d/desc000f
    00002902-0000-1000-8000-00805f9b34fb
    Client Characteristic Configuration
[DEL] Primary Service
    /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010
    0000ffe0-0000-1000-8000-00805f9b34fb
    Unknown
[DEL] Characteristic
    /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010/char0011
    0000ffe1-0000-1000-8000-00805f9b34fb
    Unknown
[DEL] Descriptor
    /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010/char0011/desc0013
    00002902-0000-1000-8000-00805f9b34fb
    Client Characteristic Configuration
[DEL] Descriptor
    /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010/char0011/desc0014
    00002901-0000-1000-8000-00805f9b34fb
    Characteristic User Description
Failed to acquire write: org.freedesktop.DBus.Error.NoReply
Waiting to connect to bluetoothd...

また、2つのSELinux問題が検出されたことを知らせるポップアップも受け取りました。

SELinuxの問題書き込みを取得

トラブルシューティング手順は、要求された権限を有効にするコマンドを提供します。

ausearch -c 'dbus-daemon' --raw | audit2allow -M my-dbusdaemon
semodule -X 300 -i my-dbusdaemon.pp

Bluetoothサービスを再起動した後、ファイルの読み取り/書き込み記述子を正常にインポートできます。

[KeyDuino:/service0010/char0011]# acquire-write
[CHG] Attribute /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010/char0011 WriteAcquired: yes
AcquireWrite success: fd 7 MTU 23
[KeyDuino:/service0010/char0011]# acquire-notify
[CHG] Attribute /org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010/char0011 NotifyAcquired: yes
AcquireNotify success: fd 8 MTU 23

その後、bluetoothctlの/proc/(pid)/fd/フォルダにこれらのファイル記述子を見つけることができます。

#Use cat to read output
sudo cat /proc/$(pgrep bluetoothctl)/fd/8
#In another root shell use cat to write to BLE characteristic
sudo -sE
cat > /proc/$(pgrep bluetoothctl)/fd/7

関連情報