1——嵌入式WebServer的移植——boa&&appweb學習1

項目做到現在這個階段,是時候引入http服務器了。以前的團隊移植過boa作爲http服務器,一方面給網頁使用,另一方面給其他在http之上封裝的協議使用。什麼協議是加掛在http裏面的呢,這裏就不說了,我們業內覆蓋範圍最廣的協議就是在http的body裏面開發的,那不是本文重點。

當時移植boa我不在,沒怎麼參與,只是後續的工作中偶爾遇到問題會看看boa移植的代碼,所以對boa我也不是非常熟悉,只知道維護了幾個鏈表作爲消息隊列,按照一定順序去處理,用select實現的網絡觸發。裏面的邏輯非常的複雜,分段讀取分段分析。真大神的代碼一般都是這樣的。

這次移植我上網查了一些資料,大家也都能看到。最終我把目標放在了boaappweb上,原因就是關於它們的資料比較多。boa我用過爲什麼沒直接選它呢?我下面貼上一張圖大家就明白爲什麼加上appweb了。

看到appweb的用戶列表後你有理由忽略它嗎?EmbedThis敢說appweb是當今世界上最快的嵌入式網絡服務器真的得做的差不多。這麼活躍的一個服務器,真的需要考慮。boa在2005年就已經停止了維護,對很多appweb官網上提到的功能我想boa應該是做不到的。例如今天看到的html5特有的WebSocket,boa肯定就做不到,新版本的http,新的加密,boa應該也做不到。但是面對嵌入式網絡服務器,二者都能滿足,因爲嵌入式網絡服務器的主要功能是最基本的簡單發送接收,只是爲了方便對設備的一些配合和觀察使用。這是boa的說明網站:http://www.boa.org/documentation/boa-1.html#ss1.1 這是appweb的使用網站:https://www.embedthis.com/appweb/doc/users/features.html 如果想看二者的詳細說明,可以看一下,說的比我說的好。

二者的源碼都可以在上面的網站上找到,boa直接選擇最新的版本,也就是2005年最後的版本:boa-0.94.13,appweb我選擇的是最新的發佈版本7.X:appweb-7.X。下面要開始真正的落到實處的去比較。做了很多的嘗試,有的現在看是彎路,這些都跳過,直接說自己的看法。先撤一句別的,以後再用開源項目,我肯定會先看*readme*

嵌入式最關心的首先就是大小。二者源文件大小差異巨大,boa只有436K,僅僅appweb就有44.2M,更不用說一定要有的配套工程makeme-1.0.1和pak-1.0.1了,這兩個各自又都是40M。要知道appweb的使用是需要配合makeme和pak的,這兩個也都是EmbedThis開發的配套工程,方便網絡服務器的開發,真的是方便了非常多。appweb裏面有很多的例子來表現它強大的功能。很直接,源文件差異巨大,但這不足以說明問題,因爲我們最終要的是可執行的elf文件。boa在debug模式下直接編譯出是342K,strip之後是80K,如果裁剪還會更小,真的可以做到60K一下。配置boa.conf,就可以在瀏覽器上訪問了,如下圖這樣。

jQuery完全可以網頁,沒有問題,放心,boa完全hold住了。我用交叉編譯文件大小基本一致。關於boa.conf的內容這裏就不做詳細說明了,非常好理解。

appweb比boa要複雜很多,這是在我走了一圈後發現了。appweb在ubantu和arm上都能啓動http服務,但是之後我不知道怎麼去處理index.html!最後只能踏實下來去看官網和各個*readme*,不看真的不懂,在build裏會編譯出來很多可執行程序。

上圖是在bin文件夾裏的內容,看看有幾個能夠執行的吧。file一下發現很多,appman、appweb、appweb-esp、authpass、http和makerom。一臉懵逼,即使你./appweb listen 192.168.1.8:80啓動了http服務,那又有什麼用!老實回去看*readme*們吧。配置文件得提一下,名字叫做appweb.conf,配置文件的開頭也需要仔細看。下面我粘貼出來一個。

這個文件的路徑是src/server/appweb.conf,如果find一下的話會發現有更多的appweb.conf在sample和test文件夾裏面。這個時候如果你讀一下根目錄下的README.md就會明白了,我貼出來那一段話。

按我現在做過幾個嘗試後來看,這句話就是說,我提供了很多的sample,你跳轉到那個sample文件夾,啓動appweb服務的時候,程序就會加載哪個文件夾下的appweb.conf作爲啓動配置。事實就是這樣的。

當我仔細的看了幾個配置文件和*readme*後,我發現單單編譯一個appweb是不可行的,這樣可能無法去通過瀏覽器登陸。需要下載並安裝makeme和pak工程。就連appweb最好也是install一下,先make,再make install,把appweb指令安裝到系統裏面。makeme和pak直接安裝對應的README.md去操作即可。

都執行完之後就可以去appweb裏面的sample文件夾看看各種各樣的例子了。我也沒試完,今天只試了websocket的3個。

作爲一個眼界侷限於嵌入式linux應用層開發的我來說,第一眼我就相中了帶echo字段的那個文件夾。誰知道這是最新潮的一個,我不知道是幸運還是不幸(哈哈)。說明裏說的明確,就是回顯而至,就是下圖這種效果。

chrome根據html中WebSocket函數連接我的appweb,然後發送“這就是html5所特有的Webocket嗎?”字符串,appweb收到後回覆“沒錯! 這就是html5所特有的Webocket!”就這麼一個簡單的功能。最開始只有第一行,後面這個交互是實現不了的,最後組長一起幫忙解決的。看控制檯,以前只是知道,但沒怎麼用過。之所以無法實現是因爲js的src指定的網址是google的,無法訪問,獲取不到,最後給換成了國內的,也就解決了。

上圖是websockets-chat實現的功能,羣發。websockets-output是讀文件裏的內容發送。這個東西挺厲害哈。裏面的原理我暫時還不太懂,不知道socket是怎麼來回發的,萬變不離我們linux這個宗。

後續還得繼續研究appweb的大小還不好說,因爲我還不知道怎麼個啓動方式。它是一種非常巧妙靈活的方式,這一點你如果跑過幾個sample之後就會體會到。我之前沒有見到過。簡單看gcc的appweb這個文件是64K,交叉編譯後是942K,appweb沒有strip,交叉編譯已經strip。這個還沒有到最後定論。

時間倉促,先寫到這裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章