BlueZ에서 GATT 서버의 객체 경로 찾기

BlueZ에서 GATT 서버의 객체 경로 찾기

BlueZ를 사용하여 Linux 시스템에서 Bluetooth GATT 서버를 만드십시오. 최신(5.50) BlueZ를 사용하는 가장 좋은 방법은 dbus API를 사용하는 것입니다.

이것문서이 주제에 대해서는 다음과 같이 명시되어 있습니다.

GATT 로컬 및 원격 서비스는 동일한 고급 D-Bus API를 공유합니다. 로컬은 BlueZ 플러그인 또는 외부 애플리케이션에서 내보낸 GATT 기반 서비스를 나타냅니다. 원격은 피어가 내보낸 GATT 서비스를 나타냅니다.

나는 이것을 다음과 같이 해석합니다.

둘 다지역 서비스(Linux 시스템은 서버이고 다른 장치는 블루투스를 통해 연결됩니다)원격 서비스(Linux 시스템은 클라이언트이며 블루투스를 통해 다른 장치에 연결됩니다.) dbus로 표현됨

이는 문제의 기본 가정을 설정합니다.

bluez 소스 코드는예시 gatt 서버. 예제를 구현하면 제대로 작동하고 Linux 시스템을 GATT 서버에 넣을 수 있습니다.

그 예에서는임의로 이름이 지정된 dbus 객체인용하십시오. 그것의 이름은/org/bluez/example/service

문서를 보면 ./example-gatt-server성공적으로 실행되면 이를 위한 공간이 있을 것으로 예상했습니다 /org/bluez/example/service.

그러나 실제로는 그렇지 않습니다.

~$ busctl tree org.bluez
└─/org
  └─/org/bluez
    └─/org/bluez/hci0

Linux 컴퓨터가 GATT 서버 역할을 하는지 확인하기 위해 외부 장치를 사용하고 있는데 /org/bluez/example/service목록에 없습니다.

/org/bluez/example/service에서 개체를 찾을 수 없는 이유는 무엇입니까 org.bluez?

답변1

나도 이것에 대해 혼란스러워요. 이 예제에는 서비스에 대해 dbus에 정의된 잘 알려지거나 요청된 이름이 없기 때문에 dbus 개체를 볼 수 없다는 것을 알았습니다.

~에 따르면버스 제어 문서서비스를 쿼리하려면 서비스와 연결된 이름이 있어야 합니다. 이 예제 Gatt 서버는 그렇지 않습니다.

하나 이상의 서비스에 대한 개체 트리를 표시합니다. SERVICE를 지정하면 지정된 서비스에 대한 개체 트리만 표시됩니다. 그렇지 않으면 잘 알려진 이름이 하나 이상 있는 버스의 모든 서비스에 대한 모든 개체 트리를 표시합니다.

sudo dbus-monitor --system을 사용하여 등록되는 객체를 모니터링할 수 있지만 gatt 서버 샘플 코드에서 애플리케이션 객체를 생성하기 전에 버스에서 request_name을 호출하여 dbus에서 이름을 요청할 수도 있습니다. 요청명으로 샘플 서비스를 확인하실 수 있습니다.여기.

bus.request_name(BUS_NAME)
named_bus = dbus.service.BusName(BUS_NAME, bus=bus)

또한 /etc/dbus-1/system.conf를 편집하여 시스템 버스 게시 권한을 부여하고 다음과 같이 서비스 이름을 추가해야 합니다.

<policy user="root">
  <allow own="com.example.gattServer"/>
</policy>

관련 정보