基於.NET的可運行於樹莓派的輕量型Web伺服器
最近在業餘時間玩玩樹莓派,剛開始的時候在樹莓派裡寫一些基於wiringPi庫的C語言程式來控制樹莓派的GPIO引腳,從而控制LED發光二極體的閃爍,後來覺得,是不是可以使用HTML5+jQuery等流行的前端技術做一個簡單的Web站點,讓樹莓派搭載這個站點,通過手機或者平板電腦來控制樹莓派。經過一番調研,考慮如下:
- 使用Apache或者Nginx搭建一個Web伺服器
- 優點:伺服器實現相對成熟
- 缺點:偏重,而且與樹莓派的互動需要涉及Service呼叫,而實現RESTful服務對於Apache或者Nginx需要額外的元件支援,要付出一定的學習成本
- 使用Python+Flesk
- 優點:技術相對成熟,也有很多成功應用案例
- 缺點:對於我來說需要額外學習Python語言
基於這樣的前提,鑑於目前Mono在Linux下的出色表現,想想還是自己使用.NET開發一個輕量型的Web伺服器吧,第一期版本讓它既支援靜態檔案的訪問服務,也支援RESTful API的呼叫,在RESTful API中可以暴露訪問樹莓派GPIO引腳的介面,供HTML5+jQuery的單頁面應用呼叫,於是也就實現了在任意裝置上通過瀏覽器來控制樹莓派的目的。
Raspkate專案
Raspkate專案的名字,我想就是兩個方面:Rasp,它來源於樹莓派的英文名字Raspberry Pi,有表示“小、輕量”的意義,而Kate則寓意能夠充分發揮開發者的想象,對其進行擴充套件和定製。Raspkate就是這樣一款基於.NET Framework、由C#開發的輕量型Web伺服器,它的核心部分是一個
開源地址
Raspkate專案是開源的,程式碼庫地址是:https://github.com/daxnet/raspkate,所使用的許可協議是GPL2.0,(因為其所使用的與樹莓派相關的元件是第三方的由GPL2.0授權的開源庫),因此,不能在商業環境中使用此專案。
應用場景
您可以在以下場景中使用Raspkate:
- 在自己的應用程式中實現內建的Web伺服器(Self-Hosting)
- 將Raspkate寄宿在Windows Service中,向外提供RESTful服務
- 將Raspkate寄宿在Windows Service中,向外提供靜態Web頁面請求服務
- 將Raspkate作為樹莓派中的一個獨立的小型Web伺服器,提供控制樹莓派GPIO的Web使用者介面
整體架構
下圖展示了Raspkate專案的整體架構設計:
可以看到,在Raspkate核心部分就是一個HTTP Listener元件,並且由Module和Configuration支撐Raspkate完成HTTP請求處理。每個模組可以包含多個HTTP Handler,這在定義模組的時候可以對多個HTTP Handler進行註冊。
Raspkate配置資訊(也就是上圖中的Configuration)非常簡單,下圖就是這個配置資訊的型別檢視,在RaspkateConfiguration物件上,設定了HttpListener所使用的Prefix,而Modules部分則指定了Raspkate掃描可用模組的路徑,IsRelative指定模組路徑是否是相對的。
以下是一個標準的Raspkate配置檔案:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="raspkateConfiguration" type="Raspkate.Config.RaspkateConfiguration, Raspkate"/> </configSections> <raspkateConfiguration xmlns="urn:Raspkate.Config" prefix="http://127.0.0.1:9023/"> <modules> <add path="modules"/> </modules> </raspkateConfiguration> </configuration>
程式碼使用
首先,使用Git客戶端將程式碼庫克隆到本地:
git clone https://github.com/daxnet/raspkate
然後,在裝有MSBuild的Windows機器上,執行build.bat命令:
- build.bat All - 這將編譯所有模組,並將模組的二進位制檔案複製到modules目錄下
- build.bat Minimal - 這僅編譯核心模組(不包含類似樹莓派支援等擴充套件模組)
如果是在裝有Mono的Linux機器上,則相應地執行build.sh即可。
在編譯完成之後,進入bin目錄,執行RaspkateService.exe即可(注意:如果是在樹莓派中執行,並且希望載入樹莓派支援模組,則需要通過 sudo ./RaspkateService.exe 命令執行,以獲得root許可權)。在成功啟動後,你應該看到類似下面的畫面:
這時,開啟瀏覽器,在瀏覽器中輸入http://127.0.0.1:9023,您應該可以看到類似以下的畫面:
這表示您已經成功執行Raspkate服務,此頁面顯示了執行伺服器相關的資訊。注意:如果你希望你的Raspkate服務能夠在同網路的其它機器訪問,請在執行RaspkateService.exe之前,將RaspkateService.exe.config檔案中的Prefix設定修改為:http://+:9023/。但這樣做可能會牽涉到使用者訪問控制的問題,如果將Prefix改為該值後,出現Raspkate無法啟動的問題,請先在Command Line執行:
netsh http add urlacl url="http://+:9023/" user=everyone
演示
這裡有幾張螢幕截圖,展示了Raspkate提供的相關功能。
獲取並顯示樹莓派資訊
以下螢幕擷取自我的手機瀏覽器,分別顯示了我的樹莓派系統資訊、樹莓派主機板資訊以及樹莓派中所有引腳的名稱、型別和電平值列表。
使用HTML5+jQuery控制發光二極體的點亮和熄滅狀態
前端是一個寄宿在Raspkate上的一個HTML5+jQuery的單頁面應用,後端是執行Raspkate的樹莓派。