Jste zde

Realizace Ethernetu v mikrokontrolérech ColdFire - 3.část - RSS / XML a použití

Zatímco první díl seriálu o realizaci Ethernetu v MCU ColdFire byl o obecné struktuře OSI modelu a principu komunikace po Ethernetu a druhý díl o implementaci TCP/ IP komunikace v MCU ColdFire, třetí díl se zaměřuje na uvedení protokolů XML a RSS a možnosti jejich použití a zpracování na úrovni MCU.

Extensible Markup Language (XML)

XML je jazyk používaný k popisu a parsování (rozboru) informací. Co se týče struktury, je jazyk XML velice podobný jazyku C. Data jsou organizována do členů (elementů) a ke každému elementu je přiřazen tag (popiska). Data v tomto elementu jsou obklopena startovním a koncovým tagem. Aby byla zajištěna správná interpretace, musí se název startovacího a koncového tagu shodovat (před koncovým tagem je navíc znak lomítka „/“).

Bližší popis specifikace XML 1.0 je umístěn na adrese www.w3.org/TR/REC-xml/

7.1: Tagy (Popisky)


Příklad tagu:
<TITLE>Advanced ColdFire TCPIP Clients</TITLE>

Jak je patrné z uvedeného příkladu, typ dat, který je uvozen mezi počátečním tagem <TITLE> a koncovým tagem </TITLE> je titulek. Stejně jako v jazyce C, jsou data vždy přiřazena k určitému typu. Datům mezi stejnými tagy se častěji říká ‚obsah elementu‘. Elementy v sobě mohou obsahovat i jiné elementy, což umožňuje vytvářet skupiny pod stejným jménem s různými typy dat. A zase podobně jako v C, jsou určité části dat adresovány specifickými cestami.

7.2: Speciální znaky a únikové sekvence

Znaky "&" , "<", a ">" jsou speciální znaky jazyka XML. Tyto znaky jsou používány k indikaci XML tagů a k definici únikových (Escape) sekvencí. Ty tvoří metodu, jak specifikovat zobrazovaný text prostřednictvím kódu. Escape sekvence začíná znakem "&" (ampersand) a končí znakem ";".

  • "<" indikuje použití Escape sekvenci &lt;
  • ">" indikuje použití Escape sekvence &gt;
  • "&" indikuje použití Escape sekvence &amp;

 

7.3: CDATA sekce a vyjímky z pravidla

Všechna pravidla mají výjimky a v XML popisuje výjimky sekce CDATA. Jakýkoliv text specifikovaný v sekci CDATA je ignorován XML parserem, což umožňuje použít speciálních znaků bez vynucení únikové Escape sekvence. Sekce CDATA začíná tagem "<!CDATA[" a je ukončena kombinací znaků "]]>". Cokoliv uvedené mezi závorkami je XML ignorováno.

<![CDATA[ tyto data jsou ignorována XML parserem]]>
<![CDATA[ <TOTO_NENÍ_TAG > &lt; ]]>

Protože je text uvnitř závorek ignorován, je tag i Escape sekvence interpretována jen jako text či posloupnost znaků.

7.4: Hledání textu a znaků v XML dokumentu

Citujeme-li ze specifikace XML 1.0, “Veškerý text, který není značkován definuje znaková data dokumentu. To zahrnuje všechen text uvniř závorek v sekci CDATA a všechen text mezi závorkami "<", ">" v těle souboru. Escape sekvence v hlavním těle (kódu) reprezentuje jednu část znakových dat. K vyfiltrování znaků a řetězců z XML dokumentu jednoduše odstraníme všechny značky (tagy) a závorky "<", ">". Pak se přeloží únikové Escape sekvence do skutečných znaků.

7.5: Ukázka XML souboru

V ukázce XML souboru ze stránky www.weather.gov/data/current_obs/KUGN.xml je patrné, jak jsou data uzavřená pomocí tagů, kde jejich název popisuje typ dat. K nalezení požadovaných dat jednoduše hledejte počáteční a koncové tagy, které hledaný text popisují. Požadovaná data se totiž nalézají právě mezi uvedenými tagy.

Ukázka typického XML souboru:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<current_observation version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.weather.gov/data/current_obs/current_observation.xsd">
<credit>NOAA's National Weather Service</credit>
<credit_URL>http://weather.gov/</credit_URL>
<image>
<url>http://weather.gov/images/xml_logo.gif</url>
<title>NOAA's National Weather Service</title>
<link>http://weather.gov</link>
</image>
<suggested_pickup>15 minutes after the hour</suggested_pickup>
<suggested_pickup_period>60</suggested_pickup_period>
<location>Chicago / Waukegan, Waukegan Regional Airport, IL</location>

