Douwe Egberts koffiemanager protocol
Douwe Egberts Koffiemanager is een klein programmaatje voor op het werk dat er voor zorgt dat collega's koffie voor elkaar halen. Het draait op de achtergrond van een PC, verzamelt individuele wensen en wijst aan wie van de collega's aan de beurt is om een rondje te halen. De verschillende installaties communiceren dus met elkaar dus dat maakt het interessant. Ik heb eens even gekeken en het blijkt dat ze gewoon SOAP calls naarelkaar doen. Onderstaande informatie is een beginnetje om je eigen versie te maken met je eigen functionaliteit.
1. DE koffiemanager protocol

In het koffiemanager protocol wordt onderscheid gemaakt tussen de manager van de koffiegroep en de clients. De manager heeft bepaalde privileges binnen de applicatie maar daarnaast is het zijn client die regelmatig op het netwerk kijkt of er clients actief zijn (geworden), geeft ze de gelegenheid zich aan te melden en houdt de verbinding in stand.

2. Server Broadcast

De koffieclient die groepsmanager is, doet ca. 2 keer per minuut met onregelmatige intervallen een broadcast naar het netwerk (255.255.255.255) via UDP port 13473.

De inhoud van deze boodschap is:


<?xml version="1.0"?>
<de-coffee-message>
<header version="1" identifier=".KeepAlive"></header>
<message CreationTime="000B295F0309B99A" FromMaster="1" GroupName="Dantras Development" MemberId="{948F0228-6DAA-43B3-84E3-0C477F11F1B4}"></message>
</de-coffee-message>

De client van de groepsmanager gedraagt zich verder als server.

3. Aanmelden Client

Bij het opstarten van een client laat deze het netwerk weten dat hij er is door via UPD port 13473 naar het netwerk de volgende boodschap te sturen:


<?xml version="1.0"?>
<de-coffee-message>

<header version="1" identifier=".Connect"></header>
<message GroupName="Dantras Development" MemberId="{90DF36B7-4031-42EC-9C31-913ECAC8FD14}" MemberName="Jeroen"></message>
</de-coffee-message>

Dit geeft de server de gelegenheid nu de client te registreren en stuurt ter bevestiging een lege html header middels een POST naar port 13472 naar de client via tcp:


POST /**UnReg**0
Connection: keep-alive
Content-Type: text/html
Content-Length: 560
Host: 20.32.160.185:13472
Accept: text/html, */*
User-Agent: Mozilla/3.0 (compatible; Indy Library)

De client stuurt een acknowledgement terug (alleen ACK bit on in TCP header). Dit is gewoon een leeg packet.

4. Deelnemers

Na deze acknowledge stuurt de server een lijstje met deelnemers van deze groep:


<?xml version="1.0"?>
<de-coffee-message>
<header version="1" identifier=".Members"></header>
<message>
<Members Id="{948F0228-6DAA-43B3-84E3-0C477F11F1B4}" Name="Geert Jan Kruizinga" Address="127.0.0.1"></Members><Members Id="{3F3BE981-B81E-4A6E-92F5-983A9EEFC182}" Name="Robin van der Veen" Address="20.32.160.119"></Members><Members Id="{E0AD6D60-F148-4DAC-BA43-FDE114D604F5}" Name="Fop Kwekel" Address="20.32.160.195"></Members><Members Id="{90DF36B7-4031-42EC-9C31-913ECAC8FD14}" Name="Jeroen" Address="20.32.160.185"></Members>
</message>
</de-coffee-message>

De client bevestigd ontvangst van dit bericht door een http close connectie header te sturen:


HTTP/1**UnReg**
Connection: close
Content-Type: text/plain
Server: Indy/9.00.10

En daarna stuurt de client het ontvangen bericht weer terug (als text/plain):


<?xml **UnReg**1.0"?>
<de-coffee-message>
<header version="1" identifier=".Members"></header>
<message>
<Members Id="{948F0228-6DAA-43B3-84E3-0C477F11F1B4}" Name="Geert Jan Kruizinga" Address="127.0.0.1"></Members><Members Id="{3F3BE981-B81E-4A6E-92F5-983A9EEFC182}" Name="Robin van der Veen" Address="20.32.160.119"></Members><Members Id="{E0AD6D60-F148-4DAC-BA43-FDE114D604F5}" Name="Fop Kwekel" Address="20.32.160.195"></Members><Members Id="{90DF36B7-4031-42EC-9C31-913ECAC8FD14}" Name="Jeroen" Address="20.32.160.185"></Members>
</message>
</de-coffee-message>

5. Settings

De server stuurt met een http POST vervolgens alle instellingen voor de clientapplicatie naar de client:


