NFC Data Exchange Format

Z Wikipedie, otevřené encyklopedie

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[editovat | editovat zdroj]

NDEF zpráva[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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 nemohou 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[editovat | editovat zdroj]

Řazení záznamů[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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í.

Související články[editovat | editovat zdroj]

Externí odkazy[editovat | editovat zdroj]