最近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を実行していると思ったときに変更を保存していないようです。実験的機能を使用してデーモンを起動するには:
- 起動コマンドに--experimentalまたは-Eを含めるように.serviceファイルを編集します。
- systemctlデーモンの再ロード
- 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問題が検出されたことを知らせるポップアップも受け取りました。
トラブルシューティング手順は、要求された権限を有効にするコマンドを提供します。
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