Raspkate - 基於.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的單頁面應用調用,因而也就實現了在任意設備上經過瀏覽器來控制樹莓派的目的。git

Raspkate項目

Raspkate項目的名字,我想就是兩個方面:Rasp,它來源於樹莓派的英文名字Raspberry Pi,有表示「小、輕量」的意義,而Kate則寓意可以充分發揮開發者的想象,對其進行擴展和定製。Raspkate就是這樣一款基於.NET Framework、由C#開發的輕量型Web服務器,它的核心部分是一個HttpListener對象,經過多線程模型將HTTP請求異步委託給HttpListener執行。當一個HTTP請求被接受的時候,Raspkate會根據請求的格式或類型,分配特定的模塊(Module)對請求進行處理,而後將處理結果返回。若是請求的是一個文件,那麼Raspkate會返回文件的內容,若是是一個RESTful請求,則Raspkate會使用已經註冊的RESTful API控制器來處理這個請求,並將計算結果以JSON格式返回。github

開源地址

Raspkate項目是開源的,代碼庫地址是:https://github.com/daxnet/raspkate,所使用的許可協議是GPL2.0,(由於其所使用的與樹莓派相關的組件是第三方的由GPL2.0受權的開源庫),所以,不能在商業環境中使用此項目。後端

應用場景

您能夠在如下場景中使用Raspkate:瀏覽器

  1. 在本身的應用程序中實現內建的Web服務器(Self-Hosting)
  2. 將Raspkate寄宿在Windows Service中,向外提供RESTful服務
  3. 將Raspkate寄宿在Windows Service中,向外提供靜態Web頁面請求服務
  4. 將Raspkate做爲樹莓派中的一個獨立的小型Web服務器,提供控制樹莓派GPIO的Web用戶界面

總體架構

下圖展現了Raspkate項目的總體架構設計:服務器

ArchitectureOverview

能夠看到,在Raspkate核心部分就是一個HTTP Listener組件,而且由Module和Configuration支撐Raspkate完成HTTP請求處理。每一個模塊能夠包含多個HTTP Handler,這在定義模塊的時候能夠對多個HTTP Handler進行註冊。網絡

Raspkate配置信息(也就是上圖中的Configuration)很是簡單,下圖就是這個配置信息的類型視圖,在RaspkateConfiguration對象上,設定了HttpListener所使用的Prefix,而Modules部分則指定了Raspkate掃描可用模塊的路徑,IsRelative指定模塊路徑是不是相對的。多線程

image_thumb8

如下是一個標準的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權限)。在成功啓動後,你應該看到相似下面的畫面:

image_thumb1

這時,打開瀏覽器,在瀏覽器中輸入http://127.0.0.1:9023,您應該能夠看到相似如下的畫面:

image_thumb5

這表示您已經成功運行Raspkate服務,此頁面顯示了運行服務器相關的信息。注意:若是你但願你的Raspkate服務可以在同網絡的其它機器訪問,請在執行RaspkateService.exe以前,將RaspkateService.exe.config文件中的Prefix設置修改成:http://+:9023/。但這樣作可能會牽涉到用戶訪問控制的問題,若是將Prefix改成該值後,出現Raspkate沒法啓動的問題,請先在Command Line執行:

netsh http add urlacl url="http://+:9023/" user=everyone

演示

這裏有幾張屏幕截圖,展現了Raspkate提供的相關功能。

獲取並顯示樹莓派信息

如下屏幕截取自個人手機瀏覽器,分別顯示了個人樹莓派系統信息、樹莓派主板信息以及樹莓派中全部引腳的名稱、類型和電平值列表。

Screenshot_2016-03-20-20-23-10_com.a[1]    Screenshot_2016-03-20-20-23-57_com.a    Screenshot_2016-03-20-20-24-22_com.a[2]

使用HTML5+jQuery控制發光二極管的點亮和熄滅狀態

前端是一個寄宿在Raspkate上的一個HTML5+jQuery的單頁面應用,後端是運行Raspkate的樹莓派。

image_thumb9    image_thumb10

相關文章
相關標籤/搜索