第12节 RSS/XML 消息源阅读器固件
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过滤器将标签中的数据直接放入字符过滤器。
对于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过滤器将标签中的数据直接放入字符过滤器。


