여러 개체를 동적으로 생성하는 D-BUS 서비스를 어떻게 작성합니까?

StackOverflow https://stackoverflow.com/questions/667760

  •  21-08-2019
  •  | 
  •  

문제

나는 D-BUS (그리고 Python, Double Whammy!)를 처음 접했으며 튜토리얼에서 논의 된 일을하는 가장 좋은 방법을 알아 내려고 노력하고 있습니다.

그러나 텍스트 편집기 애플리케이션은 여러 버스 이름 (예 : 일반 문자 메시지 외에 Org.kde.kwrite)을 쉽게 소유 할 수 있으며 여러 개체가 있습니다 (/org/kde/documents/4352 여기서 문서에 따라 숫자가 변경됩니다. ), 그리고 각 객체는 org.freedesktop.dbus.introspectable, org.freedesktop.basictextfield, org.kde.richtextdocument와 같은 여러 인터페이스를 구현할 수 있습니다.

예를 들어, 래퍼를 만들고 싶다고 말합니다. flickrapi 서비스가 소수의 Flickr API 방법을 노출시킬 수 있도록 urls_lookupGroup()). 서비스가 항상 동일한 API 키를 지정하고 인증 정보가 서비스를 사용하는 모든 사람에게 동일하다고 가정하려면 비교적 간단합니다.

특히 후자의 경우, 이것이 사실이라고 가정 할 수는 없습니다.

위에서 인용 한 문서를 바탕으로 다음과 같은 것이 있어야한다고 가정합니다.

# Get the connection proxy object.
flickrConnectionService = bus.get_object("com.example.FlickrService",
                                         "/Connection")

# Ask the connection object to connect, the return value would be
# maybe something like "/connection/5512" ...
flickrObjectPath = flickrConnectionService.connect("MY_APP_API_KEY",
                                                   "MY_APP_API_SECRET",
                                                   flickrUsername)

# Get the service proxy object.
flickrService = bus.get_object("com.example.FlickrService",
                               flickrObjectPath);

# As the flickr service object to get group information.
groupInfo = flickrService.getFlickrGroupInfo('s3a-belltown')

그래서 내 질문 :

1) 이것이 어떻게 처리해야합니까?

2) 그렇다면 서비스는 클라이언트가 언제 완료되었는지 어떻게 알 수 있습니까? 서비스가 동적으로 생성 된 객체를 정리할 수 있도록 현재 클라이언트가 연결을 끊었는지 감지하는 방법이 있습니까? 또한 처음에 개별 객체를 어떻게 만들겠습니까?

3) 이것이 어떻게 처리되어야하는지 아닌 경우, 비슷한 것을 달성하기위한 다른 제안은 무엇입니까?

나는 여러 D-BUS 튜토리얼과 다양한 문서를 읽었으며 내가 찾고있는 것이 내가 위에서 인용 한 내용을 보는 가장 가까운 것에 대해 읽었습니다. 그러나 예제 중 어느 것도 실제로 이와 같은 일을하는 것으로 보이므로 어떻게 진행 해야할지 잘 모르겠습니다.

도움이 되었습니까?

해결책

1) 대부분 그렇습니다. 2에서 설명하는 것처럼 연결 방법에서 한 가지만 변경합니다.

2) D-BUS 연결은 영구적이지 않으며 모든 것이 요청/응답 메시지로 수행되며, 귀하가 수행하는 것처럼 세 번째 오브젝트에서이를 구현하지 않는 한 연결 상태가 저장되지 않습니다. flickerObject. 파이썬 바인딩의 D- 부스 객체는 대부분 원격 객체를 마치 "연결된"것처럼 추상화하는 프록시이지만 실제로하는 것은 D-BUS 객체 인스턴스화에 제공 한 정보를 기반으로 메시지를 작성하는 것입니다 (개체 경로 , 인터페이스 등). 따라서 클라이언트가 다른 명시 적 호출로 클라이언트를 발표하지 않으면 서비스는 클라이언트가 언제 완료되었는지 알 수 없습니다.

예상치 못한 클라이언트 최종화를 처리하려면 클라이언트에서 D- 부스 객체를 생성하고 연결할 때 객체 경로를 서비스로 보낼 수 있습니다. connect 또한 수락하는 방법 ObjectPath 매개 변수. 서비스는들을 수 있습니다 NameOwnerChanged 고객이 죽었는지 알 수있는 신호.

개별 객체를 만들려면 "/Connection"과 동일한 서비스에서 객체를 인스턴스화하면되지만 존재하지 않는 이름을 사용하고 있는지 확인해야합니다. "/Connection/Manager"및 다양한 "/Connection/1", "/Connection/2"를 가질 수 있습니다.

3) 연결 상태를 저장 해야하는 경우 그런 일을해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top