SpaceAnnounce
Project: Space Announce | |
---|---|
Status | voltooid |
Betrokkenen | |
Kennisgebied(en) | Python
|
Afgeleid van: | PlainTLV, Deurbel |
Projectoverzicht – Project 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.
Contents
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 eenunsigned int8
. Wanneer een veld langer is dan 127 bytes, heeft hetLength
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 hetLength
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
- Announce
- Version
- Domain
- Message
- Nul of meer #PythonTypes
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.