A criação de um servidor Bluetooth GATT em uma máquina Linux é feita usando BlueZ. A maneira preferida de usar o BlueZ moderno (5.50) é por meio da API dbus.
A documentação sobre este tópico afirma:
Os serviços GATT locais e remotos compartilham a mesma API D-Bus de alto nível. Local refere-se ao serviço baseado em GATT exportado por um plugin BlueZ ou um aplicativo externo. Remoto refere-se a serviços GATT exportados pelo peer.
Estou interpretando isso como:
Ambos os serviços locais (máquina Linux é o servidor, outros dispositivos se conectam a ele via Bluetooth) e serviços remotos (máquina Linux é o cliente, ela se conecta a outros dispositivos via Bluetooth) são representados no dbus
Isso define a suposição básica para a pergunta.
O código-fonte bluez fornece um example-gatt-server . Um exemplo, você pode executar e simplesmente funcionar e transformar sua máquina Linux em um servidor GATT.
Nesse exemplo, um objeto dbus nomeado arbitrariamente é referenciado. Seu nome é/org/bluez/example/service
A partir da documentação, eu esperaria que, uma vez ./example-gatt-server
executado com sucesso, houvesse um /org/bluez/example/service
em algum lugar.
Esse não é o caso:
~$ busctl tree org.bluez
└─/org
└─/org/bluez
└─/org/bluez/hci0
Estou confirmando com um dispositivo externo que a máquina Linux está atuando como servidor GATT, mas /org/bluez/example/service
não está listada.
Por que não é /org/bluez/example/service
encontrado como um objeto em org.bluez
?
Eu também estava ficando intrigado com isso e descobri que não podemos ver o objeto dbus, pois este exemplo não define um nome conhecido/solicitado para este serviço no dbus.
De acordo com a documentação do busctl para poder consultar o serviço, você precisaria ter um nome associado a ele. Embora este exemplo de servidor Gatt não tenha um.
Embora você possa usar sudo dbus-monitor --system para monitorar o objeto que está sendo registrado ou pode solicitar um nome de dbus chamando request_name no barramento antes de criar o objeto Application no código de exemplo do servidor gatt. Você pode verificar um exemplo de serviço com um nome solicitado aqui .
Você também precisa dar permissão no barramento do sistema para publicação editando /etc/dbus-1/system.conf e adicionar o nome do seu serviço da seguinte forma: