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 플래그를 사용하여 블루투스를 실행하고 있다고 생각했을 때 변경 사항을 저장하지 않았나 봐요. 실험적 기능을 사용하여 데몬을 시작하려면 다음을 수행하세요.

  1. 시작 명령에 --experimental 또는 -E를 포함하도록 .service 파일을 편집합니다.
  2. systemctl 데몬 다시 로드
  3. systemctl 블루투스 다시 시작

다음으로 데몬이 올바른 플래그로 실행되고 있는지 확인하세요.

systemctl 상태 블루투스

그런 다음 획득-쓰기 또는 획득-알림을 사용하려고 하면 새로운 오류 메시지가 나타나고 데몬이 충돌하는 것처럼 보입니다.

[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...

또한 두 가지 SELinux 문제가 감지되었음을 알리는 팝업도 받았습니다.

SELinux 문제 쓰기 획득

문제 해결 단계에서는 요청된 권한을 활성화하는 명령을 제공합니다.

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

블루투스 서비스를 다시 시작한 후 파일 읽기/쓰기 설명자를 성공적으로 가져올 수 있습니다.

[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

관련 정보