Hoppa till innehållet

D-Bus

Från Wikipedia

D-Bus är ett system för IPC-kommunikation. Användningsområdet är främst kommunikation mellan två applikationer samt mellan operativsystemet och vissa applikationer som behöver vara ett gränssnitt mellan hårdvaruhändelser och användaren. Systemet är relativt nytt och används oftast på Linux- och UNIX-system, mest beroende på att de stora skrivbordssystemen GNOME och KDE valt att använda D-Bus som sitt IPC-system.

Tanken är att D-Bus ska användas för att åstadkomma en ökad integration mellan applikationer och operativsystemet. Ett exempel är om användaren kopplar in en USB-enhet så kan ett meddelande skickas via D-Bus. Intresserade applikationer kan då hantera meddelandet på olika sätt. För att få sådana meddelanden så behöver applikationer registrera vilka typer av meddelanden de är intresserade av.

Protokollet för D-Bus är designat för att hålla låga fördröjningar, låg overhead och försöker minimera antalet anrop. Data överförs binärt och optimeras för att passa den lokala datorn. Alla meddelanden skickas i den lokala datorns lagringsformat (byte-ordning) och alla meddelanden vet vilket format som används. Meddelanden kan därför läsas även om det skickas till en dator med en annan byte-ordning än ursprungsdatorn.

D-Bus systemet använder flera bussar för kommunikation, där systembussen startar vid uppstart av datorn. Varje användare får sedan en privat sessionsbuss vid inloggning.

Här följer en beskrivning av hur objekt hanteras av D-Bus.

Objekt och sökvägar

[redigera | redigera wikitext]

D-Bus använder objektsökvägar för att identifiera olika objekt. Ett objekt kan till exempel ha sökvägen "/org/texteditor/document/2/line/431".

Alla objekt består av två delar, metoder och signaler. En signal används för att representera händelser medan metoder används för anrop från en klient. Signaler skickas från objektet till de applikationer som har registrerat sig som mottagare av den aktuella signalen. Metoder är operationer som kan utföras av objektet. Metoder kan använda både inparametrar och utparametrar, medan signaler bara kan överföra data till de registrerade mottagarna.

Varje objekt implementerar minst ett interface som identifieras av ett namn. "org.freedesktop.Introspectable" kan vara ett exempel på ett interface.

I D-Bus finns fyra olika typer av meddelanden.

  • Meddelande för anrop av metoder
  • Meddelande för returvärden efter ett metodanrop
  • Meddelande för fel som uppstått vid ett metodanrop
  • Meddelande för signaler

Alla meddelanden som skickas får ett unikt idnummer och de skickas i den ordning som klienten gör anropen. Svaren kan däremot komma i en annan ordning än klienten anrop och klienten måste därför kontrollera idnumret för varje svarsmeddelande.

Ett meddelande innehåller en header som består av fält, samt en datadel som består av argument. Headern används som adress för meddelandet medan datadelen innehåller informationen som ska överföras.

Dataöverföring

[redigera | redigera wikitext]

Data överförs binärt och till varje överfört värde finns en datatyp angiven. Datatypen anges med ett ASCII-värde. Ett 32-bitars heltalsvärde(INT32) anges med strängen "i". Om meddelandet innehåller två stycken 32-bitars heltal anges "ii".

Definierade typer

[redigera | redigera wikitext]
TypIdBeskrivning
BYTEy8-bit unsigned integer
BOOLEANbSant=1/Falskt=0, övriga värden felaktiga
INT16n16-bitars heltal, kan anta negativa värden
UINT16q16-bitars heltal, endast positiva värden
INT32i32-bitars heltal, kan anta negativa värden
UINT32u32-bitars heltal, endast positiva värden
INT64x64-bitars heltal, kan anta negativa värden
UINT64t64-bitars heltal, endast positiva värden
DOUBLEdFlyttal enligt IEEE754
STRINGsUTF-8 sträng
OBJECT_PATHoNamn på en objektinstans
SIGNATUREgTypsignatur
ARRAYaArray
STRUCTr '(' ')'Strukturdefinition
VARIANTvVarianttyp
DICT_ENTRYe '{' '}'Del i en array av nyckel/värde par.

Varje datatyp har en definition för hur värdet ska skickas. Headern för meddelandet har datatypen yyyyuua(yv) och innehåller alltså:

yyyy4 st byte
uu2 st 32-bitars positiva heltal
a(yv)en lista där varje element är en struktur med ett bytevärde och en variant.

Definitionen av dessa värden är som följer:

VärdeBeskrivning
BYTE 1Lagringsformat (l = little-endian, B = big-endian).
BYTE 2Meddelandetyp
BYTE 3Flaggor
BYTE 4Protokollversion
UINT32 1Storlek på meddelandet efter headern.
UINT32 2Unikt idnummer för meddelandet
ARRAYLista med fält. Bytevärdet innehåller datatypen för data som lagras i variant-värdet.