在线时间102 小时
UID166490
注册时间2010-1-5
NXP金币71
该用户从未签到
高级会员

- 积分
- 969
- 最后登录
- 2025-7-8
|
发表于 2014-3-27 18:19:30
|
显示全部楼层
RE:MQX新手报到,求指导
MQX的Web-Server可以参考例程$MQX\rtcs\examples\httpsrv和$MQX\demo\web_hvac二个现成的例子。
MQX提供了转换工具,可以将用户的web_pages目录中的全部网页文件转换为TFS的数组形式(参考tfs_data.c文件,mktfs.bat)。下面以$MQX\rtcs\examples\httpsrv的rtc.html查询为例子,介绍http server的工作过程。
static const unsigned char tfs_web_pages_favicon_ico[] = {
/* web_pages/favicon.ico */
0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x10, 0x00, 0x00,
……………….
}
const TFS_DIR_ENTRY tfs_data[] = {
.......
{ "/index.html", 0, (unsigned char*)tfs_web_pages_index_html, sizeof(tfs_web_pages_index_html) },
{ "/ipstat.html", 0, (unsigned char*)tfs_web_pages_ipstat_html, sizeof(tfs_web_pages_ipstat_html) },
...........
{ 0, 0, 0, 0 }
};
const HTTPD_ROOT_DIR_STRUCT root_dir[] = {
{ "", "tfs:" },
{ 0, 0 }
};
void main_task(uint_32 temp) {
………………..
error = _io_tfs_install("tfs:", tfs_data);
for (i = 0; i < n_devices; i++)
{
params = httpd_default_params(NULL);
params->af = HTTP_INET_AF; //IPv4+IPv6, set connection family from config.h
if (params)
{
sprintf(indexes, "\\index.html", i);
params->root_dir = (HTTPD_ROOT_DIR_STRUCT*)root_dir;
params->index_page = indexes;
printf("Starting http server No.%d on IP", i);
/*
** If there is only one interface listen on any IP address
** so address can change in runtime (DHCP etc.)
*/
#if RTCSCFG_ENABLE_IP4
if ((i == 0) && (n_devices == 1))
{
params->address = INADDR_ANY;
}
else
{
params->address = ip_addr;
}
/* Print active ip addresses */
printf(" %d.%d.%d.%d", IPBYTES(ip_addr));
#endif
server = httpd_init(params);
}
HTTPD_SET_PARAM_CGI_TBL(server, (HTTPD_CGI_LINK_STRUCT*)cgi_lnk_tbl);
#if HTTPD_SEPARATE_TASK || !HTTPDCFG_POLL_MODE
printf("...");
error = httpd_server_run(server);
}
1. 在IE浏览器中输入设备的IP地址后,默认请求index.html
2. MQX返回保存在tfs的index.html网页内容
3.IE显示index.htm网页,如果用户点击RTC链接,请求rtc.html网页
查看rtc.html可以发现,这个网页使用了javascript技术,在网页加载时,触发Onload事件,定时1秒发送更新请求
function loop() {
if (!data_received)
makeRequest("rtcdata.cgi");
setTimeout("loop()", 1000);
}
window.onload=loop;
javascript 调用cgi请求“rtcdata.cgi”,在web server中的文件cgi.c中定义了cgi请求服务函数cgi_rtc_data
const HTTPD_CGI_LINK_STRUCT cgi_lnk_tbl[] = {
{ "ipstat", cgi_ipstat},
{ "icmpstat", cgi_icmpstat},
{ "udpstat", cgi_udpstat},
{ "tcpstat", cgi_tcpstat},
{ "rtcdata", cgi_rtc_data},
{ 0, 0 } // DO NOT REMOVE - last item - end of table
};
static _mqx_int cgi_rtc_data(HTTPD_SESSION_STRUCT *session) {
TIME_STRUCT time;
int min, hour;
_time_get(&time);
min = time.SECONDS / 60;
hour = min / 60;
min %= 60;
session->response.contenttype = CONTENT_TYPE_PLAIN;
httpd_sendhdr(session, 0, 0);
CGI_SEND_NUM(hour);
CGI_SEND_NUM(min);
CGI_SEND_NUM(time.SECONDS % 60);
return session->request.content_len;
}
4. IE浏览器javascript代码将上述cgi_rtc_data返回的数据进行进一步解析,并呈现给用户
function parse_vars(data) {
var parsed = data.split( "\n" );
rtc_value[0] = parsed[0];
rtc_value[1] = parsed[1];
rtc_value[2] = parsed[2];
hour.innerHTML = ""+rtc_value[0]+"
";
minute.innerHTML = ""+rtc_value[1]+"
";
second.innerHTML = ""+rtc_value[2]+"
";
} |
|