DBus를 필두로

5565 단어 LinuxPython3Dbus
DBus는 작업 프로세스 간 통신에 사용됩니다.
너무 편리해서 다른 분들도 사용하시기 바랍니다.
간단하게 시작할 수 있도록 샘플 프로그램을 함께 보류하겠습니다.

DBus의 토대


DBus를 이해할 때 이것PDF은 읽기 쉽다.
공식 홈페이지는 좀 어려울 것 같아요.어쨌든 URL을 먼저 업로드합니다.
https://dbus.freedesktop.org/doc/dbus-specification.html
https://dbus.freedesktop.org/doc/dbus-tutorial.html
PDF를 발췌하여 기억을 열거하다.

기억하는 것


그 1

  • System bus
  • On desktop, a single bus for all users
  • Dedicated to system services
  • is about low-level events such as connection to a network, USB devices, etc
  • On embedded Linux system, this bus is often the only D-Bus type
  • Session bus
  • On instance per user session
  • Provide desktop services to user applications
  • 시스템 버스는 시스템에 하나의 버스가 존재하는데, 모든 사용자가 접근할 수 있으며, 마치 시스템 운행에 사용되는 것 같다.
    세션 버스는 각 사용자마다 버스가 있으며 해당 사용자만 사용합니다.

    두 번째

  • Service
  • An application can expose its servcies to all D-Bus users by registering to a bus instance
  • A service is a collection of objects providing a specific set of features
  • When an application opens a connection to a bus instance, it is assigned a unique name (ie :1.40 )
  • Can request a more human-readable service name: the well-known name (ie org.ofono )
  • Object
  • Are attached to one service
  • Can be dynamically created or removed
  • Are uniquely identified by an object path (ie / or /net/conman/technology/cellular )
  • Implement one or several interfaces
  • Interface
  • Can be compared to a "namespace"in Java
  • Has a unique name resembling Java interface names, using dots (ie org.ofono.manager )
  • Contains members: properties , methods and signals

  • DBus는 끝점까지 URI를 지정하는 데 Service・Object・Interface를 사용합니다.
    우선qdbusviewer을 사용하여 기존의 참조를 참조하십시오.
    # 僕の環境
    $ cat /etc/os-release
    PRETTY_NAME="Debian GNU/Linux buster/sid" 
    $ sudo apt install qtbase qdbusviewer
    

    이미지는 로 해석할 수 있습니다.
    section
    address
    service
    org.freedesktop.systemd1
    object
    org/feredesktop/systemd1
    interface
    org.freedesktop.DBus.Peer
    서비스와 인터페이스는 "구분자
    object는 "/"로 구분됩니다.
    또한, 습관성(´63;)구문을 사용합니다.(freedesktop.org → org.freedesktop)

    셋째

  • Properties(이번에는 사용하지 않으므로 생략)
  • Directly accessible fields
  • Can be read/written
  • Can be of different types defined bythe D-Bus specification: (할애)
  • Very convenient standard interface: org.freedesktop.DBus.Properties
  • Type are represented by characters: (할애)
  • Methods
  • allow remote procedure calls from one process to another
  • Can be passed one or several parameters
  • Can return values/objects
  • Look like any method you could know from other languages
  • Signals
  • Messages/notifications
  • Unidirectional
  • Sent to every clients that are listening to it
  • A client will subscribe to signals to get notifications
  • Policy(이번에는 사용하지 않아서 생략)
  • Methods를 사용하여 Client->Server를 호출합니다.
    대신 Signals를 사용하여 Server->Celient를 호출합니다.
    다만, Signal은 비동기적인 Observer 모드를 알립니다.
    메트로드는 동기화 처리이기 때문에 너무 무거운 처리를 하지 말고 signal로 되돌려줍니다.
    (내가 봤는데 출처를 잊어버렸어...)
    이전에 DBus는 각각 Method와 Signal로 인식되는 동기식 및 비동기식 호출이 있었다
    완전히 다르다.

    Python 3의 DBus 라이브러리 사용 예제


    이 장에서는 dbus-python v1.2.8를 사용하여 Server 및 Celient 생성
    Method 및 Signal을 건너뛰는 데 사용되는 코드를 유지합니다.
    그나저나 코드는 왜 남겼지?이렇게 되면 API 사용법을 이해하기 어렵다.파이톤이 힘이 부족해서 그런가?
    코드는gist입니다.
    https://gist.github.com/yuu/c25e95eef7d6ff3fe9f80b14c6b06911

    server side

    @dbus.service.method@dbus.service.signal만 장식하면 된다.methodlistener에 로그인하면client에서 호출할 수 있습니다.signalpublish에 로그인하면client는subscribe를 호출하여 함수나 방법을 호출하여 발송할 수 있습니다.

    client side

    methodbus.get_object(service, obj)시proxy 대상을 생성하고 방법도 자동으로 생성됩니다.signal에handler를 bus.add_signal_receiver(..)에 등록합니다.

    총결산

  • 특별한 이유가 없으면 socket에서 DBus를 사용하지 않습니까
  • 장식물은 정말 편해요. (그런데 너무 힘들어서 설명도 너무 잘 어울려요)
  • 작업 중 서버 측은 C++에 설치되어 있으며 XMLdbusxx-xml2cpp에서 원본 코드를 생성했습니다.
    XML에서 생성되기 때문에 파이톤과 달리 편차가 없습니다.
  • 좋은 웹페이지 즐겨찾기