Personal tools

SpaceAnnounce

From Frack - Hackerspace Friesland

Jump to: navigation, search
Project: Space Announce
NoProjectPicture.jpg
Status voltooid
Betrokkenen
Kennisgebied(en) Python
Afgeleid van: PlainTLV, Deurbel
ProjectoverzichtProject toevoegen

Via het netwerk aankondigingen te doen van gebeurtenissen in de space. Bijvoorbeeld het openen/sluiten van de space, en het gaan van de deurbel.

Doel

SpaceAnnounce is een protocolspecificatie (en Python implementatie) om aankondigingen van gebeurtenissen in de space te doen. Hierbij valt te denken aan zaken als de verandering van space status en de deurbel. . SpaceAnnounce heeft ten doen een algemeen protocol te zijn om een breed scala aan aankondigingen te kunnen doen, en niet gelimiteerd te zijn tot de huidige voorziene doelen.

Protocol

Transmissie

SpaceAnnounce zal verstuurd worden als UDP broadcast op poort 50005. De redenen hiervoor zijn simpel:

  • TCP staat geen broadcast transmissie toe (en we willen iedereen die luistert op het netwerk bereiken)
  • UDP is goed te ontvangen op een breed scala platformen (significant eenvoudiger dan rauw Ethernet)
  • Poort 50005 is niet geregistreerd (alles boven 49152 is vrij te gebruiken) en makkelijk te onthouden

Een SpaceAnnounce bericht dient uit slechts 1 UDP pakket te bestaan. Het verdient aanbevelen om de pakketgrootte onder de 512 bytes te houden (IPv4 garandeerd een minimale pakketgrootte van 576 bytes, minus 64 bytes UDP header).

Inhoudsbeschrijving

De uitvoering van het protocol wordt gedaan in Type Length Value codering.

  • We definieren hier een eigen set Types.
  • De Length wordt altijd uitgedrukt in bytes en is een unsigned int8. Wanneer een veld langer is dan 127 bytes, heeft het Length veld de waarde van het aantal bytes nodig om te lengte uit te drukken + 128. Een veld met lengte "512" wordt dan beschreven door de bytes [x82] [x02] [x00].
  • Het Value veld bevat het aantal bytes zoals beschreven in het Length veld. Er zijn geen eindmarkeringen of escape-karakters; deze zijn niet nodig.

Endianness

Zoals alle netwerktransmissieprotocollen is SpaceAnnounce Big endian.

AnounceProxy

Om ervoor te zorgen dat meerdere programma's tegelijk gebruik kunnen maken van de SpaceAnnounce messages is er een proxy geschreven. Deze proxy luistert op UDP poort 50005 naar het SpaceAnnounce protocol en stuurt alle messages die deze ontvangt 1 op 1 door naar alle clients die geconnect zijn op TCP poort 50505. De proxy gebruiken is een kwestie van het wijzigen van de code: Vervang transponder.Receiver() met transponder.ProxyReceiver().

De proxy is momenteel nog een "extern" script maar zal ter zijner tijd in de SpaceAnnounce library opgenomen worden.

SpaceAnnounce berichtformaat

Versie 1

Versie 2

SpaceAnnounce Types

Announce

TypeCode: [x01]

Het volledige SpaceAnnounce bericht wordt verpakt in dit type. De lengte van het pakket geeft de grootte van de inhoud (in bytes) aan. Op deze wijze is voor de ontvanger eenvoudig vast te stellen of het bericht geheel is aangekomen; als er minder bytes gelezen kunnen worden dan het Length veld aangeeft, is het bericht niet te verwerken.

Version

TypeCode: [x02]

Dit veld bevat de versie van het SpaceAnnounce protocol. De waarde is een unsigned int8

Domain

TypeCode: [x03]

Geeft aan voor welke gebruiker(s) dit bericht is. Dit biedt een mogelijkheid om berichten voor verschillende doeleinden uit elkaar te houden, maar ook om binnen het SpaceAnnounce protocol een grote hoeveelheid onafhankelijke gebruikers op hetzelfde netwerk te faciliteren.

De lengte van dit veld is altijd 2 bytes, beiden unsigned int8. Het eerste byte is het globale domein (lees: hackerspace), het tweede is een subdomein binnen het gekozen domein.

Geregistreerde domeinen

domein space subdomein gebruik
[x00] Frack [x00] Space status
[x01] Deurbel
[x02] Alarm

Alle domeinen in het bereik [x80] - [xFF] zijn vrij te gebruiken.
Alle domeinen zijn subdomeinen in het bereik [xC0] - [xFF] zijn vrij te gebruiken (voor gebruikers van het hoofddomein).

Message

TypeCode: [x04]

Een samengesteld veld met de waarden die door de specifieke gebruikers verwacht worden. Dit kan een enkel getal bevatten, of een reeks aan strings. Voor deze data-typen moeten nog codes en specificaties bepaald worden.