<?xml **UnReg**1.0"?>
<de-coffee-message>
<header version="1" identifier=".Data"></header>
<message SharedData="
<?xml version="1.0"?>
>de-coffee-settings Group="Dantras Development" GroupId="{66E8AA35-6ABA-4421-80BC-093ACC0F3CA8}" Company="CSC" LastSelectedMember="" SelectMethod="1">
>Moments<>/Moments<
>Flavors>
>Flavor Identifier="22" Name="Cappuccino"></Flavor>
>Flavor Identifier="23" Name="Cappuccino met suiker"></Flavor>
>Flavor Identifier="1" Name="Koffie zwart"></Flavor>
>Flavor Identifier="2" Name="Koffie met melk"></Flavor>
>Flavor Identifier="3" Name="Koffie met suiker"></Flavor>
>Flavor Identifier="5" Name="Koffie met melk en suiker"></Flavor>
>Flavor Identifier="19" Name="Espresso"></Flavor>
>Flavor Identifier="20" Name="Espresso met suiker"></Flavor>
>Flavor Identifier="35" Name="Koud Water"></Flavor>
>Flavor Identifier="7" Name="Pickwick Thee Zwart"></Flavor>
</Flavors>
<Users>
<Users>**F148-4DAC-BA43-FDE114D604F5}" Name="Fop Kwekel" Blocked="0" LastServed="37894.4608536227" LastConnected="37894.5028272917" DrinksConsumed="2" DrinksServed="4"></User>
</Users>
</de-coffee-settings>
</message>
</de-coffee-message>

En met een http close header stuurt de client het hele xml-bericht weer terug. Merk op dat de inhoud van SharedData op zich ook weer een xml message is. Enige escaping van karakters is dan nodig. Deze is hier vertaald vanwege de leesbaarheid.

6. Registratie geaccepteerd

Wanneer er geen fout teruggekomen is maar het gehele bericht stuurt de server middels een http Post een accepted message:


<?xml **UnReg**1.0"?>
<de-coffee-message><header version="1" identifier=".Accepted"></header>
<message AcceptedName="Jeroen" MasterId="{948F0228-6DAA-43B3-84E3-0C477F11F1B4}"></message>
</de-coffee-message>

De client reageert hierop door weer het gehele bericht terug te sturen.

Als laatste stap van het aanmelden worden de .Data en .Members messages weer opnieuw gestuurd en beantwoord.

7. Keep Alive

De server bewaakt de status van de clients. Dit mechanisme werkt als volgt: De server stuurt (http post) de volgende boodschap naar de clients die aangemeld zijn (http post):


<?xml **UnReg**1.0"?>
<de-coffee-message><header version="1" identifier=".KeepAlive"></header>
<message CreationTime="000B295F0309B99A" FromMaster="1" GroupName="Dantras Development" MemberId="{948F0228-6DAA-43B3-84E3-0C477F11F1B4}"></message>
</de-coffee-message>

De clients reageren door dezelfde boodschap weer terug te sturen als result van de post.

De echte alive melding van de client is een post naar de server van:


<?xml **UnReg**1.0"?>
<de-coffee-message><header version="1" identifier=".KeepAliveReply"></header>
<message></message>
</de-coffee-message>

De server geeft als ack dezelfde boodschap weer terug.

Dit verkeer wordt ook vanuit de client geiniteerd, namelijk een KeepAlive verzoek gevolgd door een KeepAliveReply van de server.

8. Scan

De client heeft de mogelijkheid te ontdekken welke koffiegroepen er op het netwerk aanwezig zijn. Dit doet hij door over UPD port 13472 de volgende boodschap naar 255.255.255.255 te broadcasten:


<?xml version="1.0"?>
<de-coffee-message>
<header version="1" identifier=".Scan"></header>
<message></message>
</de-coffee-message>

In het netwerk aanwezige servers reageren hierop door de scannende machine op port 13473 via http post een boodschap te sturen met de koffiegroep die zij staan te servicen:


<?xml **UnReg**1.0"?>
<de-coffee-message>
<header version="1" identifier=".ScanReply"></header>
<message GroupName="Dantras Development"></message>
</de-coffee-message>

9. Naamswijziging

Wijzigingen in de instellingen van de client die van belang zijn voor de gehele groep (drank., naam) worden naar de server gecommuniceerd met een daartoe bestemde tag. Door het data block volgens de .Data message te sturen naar alle aangemelde clients wordt deze wijziging gerepliceerd. Zie hierboven bij settings voor uitleg over .Data..

Voorbeeld van een naamswijziging:

De client stuurt (http post) de volgende boodschap:


<?xml **UnReg**1.0"?>
<de-coffee-message>
<header version="1" identifier=".NameChanged"></header>
<message NewName="Jeroen Oostrijck"></message>
</de-coffee-message>

10. Software

De DE koffeemanager bestaat uit een enkele executable die zich zowel als server als client kan gedragen. Voor ondersteuning van de gebruikte netwerk protocollen wordt gebruik gemaakt van componenten van de Indy library versie 9.0.10. De informatie die uitgewisseld wordt via het hierboven beschreven protocol wordt in de registry opgeslagen. In HKEY_USERS\xx\Software\Douwe Egberts Koffiemanager\2.0 staat alle relevante informatie. De id's die in de applicatie gebruikt worden en via xml worden uitgewisseld staan in HKEY_USERS\xx\Software\Douwe Egberts Koffiemanager\2.0\Settings\Users\User_xxx\.

Disclaimer

Het publiceren van deze informatie is een initiatief van mij en is zeer zeker niet van Douwe Egberts Nederland B.V. De site van Douwe Egberts Nederland B.V. is te vinden op: http://www.de.nl/. Douwe Egberts Nederland B.V. is exclusief rechthebbende op het merk DE enzo. Douwe Egberts Nederland B.V. heeft voor dit merk meerdere registraties verricht, waaronder voor het Douwe Egberts logo dat op deze pagina te zien is.