Usando o acquire-write e acquire-notify no bluetoothctl para Bluetooth Low Energe característico BLE

1

A recente versão BlueZ 5.46 tem um novo recurso para "permitir que um aplicativo receba uma descritor de arquivo dedicado para ler / gravar dados de / para uma característica do GATT ". Olhando para a ajuda do comando bluetoothctl, parece que isso deve funcionar usando os novos comandos acquire-write ou acquire-notify , mas até agora não consigo fazer com que eles funcionem . Um exemplo tentando conectar o Fedora 26 com a bluez.x86_64 versão 5.46-1.fc26 com a sinalização --experimental no serviço bluetoothd para um módulo 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

Continuo recebendo a mensagem de erro Falha ao obter a gravação: org.freedesktop.DBus.Error.UnknownMethod quando tento usar os novos comandos. Como posso obter um descritor de arquivo para uma característica BLE?

A conexão está funcionando usando os comandos notificar e escrever:

[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
    
por Greg Bray 14.09.2017 / 01:31

1 resposta

2

Hmm ... então, embora eu achasse que estava rodando o bluetoothd com a sinalização --experimental, eu não devo ter salvo as alterações. Para iniciar o daemon com recursos experimentais:

  1. Edite o arquivo .service para incluir --experimental ou -E no comando de inicialização
  2. daemon-reload do systemctl
  3. systemctl reiniciar o bluetooth

Em seguida, verifique se o daemon está sendo executado com os sinalizadores corretos:

Então,quandotenteiusarocomandoacquire-writeouacquire-notify,recebiumanovamensagemdeerroeodaemonpareceutravar:

[KeyDuino:/service0010/char0011]#acquire-writeAgentunregistered[DEL]Controller28:B2:BD:07:04:49GBFedora01[default][DEL]PrimaryService0/char0011]#/org/bluez/hci0/dev_D4_36_39_DE_61_6B/service000c00001801-0000-1000-8000-00805f9b34fbGenericAttributeProfile[DEL]Characteristic/org/bluez/hci0/dev_D4_36_39_DE_61_6B/service000c/char000d00002a05-0000-1000-8000-00805f9b34fbServiceChanged[DEL]Descriptor/org/bluez/hci0/dev_D4_36_39_DE_61_6B/service000c/char000d/desc000f00002902-0000-1000-8000-00805f9b34fbClientCharacteristicConfiguration[DEL]PrimaryService/org/bluez/hci0/dev_D4_36_39_DE_61_6B/service00100000ffe0-0000-1000-8000-00805f9b34fbUnknown[DEL]Characteristic/org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010/char00110000ffe1-0000-1000-8000-00805f9b34fbUnknown[DEL]Descriptor/org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010/char0011/desc001300002902-0000-1000-8000-00805f9b34fbClientCharacteristicConfiguration[DEL]Descriptor/org/bluez/hci0/dev_D4_36_39_DE_61_6B/service0010/char0011/desc001400002901-0000-1000-8000-00805f9b34fbCharacteristicUserDescriptionFailedtoacquirewrite:org.freedesktop.DBus.Error.NoReplyWaitingtoconnecttobluetoothd...

Eutambémtenhoumpop-upindicandoqueforamdetectadosdoisproblemasdoSELinux:

A etapa de solução de problemas forneceu comandos para ativar as permissões solicitadas:

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

depois de reiniciar o serviço bluetooth, posso adquirir com êxito os descritores de leitura / gravação de arquivos:

[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

Você pode então encontrar estes descritores de arquivos na pasta / proc / (pid) / fd / para o bluetoothctl.

#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
    
por 14.09.2017 / 02:18