C#寫的WebServices可運行于樹莓派

回到目錄

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的單頁面應用調用,于是也就實現了在任意設備上通過瀏覽器來控制樹莓派的目的。

回到目錄

Raspkate項目

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

開源地址

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配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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客戶端將代碼庫克隆到本地:

1
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執行:

1
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

出處:https://www.cnblogs.com/Leo_wl/p/5319481.html

轉載于:https://www.cnblogs.com/mq0036/p/11140947.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277375.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277375.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277375.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[導入]Ms XmlDom 異步裝載Xml文件

Ms XmlDom 異步裝載Xml文件文章來源:http://blog.csdn.net/net_lover/archive/2004/07/07/36015.aspx 轉載于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2004/07/07/816151.html

Django的View(視圖)

Django的View&#xff08;視圖&#xff09; 一個視圖函數&#xff08;類&#xff09;&#xff0c;簡稱視圖&#xff0c;是一個簡單的Python 函數&#xff08;類&#xff09;&#xff0c;它接受Web請求并且返回Web響應。 響應可以是一張網頁的HTML內容&#xff0c;一個重定向&am…

高質量的期貨研究報告去哪里找?

作者&#xff1a;虎虎的小尾巴鏈接&#xff1a;https://www.zhihu.com/question/25331621/answer/205439281來源&#xff1a;知乎著作權歸作者所有。商業轉載請聯系作者獲得授權&#xff0c;非商業轉載請注明出處。這是個好問題&#xff0c;我曾經或者直到現在我也一直在追求高…

oracle中偏移,怎么對相同的坐標點偏移?

上面說的第三步必須保證每個點不能重復分配&#xff0c;有些難度&#xff0c;還是用過程代碼吧。CREATE TABLE t_offset asselect 1 id,1.001 x,1.002 y, 10 mark from dualunion allselect 2011 id,1.001 x,1.012 y, 31 mark from dualunion allselect 3…

設計模式之--原型模式

1.原型模式定義 原型模式非常簡單&#xff0c;定義如下&#xff1a; 用原型實例指定創建對象的種類&#xff0c;并且通過拷貝這些原型創建新的對象 2.通用類圖 原型模式的核心是實現Cloneable接口&#xff0c;此接口為JDK提供的一個標識接口&#xff0c;只有實現了此接口的類才…

搜索目錄里所有文件(包括子目錄)

搜索目錄里所有文件(包括子目錄&#xff09; 資料來源&#xff1a;http://www.cnblogs.com/jjwwww/archive/2004/09/04/39559.aspx 用到兩個函數ParseDirectory 和CreatePathListvoidParseDirectory(stringpath, stringfilter) { strin…

一張圖理解buffer與cache

轉載于:https://blog.51cto.com/11193863/2169166

oracle服務器不識別tc服務,記一次ORACLE無法啟動登陸事故

打開XSHELL 登陸ORACLE用戶1.sqlplus scott/scott 提示登陸失敗2.sqplus / as sysdba 啟動數據庫提示3.查找日志操作日志&#xff1a;$ORACLE_HOME/startup.log啟動日志&#xff1a;$ORACLE_BASE/diag/rdbms/ora11g/ora11g/trace/alert_ora11g.log (ora11g為SID值)啟動日志如果…

重構(Refactoring)技巧讀書筆記 之二

重構&#xff08;Refactoring&#xff09;技巧讀書筆記 之二<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />General Refactoring Tips, Part 2本文繼續《重構&#xff08;Refactoring&#xff09;技巧讀書筆記 之一》&#xff…

史上最全的Angular.js 的學習資源

Angular.js 的一些學習資源 基礎 官方&#xff1a; http://docs.angularjs.org angularjs官方網站已被墻&#xff0c;可看 http://www.ngnice.com/&#xff1b;官方zip下載包 http://best.factj.com/dolymood/angular-packages&#xff0c;已增加docs服務&#xff0c;輸入地址即…

BMP位圖之8位位圖(三)

起始結構 typedef struct tagBITMAPFILEHEADER { WORD bfType; //類型名&#xff0c;字符串“BM”&#xff0c; DWORD bfSize; //文件大小 WORD bfReserved1; //保留字 WORD bfReserved2; //保留字 DWORD bfOffBits; //實際位圖數據的偏移字節數&#xff0c;即前三個部分長度之…

DNN 漢化中的問題????

今天看到了一份已經漢化過的DNN但是比較奇怪&#xff0c;當第一次運行后我所指定的新數據庫中并沒有添加新的內容&#xff0c;但是網站上的確是已經漢化過了的&#xff0c;不知道它把漢化的內容放到了哪里&#xff1f;&#xff1f;&#xff1f; 另外他所漢化界面的地方&#x…

php 打印對象詳細信息,php打印顯示數組與對象的函數詳解

php打印顯示數組與對象的函數詳解發布于 2014-11-17 18:55:49 | 699 次閱讀 | 評論: 0 | 來源: 網友投遞PHP開源腳本語言PHP(外文名: Hypertext Preprocessor&#xff0c;中文名&#xff1a;“超文本預處理器”)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點&…

ios開發-調用系統自帶手勢

在 iPhone 或 iPad 的開發中&#xff0c;除了用 touchesBegan / touchesMoved / touchesEnded 這組方法來控制使用者的手指觸控外&#xff0c;也可以用 UIGestureRecognizer 的衍生類別來進行判斷。用 UIGestureRecognizer 的好處在于有現成的手勢&#xff0c;開發者不用自己計…

Node.js 事件循環

Node.js 事件循環 Node.js 是單進程單線程應用程序&#xff0c;但是因為 V8 引擎提供的異步執行回調接口&#xff0c;通過這些接口可以處理大量的并發&#xff0c;所以性能非常高。 Node.js 幾乎每一個 API 都是支持回調函數的。 Node.js 基本上所有的事件機制都是用設計模式中…

全國翻譯專業資格(水平)考試

http://www.spta.gov.cn/moreksxx.jsp?lmCodeA02010205轉載于:https://www.cnblogs.com/Danilo/archive/2004/10/31/58821.html

linux文件句柄,【LINUX】使用lsof處理文件恢復、句柄以及空間釋放問題

曾經在生產上遇到過一個df 和 du出現的結果不一致的問題&#xff0c;為了排查到底是哪個進程占用了文件句柄&#xff0c;導致空間未釋放&#xff0c;首先在linux上面&#xff0c;一切皆文件&#xff0c;這個問題可以使用lsof這個BT的命令來處理(這個哈還可以來查詢文件句柄泄露…

android天氣查詢(二)之網絡json數據的獲取

前面一篇文章介紹了如何使用ksoap獲取天氣信息&#xff0c;但是使用的網絡資源受到了限制&#xff0c;所以我們這里會采用第二種方法&#xff0c;可以無限制的獲取。http://m.weather.com.cn/data/101010100.html 但是對應的101010100(北京)我們怎么獲取呢&#xff0c;還有就是…

累.....

今天我真的蔫了&#xff0c;好累&#xff0c;腦子也好濁&#xff0c;但是還好&#xff0c;最終達到了預期的目的。我終于把henry的dataGrid實現了&#xff0c;犯了低級錯誤&#xff0c;和好多人討論&#xff0c;但最終還是henry解決的。那一刻&#xff0c;真的好爽&#xff0c;…

001-pro ant design 升級2.0后變更

一、更新點 1、目錄調整 2、本地代理服務器調整 roadhog→umi 配置方式 在這個config/config.js配置 "proxy": { "/api": { "target": "http://jsonplaceholder.typicode.com/", "changeOrigin": true, "pathRewrite&q…