前言: 話說前陣子爸爸家陽台不斷出現米奇老鼠,立刻清理陽台所有東西,然後又跟市政部門反映問題,可是情況還沒有好轉,米老鼠來完一隻又一隻,我爸陽台在老鼠界應該是網紅打卡聖地(誤),要不然就是米奇老鼠版米奇林三星餐廳(?) 雖然我們抓到了三隻,到上兩個禮拜為止還有至少一隻一直抓不到,每天淩晨還會來吃事後煙留下老鼠屎,真_北。 這隻老鼠對傳統攻擊有抗性,有IT9朋友前陣子用Raspberry pi自製了一台electric mouse trap ,用pi的超聲波雷達放在鞋盒裡,鞋盒裡有一堆食物,底部佈了鐵網,偵測到有老鼠進去以後立即關門通9V電,通個1分鐘再放牠離開,大推我自己也造一台 (Youtube片搜尋一大堆,人類真變態啊,朋友好變態啊)。可是我覺得這樣又好像有點太殘忍,不如先偵測牠們什麼時候來,嚇嚇牠們看看有沒有效果再說吧。 目的: 用Raspberry pi及手上有的感測器弄一隻放陽台用來偵測和嚇嚇老鼠的東西,並把紀錄圖像化到雲端給老爸使用。 邏輯及設計: 當老鼠進入偵測範圍,Motion Sensor偵測到生物活動Raspberry pi 處理來自Motion Sensor的訊號,如果夠強的話開始準備作出回應 Raspberry pi在Angry cats sounds中隨機選出叫聲,再經由Speaker輸出貓叫聲 Raspberry pi指示強光元件發出強光束照射目標 把偵測計數上傳到雲端圖表 材料: Sensor 在網路上看了一些Raspberry pi wild animal camera ,很多也是用Motion Sensor先偵測動物再來,我用的是PIR Motion Sensor被動式紅外線感測器,有低耗電成本便宜的好處。[1],而且可手動調整靈敏度及反應時間。 PIR Motion Sensor就是下面這個 圖片來源: learn.adafruit.com 可手動調整敏感度還有反應時間,這個有點不好調,要試好多遍才找到最佳位置。 可以在Raspbian中輸入pinout查詢GPIO避免插錯 圖片來源: learn.adafruit.com . 一台Raspberry pi 這次使用較舊的Raspberry pi model B+ 萬一老鼠生氣被咬爛錢包也不太痛 . 一張
在這篇文章中, 以下的小範例說明怎樣利用Web API回傳資料庫中的資料並以XML格式傳送。
事前準備:
Visual Studio 2010或以下的請先安裝ASP.NET MVC 4 (可到這裡下載)
實作:
- 建立WEB API專案:
- 在選單中選取"檔案"->新增專案, 選擇framework 為".NET Framework4", 然後選擇 "ASP.NET MVC 4 Web Application", 填寫名稱及選擇位置後按確定.
- 接下來會轉到New ASP.NET MVC 4 Project, 選擇Web API, View engine為Razor, 按"OK"
- 沒意外的話系統進入到開發畫面.
- 建立Model
接下來建立一個Account Model物件, 用來表示Account資料如何組成. - 在"方案總管"(Solution Explorer)中找到"Model"資料夾, 然後按右鍵->加入->類別
- 選擇 "類別", 輸入名稱"Accaoinfo.cs"後按確定.
- 在Model中輸入模型, 代碼如下
1 2 3 4 5 6
public int accaono { get; set; } public string eco { get; set; } public DateTime active_dt { get; set; } public DateTime inactive_dt { get; set; } public DateTime create_dt { get; set; } public string description { get; set; }
- 建立Controller
- 在"方案總管"中打開Controllers資料夾, 把ValuesController.cs更名變成AccaoController.cs
- 打開AccaoController.cs, 會發現已經幫你實作了幾種方法, 分別為Get, Post, Put, Delete. 其中Get可傳回特定資料或全部資料.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
// GET api/values public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } // GET api/values/5 { return "value"; } // POST api/values { } // PUT api/values/5 { } // DELETE api/values/5 { }
- 由於這個例子只需要回傳所有帳戶資料, 所以只用到第一個方法. 其他方法先放著不管. 為了使人比較容易看懂, 把Get()的名稱改為GetAllAccaos(), 把IEnumerable<string> 改為IEnumerable<accao>, 意思就是說使用 IEnumerable<accao>傳回整個accao物件的list.那IEnumerable又是什麼呢? 大概意思就像foreach一樣, 可以幫你產生N個accao物件的序列(List), 詳細一點的解釋可以參考這裡[1], 總之在這個例子就是要產生一堆Account的List, 就這麼簡單.
- 接下來當然要在GetAllAccaos() 方法中寫點查詢資料庫的code, 如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
public IEnumerable<accao> GetAllAccaos() { SqlConnection thisconnection = new SqlConnection(); thisconnection.ConnectionString = @"Data Source=xxx.xxx.xxx.xxx;Initial Catalog=xxxx;Persist Security Info=True;user ID=xxxx;Password=xxxx"; thisconnection.Open(); string sqlstr = " SELECT A.ACCAO_NO, A.ECO_NO, A.ACTIVE_DATE, A.INACTIVE_DATE, A.CREATE_DATE, PDV.CHI_DISPLAY_VALUES+' '+PDV.POR_DISPLAY_VALUES 'DISPLAY_VALUES' " + " FROM ACCAO A, PROJECT_DISPLAY_VALUES PDV " + " WHERE A.PROJECT_DISPLAY_NO = PDV.PROJECT_DISPLAY_NO "; SqlCommand cmd = new SqlCommand(sqlstr, thisconnection); SqlDataReader dr = cmd.ExecuteReader(); DataSet ds = new DataSet(); if (dr.Read()) { dr.Dispose(); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(ds); } List<accao> list = new List<accao>(); foreach (DataRow r in ds.Tables[0].Rows ) { list.Add(new accao{ accaono= int.Parse(r[0].ToString()),eco=r[1].ToString(), active_dt = DateTime.Parse(r[2].ToString()), inactive_dt = DateTime.Parse(r[3].ToString()), create_dt = DateTime.Parse(r[4].ToString()), description = r[5].ToString()}); } return list; }
- 這樣GetAllAccaos()就可以回傳Accao物件的序列了(list), 按下F5試跑跑看, 會出現以下畫面, 這個畫面實際上只是Controllers中HomeController.cs這個範例Class.
- 要真正使用Web API, 必須為每一項服務定義一個Uri. 在開發WebAPI的時候系統會自動為你的服務建立Uri, 例如這個回傳accao的例子api路徑是http://localhost:xxxx/api/accao/ 只要在任何browser輸入以上路徑, 就會回傳一個JSON或XML的結果 (抱歉檔案內容不能公開 XD),
大概像Microsoft官方的例子:[{"Id":1,"Name":"Tomato soup","Category":"Groceries","Price":1.39},{"Id":2,"Name": "Yo-yo","Category":"Toys","Price":3.75},{"Id":3,"Name":"Hammer","Category": "Hardware","Price":16.99}]
至於XML的話大概長這樣
- 這樣一隻簡單的Web API就完成了. 在進行系統開發的時候可以在你的系統中利用http協定呼叫服務, 就會回傳相對應的資料, 對於不同系統瀏覽同一data source也不用在每一個系統重新開發瀏覽資料用的元件了.
下一次會分享一下資料傳送加密的問題 ^__^
參考資料:
[1][.NET]快快樂樂學LINQ系列前哨戰-IEnumerable, IEnumerable<T>與Enumerable http://www.dotblogs.com.tw/hatelove/archive/2012/05/24/linq-enumerable-extension-method.aspx
[2] Your First ASP.NET Web API (C#) http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api
[3] 【翻譯】ASP.NET Web API入門: http://renren.it/a/bianchengyuyan/ASP/20120614/171182.html
[4] [ASP.NET MVC 4 Beta] 新增功能介紹(1) [Web API]http://www.dotblogs.com.tw/gelis/archive/2012/02/18/69602.aspx
[3] 【翻譯】ASP.NET Web API入門: http://renren.it/a/bianchengyuyan/ASP/20120614/171182.html
[4] [ASP.NET MVC 4 Beta] 新增功能介紹(1) [Web API]http://www.dotblogs.com.tw/gelis/archive/2012/02/18/69602.aspx
Comments
Post a Comment