在之前的Note 4,已经学会了如何使用SDK的"内嵌式"阳春网页,如下。
档案:component/common/example/httpd/example_httpd.c
void homepage_cb(struct httpd_conn *conn){// 中间略// GET homepageif(httpd_request_is_method(conn, "GET")) {char *body = \ // HTML code直接写在C code里的"内嵌式"写法 "<HTML><BODY>" \ "It Works<BR>" \ "<BR>" \ "Can test GET by <A href=\"/test_get?test1=one%20%26%202&test2=three%3D3\">/test_get?test1=one%20%26%202&test2=three%3D3</A><BR>" \ "Can test POST by UI in <A href=\"/test_post.htm\">/test_post.htm</A><BR>" \ "</BODY></HTML>";
但我们一般写网页,不可能只有一个index.html而已,通常还有css、javascript,甚至是jpg、png等图片档,这样要怎么写进C code呢?
以我浅薄的知识,想出了以下几种解法,还有实际上操作遇到的困难。(如果有其他解法请一定要告诉我!)
1. 製作file system,把整份网页资料夹(例如 www/)存进去,再让httpd的"/"路径指定到www/
Amebaz2 SDK里有FAT file system的example,只要打开"CONFIG_EXAMPLE_FATFS"这个macro就可以了。可支援filesystem建立在
a. 开发板内的flash,位置0x200000 ~ 0xA9000,共512KB => 我还没研究怎么把www/放进这个位置,但理论上应该可行
b. 外接式SD card => 失败。因为SDK内缺乏应有的header file,无法编译。已经有去论坛询问了~
c. USB storage => README写说只支援Ameba-1,所以不行
2. 维持原样,把所有的档案放进C code,文字档容易,图片档的话嘛...
a. 把图片用html的方式呈现 => 请参考本网址。很神奇的方式,但会让size暴增(该网页的例子中,原本3KB的jpg,转成html code会变成274KB),所以放弃此解法。因为经过实验,我放了一个20多KB的jpg档,网页就开不起来了。
b. 把图片直接转成binary,写进http封包,并把header type改为image/jpeg => 这招可以,但如同我刚才说的,只要jpg大于20KB就会开不太起来。
c. 比较大的图片放在其他空间,用url指定过去吧 => 这招OK,写法如下。
<img src="https://XXX.YY/XXX.jpg"></img>
综合以上几个想法,最后使用了2.b和2.c(其实1.a应该才是正解?)。也就是html、css、js档案我先转成binary,图片就用url。
下一篇来介绍一下转binary的方法,也是使用SDK内附的小工具就好了喔!