第12节 RSS/XML 消息源阅读器固件
推荐给好友
打印
加入收藏
更新于2009-01-11 23:47:56

        RSS/XML 消息源阅读器固件是建立在本文到目前为止介绍的所有的固件之上,如图26所示。为了获取RSS或XML数据,需要用到HTTP客户端和DNS客户。该数据通过callback传到EMG_rss_text_filter,将在tag_filter数组中定义的标签解析出来。
        对于RSS阅读器,标签被hardcoded to <title> 和<description>。消息源阅读器与上述 wget implementation 之间的最大差别就是,怎样处理被过滤后数据。wget implementation将数据直接发给串口。而RSS/XML 消息源阅读器将过滤后的字符发送到character_buffer数组。

图26 在模块RSS_reader_byEricGregori.c内

12.1 Character_buffer
        被过滤后的所有数据被发送到字符缓冲区,包括标签内附加的换行。为了保证LCD显示屏可读,该缓冲是很有必要的。如果不减慢向LCD发送数据的速度,显示屏就会滚动得太快而没法读。语音合成器也会这样。对函数 output_rss_text的调用来自于rss_tcp_callback函数。该回调函数是由TCP/IP协议栈直接调用的,且必须视为一个中断。在回调函数内不能有任何延时、睡眠和函数调用。
        由于这个原因,过滤器的数据都被存储在字符缓冲区。然后由函数emg_rss_reader_task 将数据慢慢地从缓冲区发到 LCD 和语音合成器,这样就不会受到回调函数的时间限制。
        将过滤数据放入字符缓冲区:
        //*************************************************************
        // output_rss_text - Written By Eric Gregori
        // eric.gregori@freescale.com
        //
        // Called by emg_rss_text_filter
        //
        //*************************************************************
        void output_rss_text(unsigned char data)
        {
                if(character_buffer_index < RSS_CHARACTER_BUFF_SIZE)
                {
                        character_buffer[ character_buffer_index++ ) = data;
                }
        }
                显示和打印字符缓冲区内的数据:
                emg_HTTP_client_close(shandle);
                if(character_buffer_index)
                {
                        for(e=0; e<character_buffer_index; e++)
                        {
                                // 显示缓冲区内的数据
                                lcd_print_char(character_buffer[e]);
                                printf(%c, character_buffer[e]);
                                if(character_buffer[e] == 0x0d)
                                        tk_sleep(50);
                        }
                }

12.1 RSS/XML 消息源阅读器的使用方法
        RSS/XML 消息源阅读器的使用方法很简单:
        1、将变量url设置为URL或RSS/XML服务器。
               static const unsigned char url[] = “http://www.weather.gov/data/current_obs/KUGN.rss”;
        2、将tag_filter()设置为想要显示的数据类型。
               ——对于RSS feeds,首先选择<title> 和 <description>
               ——对于XML feeds,标签名取决于想获得的信息。
                       const unsigned char *tag_filter() =
                       {
                                {(const unsigned char *)”title”},
                                {(const unsigned char *)”description”},
                                {(const unsigned char *)””}
                       };
        3、将字符缓冲区的大小设置成足够大,以能容纳那些过滤数据。
                #define RSS_CHARACTER_BUFF_SIZE 2048
        4、编译并下载到演示板。
                TCP/IP协议栈come up后,接下来:
                        1、DHCP客户端自动获取IP地址和DNS的IP地址。
                        2、显示屏上显示一个标题并伴有语音。
                        3、固件连接到URL指定的服务器。
                        4、显示连接状态,且伴有语音。
                        5、用HTTP客户端从服务器下载文件。
                        6、连接关闭后,显示该文件,且伴有语音。
                        7、RSS/XML 消息源阅读器进入睡眠状态,直到SW1或SW2被按下。
                        8、SW1或SW2被按下后,初始化一个到指定URL的服务器的连接,然后重复以上过程。

12.2 XML流
        对于XML流,EMG_rss_text_filter的返回值决定数据来自于哪个标签。这就允许另一个包含更多描述名称的常量数组来描述该标签的数据。将EMG_rss_text_filter的返回值减1则指向数组中的一个描述名称,在退出RSS回调函数之前,先将该索引所指向的字符串发送到字符缓冲区中。然后XML过滤器将标签中的数据直接放入字符过滤器。


<<上一页    下一页>>
相关链接


 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.