... celý soubor si zobrazíte zde ...

7.6: Problém s XML dokumenty

Hlavní problém s XML dokumenty spočívá v možné flexibilitě názvů tagů. Autor XML dokumentu může použít jakýkoliv název pro pojmenování dat. Proto je vyžadován standard, který standardizuje názvy tagů a určuje, jak mají být data asociována s typem. Tímto standardem je RSS.

 

RSS (Really Simple Syndication)

RSS kanály jsou dnes dostupné kdekoliv na internetu. Využívají se k předávání informací, jako jsou například lokální informace o počasí, výsledky vyhledávacích algoritmů, zprávy, sport, nové filmy a spousty dalších. Základní idea RSS kanálů je poskytovat dynamické informace z jakéhokoliv oboru v jednoduché a přehledné standardizované formě.

Vznik RSS se datuje k roku 1999, jako nápad poskytovat aktuální informace v jednoduchém formátu. Pro tento účel se používají data ve formátu XML (Extensible Markup Language) na místo HTML (HyperText Markup Language). RSS kanál lze tak zkráceně definovat jako XML dokument obsahující data. Metody používané pro přenos data uvnitř XML dokumentů a přesná definice signálů a dat je popsána ve specifikaci RSS 2.0. Všechny RSS kanály přitom musí splňovat specifikaci XML 1.0. Jako transportní mechanismus používají RSS kanály zpravidla HTTP protokol.

8.1: Specifikace RSS

RSS je "nářečím" XML. RSS vkládá HTML kód do architektury XML a také definuje sadu elementů a obecné šablony používající tyto elementy. Ve specifikaci je definováno mnoho různých elementů. Aplikační poznámka AN3518 se pak zaměřuje na elementy, které nás zajímají pro RSS aplikace.

8.2: Typický soubor RSS

Organizace RSS souboru může být připodobněna k novinovým článkům. Channel (Kanál) je názvem novin, items (položky) jsou články v těchto novinách, titles (titulky) jsou skutečnými titulky těchto článků a descriptions (popisy) jsou textem článků.

<channel>

<title>The name of the channel</title>
<link>URL to the HTML website corresponding to this channe</link>
<description>Text describing the channel</description>
<item>

<title>Item1 Title</title>
<link>URL of item 1</link>
<description>Text for item 1</description>

</item>
<item>

<title>Item2 Title</title>
<link>URL of item 2</link>
<description>Text for item 2</description>

</item>

</channel>

 

8.3: Ukázka souboru RSS

Ukázka RSS souboru ze stránky www.weather.gov/data/current_obs/KUGN.rss obsahuje ta samá data jako příklad souboru XML uvedený výše. Standard RSS definuje titulek a popisuje jména tagů. Tyto tagy pak obsahují data, která potřebujeme. Všechny čtečky kompatibilní se standardem RSS 2.0 obsahují a takto popisují tagy.

<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Weather at Chicago / Waukegan, Waukegan Regional Airport, IL - via NOAA's National Weather Service</title>
<link>http://www.weather.gov/data/current_obs/</link>
<lastBuildDate>Sat, 28 Jul 2007 16:32:11 UT</lastBuildDate>
<ttl>60</ttl>
<description>Weather conditions from NOAA's National Weather Service.</description>
<language>en-us</language>
<managingEditor>robert.bunge@noaa.gov</managingEditor>
<webMaster>w-nws.webmaster@noaa.gov</webMaster>
<image>
<url>http://www.weather.gov/images/xml_logo.gif</url>
<title>NOAA - National Weather Service</title>
<link>http://www.weather.gov/data/current_obs/</link>
</image>
<item>

... celý soubor si zobrazíte zde ...

 

RSS/XML znakový filtr dat

Pro extrahování znakových dat (informací, které opravdu chcete číst) z RSS kanálů, musí být vyfiltrován veškerý Meta-Text. Všechna HTML data, která lze zpracovat, musí být přeložena. Například: místo HTML příkazu <br> pro nový řádek by se v RSS kanálu objevila kombinace znaků &lt;br&gt. Filtr proto musí správně přeložit &lt;br&gt jako příkaz pro nový řádek. Ostatní HTML tagy, které se často používají, jako např. značka pro odstavec <p> a obrázek <IMG … >, jsou v RSS kanálu zobrazeny ve formátu &lt;p&gt; a &lt;IMG … respektive &gt. Zatímco odstavcová značka "tab" může být přeložena jako příkaz pro nový řádek, tag pro obrázek musí být vypuštěn (ignorován), pokud jej systém neumí zpracovat.

