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.

Objekt redigera

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

Objekt och sökvägar redigera

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.

Interface redigera

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

Meddelanden redigera

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.

Innehåll redigera

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

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

Typ Id Beskrivning
BYTE y 8-bit unsigned integer
BOOLEAN b Sant=1/Falskt=0, övriga värden felaktiga
INT16 n 16-bitars heltal, kan anta negativa värden
UINT16 q 16-bitars heltal, endast positiva värden
INT32 i 32-bitars heltal, kan anta negativa värden
UINT32 u 32-bitars heltal, endast positiva värden
INT64 x 64-bitars heltal, kan anta negativa värden
UINT64 t 64-bitars heltal, endast positiva värden
DOUBLE d Flyttal enligt IEEE754
STRING s UTF-8 sträng
OBJECT_PATH o Namn på en objektinstans
SIGNATURE g Typsignatur
ARRAY a Array
STRUCT r '(' ')' Strukturdefinition
VARIANT v Varianttyp
DICT_ENTRY e '{' '}' 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å:

yyyy 4 st byte
uu 2 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ärde Beskrivning
BYTE 1 Lagringsformat (l = little-endian, B = big-endian).
BYTE 2 Meddelandetyp
BYTE 3 Flaggor
BYTE 4 Protokollversion
UINT32 1 Storlek på meddelandet efter headern.
UINT32 2 Unikt idnummer för meddelandet
ARRAY Lista med fält. Bytevärdet innehåller datatypen för data som lagras i variant-värdet.

Referenser redigera