D-Bus
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 | redigera wikitext]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.
Interface
[redigera | redigera wikitext]Varje objekt implementerar minst ett interface som identifieras av ett namn. "org.freedesktop.Introspectable" kan vara ett exempel på ett interface.
Meddelanden
[redigera | redigera wikitext]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 | redigera wikitext]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]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 | redigera wikitext]- D-Bus specifikation http://dbus.freedesktop.org/doc/dbus-specification.html
- Connect desktop apps using D-BUS http://www-128.ibm.com/developerworks/linux/library/l-dbus.html
- D-Bus tutorial http://dbus.freedesktop.org/doc/dbus-tutorial.html