Filtr tedy pracuje tak, že z XML dat či z RSS kanálu vybere a zahodí všechny HTML tagy, pokud je neumí zpracovat. Filtr normálně vrací hodnotu 0. Když filtr narazí na znak ">" nahlédne do tabulky známých tagů co je to za tag a pokud je nalezena shoda, vrací hodnotu 1. Například po detekci tagu <title> v datovém toku RSS kanálů nebo XML, filtr vrací 1. Po detekci tagu <description> filtr vrací 2 (protože ten nepodporuje či nezná).

9.1: RSS/XML stavový automat znakového filtru

Znakový data filtr je implementován jako stavový automat s konečným počtem stavů. Tento automat používá pouze dvou globálních proměnných. A to stavové proměnné "state" a paměti FILO (First In Last Out). Účel registru FILO je zapamatování si předešlého znaku. Každý bajt zadaný do filtru je posunut směrem zprava do leva v registru FILO, takže většina přijatých znaků je na pozici filo_buff[FILO_BUFF_SIZE-1]. Velikost bufferu FILO musí být větší než největší očekávaný název tagu a nastavuje se pomocí makra FILO_BUFF_SIZE.

#define FILO_BUFF_SIZE 32

Stavy (States):

STATE_ZERO
STATE_TAGSEARCH
STATE_INTAG
STATE_PRINT
STATE_SKIP
STATE_SKIP_NON_ASCII
STATE_SKIP_SPACE
STATE_CDATA
STATE_CDATA_PRINT
STATE_CDATA_SKIP_AMP
STATE_SKIP_INTAG
STATE_IN_AMPERSAND

Globální proměnné (Global Variables):

unsigned char filo_buff[FILO_BUFF_SIZE];
unsigned char state;

unsigned char EMG_rss_text_filter( unsigned char data, unsigned char **tag_filter )

 

