本帖最后由 flyword 于 2019-2-7 19:17 编辑
春节年味正浓,这里也继续自己的分享,昨天晚上试了试HTTP_SERVER APP的应用。分享给大家。
之前看到大神RSCN以及anger0925已经做出webserver了,工作的代码也有分析,参考了他们的帖子,利用HTTP_SERVER这个APP模块很快速就搭建了自己的webserver。具体的流程分享如下:
一、DAVEAPP模块添加及相关的配置操作。
这里与之前网友的web应用类似,我们通过CGI接口发送我们的指令给XMC4800,来分别控制LED1及LED2;而XMC4800通过SSI接口来嵌入ADC模块的数值到网页上,显示给客户端。
因此需要添加的APP有:
1. HTTP_SERVER
2. ADC_MEASUREMENT
3. DIGITAL_IO
具体如下:
插一句,这里的网页内容都放在Resources这个文件里了。网页如何存放在rom里是通过makefsdata程序生成的,这里我们需要添加一下脚本,具体可以参考APPhelp,这里设置如下图:
好了,设置后以后,我们看看其他具体的配置如下:
1. 对于HTTP_SERVER APP的设置,主要包括两个地方,一是webserver的端口及CGI\SSI使能设置,一般为80,也可以设置为8080等。另一处是LWIP的设置,可以使用默认的设置,但是必须确认PHY的型号与电路板一致。最后就是引脚pin的分配了,对着XMC4800的电路图,补充相关的引脚即可。
2. ADC,这里采用的是轮询的方式读取数据。
3. 两个LED均设置为输出口,并设置好相应的引脚。
二、我对CGI 及SSI 的理解。
由于第一次使用LWIP,对于它的工作原理不是很理解,通过对比大神RSCN以及anger0925的帖子,初步了解了对CGI、SSI的理解。
具体的内容可以在lwip里httpd相关文件可以看到,这里截屏如下:
CGI一般通过GET的方式,以表单的形式提交数据给服务器,然后服务器查询提交表单action对应的CGI文件,进而通过pCGIs列表查询到相应的回调函数(callback函数),并执行函数,而相应的操作对应在相应的回调函数里。
SSI一般是通过查询表单里的标记符,一般是以[an error occurred while processing the directive]为标识,其中abc是我们想要显示的标记,一般在一个标签列表TAGS[]里定义,服务器运行时对网页中的标识进行查询,并在对应的索引里进行相应的操作,也用的是回调函数。
CGI和SSI在使用时,都需要进行相应的注册,这样才能正常使用。注册函数分别对应的是http_set_cgi_handlers和http_set_ssi_handler。
对于用户而言,我们需要做的工作有三个个步骤。
A. 首先,定义自己的句柄函数,对应CGI和SSI接口。
B. 其次,定义对应CGI的pCGIs列表,以及对应SSI的标签列表TAGS。
C. 最后,依次使能注册函数http_set_cgi_handlers和http_set_ssi_handler。
我们完全不用关注底层的代码,只需要设计自己的上层应用即可。
三、只在main.c中添加代码,就能实现自己的应用。
1.先看CGI接口部分的程序,需要添加两个部分,一个部分是c程序,一个是html程序里cgi接口的定位,具体程序看后面html文件内容。
程序如下:其中,pcValue[0]对应的是提交上去的第一个参数对应的值。
- const char *ledctrl_handler(int iIndex, int iNumParams, char *pcParam[],char *pcValue[]){
- if(strcmp(pcValue[0], "led1_on") == 0)
- {
- DIGITAL_IO_SetOutputHigh(&LED_1);
- }
- if(strcmp(pcValue[0], "led1_off") == 0)
- {
- DIGITAL_IO_SetOutputLow(&LED_1);
- }
- if(strcmp(pcValue[0], "led2_on") == 0)
- {
- DIGITAL_IO_SetOutputHigh(&LED_2);
- }
- if(strcmp(pcValue[0], "led2_off") == 0)
- {
- DIGITAL_IO_SetOutputLow(&LED_2);
- }
- if(strcmp(pcValue[0], "leds_off_all") == 0)
- {
- DIGITAL_IO_SetOutputLow(&LED_1);
- DIGITAL_IO_SetOutputLow(&LED_2);
- }
- if(strcmp(pcValue[0], "leds_on_all") == 0)
- {
- DIGITAL_IO_SetOutputHigh(&LED_1);
- DIGITAL_IO_SetOutputHigh(&LED_2);
- }
-
- return "/index.shtml"; //一定要返回到首页,不然可能就跳转到空页面了。。
- }
-
- tCGI pCGIs[]={ //定义的CGI对应的列表,分别对应html中多个cgi表单。
- {
- .pcCGIName="/ledctrl.cgi",
- .pfnCGIHandler=ledctrl_handler
- },
- };
-
- int web_cgi_init(void){
- http_set_cgi_handlers(pCGIs, 1); //将相应的CGI列表注册到系统中个,这里因为只有1个列表,因此数字为1 。
- return 0;
- }
复制代码
2.再看看SSI接口部分的程序,需要添加两个部分,一个部分是c程序,一个是html程序里cgi接口的定位。
- const char *Tags[]={ //定了了网页中的SSI标记。用于服务器将相关的数据添加进去。
- "ADC",
- "INT",
- };
-
- static uint16_t adc_read_ssihandler(int iIndex, char *pcInsert, int iInsertLen){
-
- uint16_t ADC_value;
- char value[4];
- char num[5];
-
- switch(iIndex){ //iIndex is the index of identifier in the Tags[]
- case 0:
- ADC_value = ADC_MEASUREMENT_GetResult(&ADC_MEASUREMENT_Channel_A);
- sprintf(value,"%d",ADC_value);
- *pcInsert=value[0];
- *(pcInsert+1)=value[1];
- *(pcInsert+2)=value[2];
- *(pcInsert+3)=value[3];
- break;
- case 1:
- sprintf(num,"%d",12345);
- *pcInsert=num[0];
- *(pcInsert+1)=num[1];
- *(pcInsert+2)=num[2];
- *(pcInsert+3)=num[3];
- *(pcInsert+4)=num[4];
- break;
- default:
- break;
- }
- return strlen(pcInsert);//this is very important to run the ssi handler...这里非常重要,必须返回插入数据的长度,否则不能正常显示。
- }
- int web_ssi_init(void){//注册函数。
- http_set_ssi_handler(adc_read_ssihandler,(char const **)Tags,2);
- return 0;
- }
复制代码
完整的main函数如下:
- int main(void)
- {
- DAVE_STATUS_t status;
-
- status = DAVE_Init(); /* Initialization of DAVE APPs */
-
- if(status != DAVE_STATUS_SUCCESS)
- {
- /* Placeholder for error handler code. The while loop below can be replaced with an user error handler. */
- XMC_DEBUG("DAVE APPs initialization failed\n");
-
- while(1U)
- {
-
- }
- }
- //httpd_init();
- web_cgi_init();
- web_ssi_init();
- /* Placeholder for user application code. The while loop below can be replaced with user application code. */
- while(1U)
- {
- sys_check_timeouts(); //使能LWIP应用
- }
- }
复制代码
至此,我们的web网页就搭建完成了,相关的HTML文件见附件,上传code里会被解析出来。。。论坛的编辑器啊。。。。
四、具体的应用实现效果。下载程序以后,设置好电脑的IP地址,在浏览器中访问xmc4800IP即可得到网页内容。
怎么样,简单吧!感兴趣的用户可以实验一下。
我是第一次使用英飞凌的单片机,使用DAVE的APP,的确不一样的体验,不用再去翻手册,繁琐的操作那些寄存器了,直接面向应用设计自己的项目,赞!!但是缺点也有,就是APP的应用不是很灵活,要想灵活的应用的话,就必须对DAVE和APP有更深入的理解。
html文件
index.shtml
(1.69 KB, 下载次数: 5)
此内容由EEWORLD论坛网友flyword原创,如需转载或用于商业用途需征得作者同意并注明出处