NFC Data Exchange Format
NFC Data Exchange Format (NDEF) definuje formát zapouzdření zpráv pro výměnu informací mezi zařízeními respektujícími doporučení NFC fóra, tj. mezi dvěma aktivními NFC zařízeními, nebo aktivním zařízením a zařízením pasivním (tagem). Jedná se o binární formát zpráv, který může být použit k zapouzdření libovolných dat aplikačních protokolů do jedné zprávy.
Cílem specifikace NDEF je definovat strukturu dat a pravidla ke konstrukci validních NDEF zpráv. Mimoto také definuje typy aplikačních dat zapouzdřených v NDEF zprávách. Tato specifikace předpokládá na nižších vrstvách existenci spolehlivého transportního protokolu, jelikož záměrem této specifikace není způsob výměny zpráv mezi NFC zařízeními, což řeší právě specifikace NFCIP-1.
Návrh NDEF počítá s efektivním a jednoduchým formátem zpráv, který by poskytoval následující:
- Zapouzdření libovolných dat, čímž mohou být libovolné dokumenty, šifrovaná data, XML data, obrazová data jako GIF, JPEG, ...
- Zapouzdření dat o neznámé, libovolné velikosti. Tato schopnost může být užita především k dynamickému generování obsahu o velké velikosti rozdělených do několika bloků.
- Sloučení několika typů dat, které spolu logicky souvisí (např. při zasílání během jednoho přenosu), do jedné zprávy.
- Slučování malých bloků dat do jedné zprávy by nemělo zvyšovat složitost parseru.
Struktura zpráv
NDEF zpráva
NDEF zpráva je realizována pomocí jednoho nebo více NDEF záznamů. První záznam je označem příznakem MB (Message Begin - počátek zprávy) a poslední záznam zprávy je označen příznakem ME (Message End - konec zprávy). Minimální velikosti zprávy dosáhneme nastavením obou příznaku na stejný záznam. Maximální počet záznamů ve zprávě není omezen.
NDEF záznam
Každý NDEF záznam, nesoucí data nějakého aplikačního protokolu, je identifikován typem, délkou a volitelným identifikátorem.
- Payload length vždy reprezentuje velikost dat zapouzdřených v relevantním NDEF záznamu. Je definován polem PAYLOAD_LENGTH o velikosti jednoho bytu pro krátké záznamy a o velikosti 4 byty pro normální záznamy. Krátké záznamy jsou indikovány pomocí SR bitu nastaveného na hodnotu 1.
- Payload type identifikuje typ přenášených dat (payload) v daném NDEF záznamu. Konkrétní typ je nastaven v poli TNF (Type Name Format), který by měl indikovat, zda se jedná o dobře známé datové typy NFC, absolutní URI (RFC 3986) nebo MIME typy.
- Payload identification je volitelným identifikátorem, který je určen aplikacím k identifikaci dat v NDEF záznamu. Tímto je možné vzájemně pomocí URI linkovat data (payload) vzájemně mezi sebou. Nicméně tento mechanismus linkování dat není v NDEF přítomen, implementace je proto nutná na straně uživatelské aplikace.
Zasílání záznamů o neurčité velikosti
Kusy záznamů, pod pojmem Record chunks, představují možnost zaslat zprávu o velikosti, kterou odesílatel nezná. Tímto způsobem může odesílatel zprávy již v průběhu generování dat zasílat zprávu tvořenou z průběžně doplňovaných kusů záznamů (v rámci jedné zprávy). Nejedná se o mechanismus multiplexace nebo bufferování dat a pro tyto účely rovněž nesmí být použit.
NDEF zpráva nemusí obsahovat kus záznamu, ale může jich obsahovat i několik. Tímto mechanismem rozdělená zpráva začíná počátečním kusem záznamu, následovaná žádným, nebo více "středními" kusy záznamů a zakončena ukončujícím kusem záznamu.
Každý kus záznamu je realizován shodně jako NDEF záznam, tudíž musí splňovat shodná pravidla, která jsou kladena i na NDEF záznamy. Pravidla jsou definována pro počáteční záznam, pro střední záznamy a pro ukončující, koncový záznam, která jsou následující:
- Počáteční záznam je NDEF záznam s příznakem CF (Chunk Flag). Typ celého úseku rozkouskovaných užitečných dat musí být indikován polem TYPE bez ohledu na to, zda je PAYLOAD_LENGTH, tedy délka úseku užitečných dat, nulová či nenulová. Pro identifikaci kusu dat může být použito pole ID. Na rozdíl od pole TYPE nespecifikuje pole PAYLOAD_LENGTH velikost celého bloku rozkouskovaných užitečných dat, ale jen velikost daného kusu, daného bloku dat.
- Prostřední záznamy jsou NDEF záznamy s nastaveným CF příznakem, který indikuje, že další blok dat obsahuje data stejného typu a že obsahuje i stejný identifikátor, jako počáteční blok dat. Pole TYPE_LENGTH a IL musí být nulové a pole TNF musí nabývat hodnoty 0x06 (Nezměněno). Pole PAYLOAD_LENGTH rovněž specifikuje velikost daného bloku dat.
- Ukončující záznam je NDEF záznam s prázdným příznakem CF, který indikuje, že se jedná o poslední blok dat stejného typu, jako typ počátečního bloku dat. Pravidla pro pole TYPE_LENGTH, IL a PAYLOAD_LENGTH jsou stejná jako pro prostřední bloky dat.
Pokud jsou užitečná data rozdělena, tak musí být pouze v rámci jedné NDEF zprávy. Takto nemůžou být rozdělena data do vícero NDEF zpráv. Právě i z těchto důvodů nemůže mít počáteční nebo střední kus záznamu příznak ME (Message End).
Specifikace
Řazení záznamů
Pořadí NDEF záznamů během přenosu je rozlišováno na úrovni bytů. Interpretace NDEF záznamů tak spočívá v počítání zleva doprava, a poté shora dolů, což je znázorněno níže:
+--+--+--+--+--+--+--+--+ | 1. byte | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | 2. byte | 3. byte | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | 4. byte | +--+--+--+--+--+--+--+--+ | 5. byte | +--+--+--+--+--+--+--+--+
Nejlevější bit v jednobytovém záznamu je ten s nejvyšší významností (Most Significant Bit). Pro vícebytové pole pak představuje nejlevější bit celého pole bit s nejvyšší významností. Tato fakta nám jednoznačně určují, že endianita v NDEF je big-endian, tj. nejvýznamnější bity jsou přenášeny nejdříve.
Struktura NDEF záznamu
NDEF záznamy nemají statickou velikost záznamů u běžného formátu záznamu. Jednotlivá pole v uvedeném diagramu jsou vysvětlena níže.
7 6 5 4 3 2 1 0 +-----+-----+-----+-----+-----+-----+-----+-----+ | MB | ME | CF | SR | IL | TNF | +-----+-----+-----+-----+-----+-----+-----+-----+ | TYPE LENGTH | +-----+-----+-----+-----+-----+-----+-----+-----+ | PAYLOAD LENGTH 3 | +-----+-----+-----+-----+-----+-----+-----+-----+ | PAYLOAD LENGTH 2 | +-----+-----+-----+-----+-----+-----+-----+-----+ | PAYLOAD LENGTH 1 | +-----+-----+-----+-----+-----+-----+-----+-----+ | PAYLOAD LENGTH 0 | +-----+-----+-----+-----+-----+-----+-----+-----+ | ID LENGTH | +-----+-----+-----+-----+-----+-----+-----+-----+ | TYPE | +-----+-----+-----+-----+-----+-----+-----+-----+ | ID | +-----+-----+-----+-----+-----+-----+-----+-----+ | PAYLOAD | +-----+-----+-----+-----+-----+-----+-----+-----+
Vysvětlivky jednotlivých klíčových příznaků záznamu:
- MB (Message Begin) je jednobitový příznak, který indikuje počátek NDEF zprávy.
- ME (Message End) je jednobitový příznak, který indikuje konec zprávy. V případě rozdělených (rozkouskovaných) užitečných dat se příznak ME vyskytuje pouze v koncovém kusu záznamu.
- CF (Chunk Flag) je jednobitový příznak, který indikuje, zdali se jedná o rozdělená užitečná data. Vyskytuje se pouze v prvním a prostředních záznamech.
- SR (Short Record) je jednobitový příznak, který když je nastaven na 1, pak má PAYLOAD_LENGTH pole velikost 1 bytu. Ve vazbě k Short Record příznaku se váže i zkrácená struktura záznamu, jehož PAYLOAD pole dosahuje velikosti v rozsahu 0-255 bytů.
Diagram níže uvedený znázorňuje zkrácenou strukturu záznamu, pokud je příznak SR nastaven na 1:
7 6 5 4 3 2 1 0 +-----+-----+-----+-----+-----+-----+-----+-----+ | MB | ME | CF | 1 | IL | TNF | +-----+-----+-----+-----+-----+-----+-----+-----+ | TYPE_LENGTH | +-----+-----+-----+-----+-----+-----+-----+-----+ | PAYLOAD_LENGTH | +-----+-----+-----+-----+-----+-----+-----+-----+ | ID_LENGTH | +-----+-----+-----+-----+-----+-----+-----+-----+ | TYPE | +-----+-----+-----+-----+-----+-----+-----+-----+ | ID | +-----+-----+-----+-----+-----+-----+-----+-----+ | PAYLOAD | +-----+-----+-----+-----+-----+-----+-----+-----+
Ačkoliv programátoři se mohou rozhodnout používat ve svých aplikacích pouze jeden typ záznamů, tak jejich NDEF parsery musí akceptovat jejich normální i zkrácenou strukturu. Jedna zpráva může obsahovat oba typy záznamů.
Vysvětlivky jednotlivých doplňujících příznaků záznamu (některé jsou nepovinné):
- IL (ID_LENGTH) je jednobitový příznak, který když je nastaven na 1, pak je pole ID_LENGTH jednobytové. Pokud je nastaven na 0, pak je pole ID_LENGTH vynecháno z hlavičky a pole ID_FIELD také.
- TNF (Type Name Format) pole definuje formát pole TYPE. Jedná se o tříbitové pole, jehož hodnoty jsou následující:
- 0x00 - Prázdný typ - Když je nastaven, pak není žádný typ, ale také ani nejsou žádná asociována se záznamem. Pokud je nastaven, pak pole TYPE_LENGTH, ID_LENGTH a PAYLOAD_LENGTH jsou nulové a pole TYPE, ID a PAYLOAD jsou vynechány ze záznamu.
- 0x01 - Známý typ NFC fóra (NFC RTD)
- 0x02 - Typy médií MIME definované v RFC 2046
- 0x03 - Absolutní URI definované v RFC 3986
- 0x04 - Externí typ NFC fóra - NFC RTD
- 0x05 - Neznámý typ - Jedná se o neznámý typ, jeho ekvivalent v MIME je "application/octet-stream". Pokud je nastaven, pak TYPE_LENGTH musí být nulový a pole TYPE je vynecháno ze záznamu.
- 0x06 - Nezměněný typ - Jedná se o typ určený pouze prostředním záznamům, který definuje, že má stejný identifikátor, jako počáteční kus záznamu. Pokud je nastaven, pak TYPE_LENGTH musí být nulový a pole TYPE je vynecháno ze záznamu.
- 0x07 - Rezervováno
- TYPE_LENGTH pole je neznaménkový, osmibitový integer, který definuje délku pole TYPE v bytech. Toto pole je vždy nulové pro specifické hodnoty pole TNF.
- ID_LENGTH pole je neznaménkový, osmibitový integer, který definuje délku pole ID v bytech. Toto pole je přítomno pouze v případech, kdy je nastaven příznak IL na 1. Pokud je pole ID_LENGTH nastaveno na 0 bytů, pak je pole ID vynecháno ze záznamu.
- PAYLOAD_LENGTH pole je neznaménkový integer, který definuje velikost pole PAYLOAD, tj. užitečných dat. Velikost pole PAYLOAD_LENGTH se určuje podle příznaku SR.
- Pokud je tento příznak nastaven na 1, pak se záznam interpretuke jako krátký, tudíž pole PAYLOAD_LENGTH je neznaménkový, osmibitový integer.
- Pokud toto pole nastaveno není, pak je PAYLOAD_LENGTH 32bitový neznaménkový integer.
- Pokud je nastaven na 0, pak je pole PAYLOAD vynecháno ze záznamu.
- TYPE pole popisuje typ užitečných dat. Tato hodnota musí respektovat strukturu, kódování a formát z pole TNF.
- ID pole je jednoznačný identifikátor zpráv. O jednoznačnost se musí starat strana generující NDEF zprávy. Toto pole musí mít nastaven pouze první záznam, v případě rozkouskované komunikace prostřední a ukončující kus záznamu nesmí mít toto pole nastaveno.
- PAYLOAD pole nese užitečná data aplikací.