Blokové schéma konečného stavového automatu znakového filtru RSS / XML (pro zvětšení kliknět

Filtr vytáhne seznam tagů z XML nebo RSS souboru a na výstup pošle pouze ten obsah, který nás zajímá. Seznam tagů je pole ukazatelů, jež odkazuje na data, která chceme filtrovat. Filtr normálně vrací hodnotu 0. Když filtr narazí na znak ‘>’ podívá se co je to za tag, nahlédne do tabulky známých tagů a pokud je nalezena shoda vrací 1. Příklad: po detekci tagu <title> v kanálech RSS nebo datech XML filtr vrací 1. Po detekci tagu <description> filtr vrací 2 (protože tento nepodporuje či nezná). Normálně vrací 0.

Ukázka tag_filter pointer array:

Const unsigned char *tag_filter[] =
{

{(const unsigned char *)”title”},
{(const unsigned char *)”description”},
{(const unsigned char *)””}

};

 

Použití filtru znakových dat RSS a XML kanálů

Příklad Embedded aplikace - RSS/XML čtečka

RSS/XML čtečka je embedded aplikace, která umožňuje uživatelům zobrazovat a slyšet skutečný obsah RSS a XML kanálů šířených na internetu. Účelem této aplikace je poskytovat aktuální informace bez spouštění počítače. Na internetu je ohromné množství aktuálních dat: počasí (současné i předpověď), chystané DVD, průběhy aukcí, průběhy sportovních utkání, zprávy, zdravotní informace, dopravní informace a spoustu jiného. RSS/XML čtečka se připojí k internetu, extrahuje z RSS/XML kanálů data, která nás zajímají a zobrazí je na LCD displeji, vyšle přes sériové UART rozhraní do řečového syntetizátoru (řečové procesoru) V-Stamp Voice Synthesizer firmy RCSystems, který převede text na řeč.

Pro kompletní informace se podívejte do aplikační poznámky AN3518, která je volně k dispozici na adrese: www.freescale.com/files/32bit/doc/app_note/AN3518.pdf?fsrch=1.

 

10.1: M52233DEMO deska od Freescale Semiconductor

M52233DEMO je referenční deska vhodná pro vývoj aplikací s procesorem ColdFire MC52233. K tomuto účelu obsahuje sériový port, USB BDM debug port a ethernetový port. Navíc pro možnost vývoje různých dalších aplikací obsahuje i 40pinový konektor, který uživatelům umožňuje přístup k téměř všem signálům procesoru ColdFire, 3D akcelerometr (připojený k 3 analogovým vstupům MCU), potenciometr a 2 uživatelská tlačítka. Freescale dodává tuto desku v rámci kitu společně s freeware verzí vývojového softwaru a prostředí CodeWarrior a zdrojovým kódem TCP/IP stacku, což je všechno, co potřebujete k rozběhnutí vlastních ethernetových aplikací. Freescale poskytuje zdarma na svých internetových stránkách zdrojové kódy pro TP/IP stack (ten je detailně popsán v AN3470).

Vývojová deska ColdFire MC52233 s LCD displejem a hlasovým syntetizérem RCSystems V-Stamp Voice Synthesizer

 

10.2.: Firmware

Firmware čtečky RSS/XML kanálů (viz obrázek níže) je postaven na vrchol všech ostatních firmwarů a stacků popsané v tomto seriálu článků "Realizace Ethernetu v mikrokontrolérech ColdFire". HTTP klient je používán společně s DNS klientem k získání RSS nebo dat z internetu. Data jsou "protlačena" skrz funkci EMG_rss_text_filter, který vytřídí (vyparsuje) tagy definovány v tag_filter array. Pro RSS čtečku jsou tagy pevně zakódovany do <title> a <description>. Velký rozdíl čtečky kanálů proti implementaci metody wget popsané v 2. díl seriálu o Ethernetu a ColdFire je to, co se stane poté, co jsou data vyfiltrována. V implementaci wget jsou data přímo směrována na sériový port, zatímco RSS/XML čtečka posílá filtrované znaky do pole znakového bufferu (character_buffer array).

Blokové schéma firmwaru aplikace RSS/XML čtečka (pro zvětšení klikněte na obrázek)

 

10.3: Používání RSS/XML čtečky

Používání firmwaru pro aplikace čtečky RSS/XML dokumentů je velice jednoduché:

  1. Nastavte proměnnou url na požadovanou adresu URL či RSS/XML server:

    static const unsigned char url[] = "http://www.weather.gov/data/current_obs/KUGN.rss";

  2. Nastavte tag_filter[] na typ dat, která chcete zobrazit:

    Pro RSS kanály, <title> a <description> by měla být první volba.
    Pro XML kanály, tohle může být jakýkoliv název závislý na požadovaných informacích.

    const unsigned char *tag_filter[] =
    {

    {(const unsigned char *)"title"},
    {(const unsigned char *)"description"},
    {(const unsigned char *)""}

    };

  3. Nastavte dostatečnou velikost znakového bufferu pro vaše vyfiltrovaná data:

    #define RSS_CHARACTER_BUFF_SIZE 2048

  4. Přeložte projekt a nahrajte na zkušební desku.

Jakmile naskočí TCP/IP stack použije DHCP klienta k automatickému získání síťového nastavení (IP adresa, DNS apod.). Zařízení se spojí se serverem, jehož adresa je uložena v proměnné url, přičemž stav připojení se zobrazuje na LCD displeji a pomocí řečového syntetizátoru je i reprodukován. Požadovaný soubor je pak stažen http klientem a jeho obsah je vyobrazen a „vyřčen“. Spojení se pak automaticky uzavře. Poté se RSS/XML čtečka uvede do spánkového režimu a čeká na probuzení pomocí tlačítek SW1 či SW2. Toto má za následek opětovné připojení, stažení, zobrazení a vyřčení celého obsahu.

10.3: XML proudy (XML streams)

U datovových XML proudů hodnota, kterou vrací funkce firmwaru EMG_rss_text_filter(), určuje jaký bude tag následujících dat. To umožňuje použít další pole konstant (const array) obsahující více popisujících jmen k popisu dat z tagu. Jednoduše se použije návratová hodnota -1 z funkce EMG_rss_text_filter() k indexaci v poli popisných jmen (descriptive name array) a pošlete indexovaný řetězec do znakového bufferu před opuštěním funkce rss_calback. XML filtr poté umístí data z tagu přímo do znakového filtru pod popisným jménem.

 

Závěr

Přidáním Ethernetu do embedded aplikací poskytuje tu úroveň konektivity, bez které by byl dnešní život informací nepředstavitelný. Embedded zařízení mohou být propojena mezi sebou stejnými kabely, jakými se spojují velké počítačové sítě. A to jak v průmyslu, tak v kancelářích a domovech. Tímto se integrovaná zařízení stávají součástí ethernetových sítí velkých počítačů. Ethernet a TCP/IP poskytují embedded zařízením připojení k internetu, což jim dává nekonečné množství uplatnění, které záleží čistě na představivosti vývojářů.

Autor: Eric Gregori

Překlad: Tomáš Coufal

Úprava: Antonín Vojáček

DOWNLOAD & Odkazy

Hodnocení článku: