Modificando os parâmetros de varredura do bluetooth via btmgmt

1

Estou digitalizando anúncios ble beacon que modificam dinamicamente sua carga útil. Portanto, quero ter a certeza de perder o menor número de anúncios possível.

Atualmente monitoro a saída da varredura via bluetoothctl e wireshark. Meu beacon está transmitindo a cada 10 segundos, 2 mensagens em cada um dos 3 canais.

O objetivo é capturar as duas mensagens pelo menos uma vez em um dos canais.

Atualmente, enfrento lacunas de até 20 ou 30 segundos sem receber nada com êxito.

O que eu faço:

bluetoouthctl, transformando "scan on"

wireshark, escutando no bluetooth respectivo dispositivo bluetooth

Percebi o seguinte comportamento depois de pesquisar "btmgmt":

hci1 type 7 discovering on
hci1 type 7 discovering off
hci1 type 7 discovering on
hci1 type 7 discovering off
hci1 type 7 discovering on
hci1 type 7 discovering off
hci1 type 7 discovering on
[mgmt]# 

Eu não mudei nada no intervalo ou janela de verificação. Parece que a descoberta é ativada e desativada da seguinte maneira: 10 segundos em 5 segundos.

Isso significa que há sempre um período de tempo de 5 segundos em que sou basicamente cego.

Alguma ideia de como eu poderia mudar esse comportamento?

Melhor,

    
por Hias 31.01.2018 / 15:41

1 resposta

0

Os utilitários do Bluez estão usando a interface do kernel MGMT (não HCI) e essa interface é simples, implementa alguma lógica sob o capô e não pode fornecer a mesma funcionalidade que o HCI (ou seja, não pode executar varredura passiva contínua).

A varredura (descoberta) iniciada usando a interface do kernel MGMT funciona apenas por 10s (definida no módulo do kernel do bluetooth). Em seguida, o Bluez é informado sobre o final da varredura e o Bluez reinicia a varredura (imediatamente, se os filtros de descoberta estiverem configurados, ou após 5 segundos, de outra forma)

Soluções:

  • use a interface HCI (o comando hcitool lescan funciona bem - use o código fonte como referência ou encontre bibliotecas prontas)
  • modifique o módulo do kernel do bluetooth, defina qualquer discoveryFilter usando o Bluez (por exemplo, RSSI -127).
por 20.09.2018 / 11:36