本文章是由機器翻譯。

.NET Micro Framework

利用 Azure Blob 儲存體的 Gadgeteer 創作 IoT 裝置

Benjamin Perkins

下載代碼示例

在未來的五年中,互聯網連接的設備的數量將人類總人口的三倍以上。這些設備不會局限于智慧手機和平板電腦,我們使用現在,但是將包含嵌入到家電、 電梯、 汽車、 商業環境、 臂帶、 衣服和更多的額外設備。這些設備將捕獲資訊關於能源消耗、 速度、 溫度、 各種氣體、 血壓、 心率、 程式或硬體異常,和你可以想像的任何東西的存在。

這些設備所捕獲的資料需要存儲在一個高度可擴展、 高度可靠、 高度可用的環境中。可用我的意思是一旦資料存儲,它賴以存在的平臺應該提供服務、 功能和處理能力進行分析,從學習和行動上所收集的資料。在這篇文章,我要向您展示如何使用: — — 快速的硬體開發平臺基於 Microsoft.NET 微框架 — — 以建造的裝置,用於捕獲資料 ; 微軟 Azure 存儲來存儲資料 ; 和 Azure 平臺進行分析和使用資料。按照下面的流程,你就開始你的旅程的物聯網 (物聯網) 一代。

我將討論那些三個元件、:、 Azure Blob 存儲一些資料獲取和分析元件的詳細的 Azure 平臺。此外,我將提供詳盡的代碼級別說明如何使用: 將圖像插入到 Azure Blob 存儲容器。

: 提供的 GHI 電子有限責任公司 (bit.ly/11ko85B),包括套件、 模組和主機板 (如 FEZ 猛禽,FEZ 水螅和用於此專案的蜘蛛 FEZ) 用於創建許多不同類型的設備。這些設備可以用於捕獲資料的眾多品種。例如,他們可能會用於氣體傳感模組檢測氣體空氣、 運動檢測器或用於測量相對溫度和濕度的模組中。FEZ 蜘蛛相容模組需要完成這篇文章中討論的專案如下:相機、 一個乙太網插孔和一個電源模組。第一節,看看你如何配置模組和開發準備捕獲的圖像插入到 Azure Blob 存儲容器所需的代碼。

圖 1 顯示的專案配置。除了相機、 乙太網插孔和電源,也是在設備 ; 上顯示的 IP 位址以及日期和時間的字元顯示 LED 光源,視覺的通知 ; 和一個按鈕觸發捕獲圖片和過程,將其上載。

FEZ 蜘蛛配置為拍一張照片和 Azure Blob 容器中存儲
圖 1 FEZ 蜘蛛配置為拍一張照片和 Azure Blob 容器中存儲

在安裝.NET 微架構後, GHI 二進位檔案 (包 2014 R5) 和.NET: 到你的開發機器上的 SDK 開始通過在Visual Studio2012 中創建一個新專案 (Visual Studio2013年也支援,雖然不是很廣泛的測試),然後選擇: 範本。一旦你給了該專案的名稱,該嚮導將引導您完成選擇主機板與微架構版本。然後,使用工具箱添加模組,以建立您的設備,類似于所示圖 1

當模組所有物理上連接到主機板上的插槽時,開始要實現專案目標所需的代碼更改 — — 連接到網路和拍一張照片。使用網路連接的模組是 ethernetJ11D,支援常見的 RJ-45 網路介面卡。下面是一些代碼,從而使 ethernetJ11D 模組執行連接並獲得分配的 IP 位址:

ethernetJ11D.NetworkInterface.Open();
ethernetJ11D.NetworkSettings.EnableDhcp();
ethernetJ11D.NetworkSettings.EnableDynamicDns();
ethernetJ11D.UseDHCP();

當然,這並不是唯一的途徑來實現連接 ; 然而,它是什麼效果最好,在這方面最簡單。

一旦連接,您可能想要執行簡單的 System.Net.Http­WebRequest 請求,類似于所示圖 2,以確保按預期方式工作與互聯網的連接。

圖 2 測試您的互聯網連接

void makeGenericHTTPRequest()
{
  try
  {
    string url = "https://www.contoso.com/";
    using (var req = System.Net.HttpWebRequest.Create(url))
    {
      using (var res = req.GetResponse())
      {
        Debug.Print("HTTP Response length: " 
          + res.ContentLength.ToString());  }
    }   
  }
  catch (Exception ex)
  {
    Debug.Print(ex.Message);
  }
}

請注意,HTTPS 協定不會在這裡工作,而無需一些配置。如果您收到異常 (如"類型 'System.NotSupportedException' 發生在 Microsoft.SPOT.Net.Security.dll 的第一次機會異常",必須更新設備上的 SSL 種子。您可以使用.NET 微架構部署工具 (MFDeploy.exe),位於 C:\Program 檔 (86) \Microsoft.NET Micro Framework\v4.3\Tools 目錄中。與設備連接到開發電腦,導航到目標 |管理設備鍵並按一下更新 SSL 的種子,如中所示圖 3。當這樣做了時,HTTPS 應按預期方式工作。

.NET 微架構部署工具 MFDeploy
圖 3.NET 微架構部署工具 MFDeploy

一旦你已經連接到網路和網際網路配置並且正常工作,它是重要的是在設備上設置的日期和時間。正如討論以後的日期和時間是的動議付諸表決 Blob REST API 所需的部件 (bit.ly/1BTiIu9),您會使用 Azure Blob 容器中插入圖像。若要設置的日期和時間,請使用 TimeServiceSettings 類,它是的 Microsoft.SPOT.Time 命名空間的一部分,如下所示:

TimeServiceSettings time = new TimeServiceSettings()
{
  ForceSyncAtWakeUp = true
};
IPAddress[] address = Dns.GetHostEntry("time.windows.com").AddressList;
time.PrimaryServer = address[0].GetAddressBytes();
TimeService.Settings = time;
TimeService.SetTimeZoneOffset(0);
TimeService.Start();

一旦運行了 TimeService,您可以檢索使用標準的 DateTime.UtcNow 或 DateTime.Now 屬性的目前時間戳。

捕獲映射使用 GHI FEZ 蜘蛛相容的觀景窗需要一行代碼:

camera.TakePicture()

記得我添加按鈕模組到該設備。它是從該按鈕按下事件調用 TakePicture 方法時。當該圖片是採取,相機。PictureCaptured 事件觸發,並反過來調用方法 camera_PictureCaptured (觀景窗的寄件者,gt。圖片 e)。我使用標準的 C# 代碼將事件處理常式和方法將壓制和捕獲的事件連結到其相應的方法:

button.ButtonPressed += button_ButtonPressed;
camera.PictureCaptured += camera_PictureCaptured;

Camera_PictureCaptured 方法接收 gt。圖片作為一個參數。正在轉換為 byte [] 陣列,使用 e.PictureData 屬性後, 的圖像資料傳遞到 Azure Blob 容器中插入的自訂方法。讀這篇文章,這一進程可能看起來很複雜,但它是真的非常簡單,如中所示圖 4。此外,您可以下載代碼示例,伴隨著這篇文章,看看整件事。

圖片捕獲流程
圖 4: 圖片捕獲流程

圖 5 顯示用於使用 AzureBlob 類,在哪裡創建授權標頭的下一節中討論的代碼 (bit.ly/1z0gThK) 和調用圖像插入到 Azure Blob 容器的 REST API。

圖 5 將圖像插入到 Azure Blob 存儲

void insertImageintoAzureBlob(GT.Picture picture)
{
  AzureBlob storage = new AzureBlob()
  {
    Account = "ACCOUNT-NAME",
    BlobEndPoint = "https://ACCOUNT-NAME.blob.core.windows.net/",
    Key = "CONTAINER PRIVATE KEY"
  };
  if (ethernetJ11D.IsNetworkUp)
  {
    storage.PutBlob("CONTAINER-NAME", picture.PictureData);
  }
  else
  {
    characterDisplay.Print("NO NETWORK CONNECTION");
  }
}

從設備的角度來看,這是它。該設備是現在組裝和連接到互聯網,和邏輯來捕獲映射並將它用正確的格式發送到放 Blob REST API 是最完美的。接下來,我創建的 Azure Blob 存儲帳戶和容器和配置需插入圖像的代碼。

蔚藍的 Blob 存儲

Azure 的 Blob 存儲是一個有用的服務,提供圖像、 文檔、 視頻等等從任何地方使用 HTTP 或 HTTPS 訪問。例如,如果您有一個名為 home.bmp 的圖像,一個公共的 Azure 存儲帳戶命名為 contosox 和一個名為 blob,從瀏覽器訪問的.bmp 檔的容器就像 HTTP://contosox.blob.core.windows.net/blob/home.bmp 進入瀏覽器或從 HTML 或原始程式碼引用 URL 一樣簡單。

插入、 清單、 下載和刪除從 Azure Blob 容器標準的.NET 應用程式中的 blob 完成使用 Azure.NET 存儲用戶端庫通過 Microsoft.Windows­Azure.Storage 大會。此程式集,不幸的是,不是可用或相容.NET 微架構,或者: 設備上。這不是問題,不過,由於 Azure Blob 存儲服務提供可公開訪問其他 Api 支援相同的插入,清單、 下載和刪除功能 (見 bit.ly/1xPN55v 的詳細資訊)。因此,消費這些從物聯網設備的功能是作為一個標準的 REST API 呼叫一樣簡單。

吧如何創建 Azure Blob 存儲帳戶和容器 ; 如何創建使用.NET 微框架 4.3 ; 其餘部分 API 授權標頭 和怎麼去上一節中捕捉到的圖片上傳到 Azure Blob 容器。

創建從 Azure 管理主控台中的 Azure 存儲帳戶,然後按一下 + Add 按鈕以添加容器。在此示例中,存儲帳戶名稱是 contosox 和容器是 blob,如中所示圖 6

創建用於存儲從物聯網設備的拍攝 Azure 存儲容器
圖 6 創建用於存儲從物聯網設備的拍攝 Azure 存儲容器

中的示例圖 7 是所需消耗放 Blob REST API 的數目。將圖像的名稱追加到 URL 所示圖 6 和 System.Net.HttpWebRequest 類的 GetRequestStream 方法調用返回一個 System.IO.Stream 物件。並成功地使用 System.IO.Stream 類的 Write 方法將圖像保存到 Azure Blob 容器。請注意使用 Write 方法的 blobContent 參數是 byte [] 內容載于 gt。Picture.PictureData 屬性。

圖 7 消費付諸表決的 Blob REST API

Uri uri = new Uri("ACCOUNT-URL\CONTAINER\" + "IMAGE-NAME");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
try
{
  using (Stream requestStream = request.GetRequestStream())
  {
    requestStream.Write(blobContent, 0, blobLength);
  }
}
catch (WebException ex)
{
  Debug.Print(ex.Message);
}

不太複雜 ; 它非常類似于一個 REST API 呼叫從一個標準的ASP.NET或 Microsoft.NET 框架的應用程式。差異 — — 和複雜性 — — 來自授權標頭,則在此處定義的創建:

Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"

當創建了 Azure Blob 容器時,它是公開的也就是說任何人都可以從中讀取通過前面提到的 URL。然而,添加或刪除一個 Blob 需要授權標頭,要請求中。在頁眉中的 SharedKey 值通知伺服器共用的便捷鍵存在,並且應該用於請求的身份驗證。SharedKey 是關聯到 Azure 存儲帳戶,在此示例 contosox,並獲得通過點擊管理給定的存儲帳戶的便捷鍵。訪問主鍵文字方塊中,在說明中包含的值圖 8,是用於訪問該容器的 SharedKey。

獲得 SharedKey 必要的 Azure 存儲身份驗證
圖 8 獲得 SharedKey 必要的 Azure 存儲身份驗證

此外,授權標頭的簽名部分必須基於雜湊的消息身份驗證代碼 (HMAC) 使用數量的請求屬性,使用 System.Se 計算構造­curity.Cryptography.HashAlgorithm.ComputeHash 方法和編碼的 System.Convert.ToBase64String 方法。

我會打破那一點點,入手構建授權標頭所需的元件。這些包括屬性,如內容類型內容長度 x-ms-版本,共用便捷鍵和許多其他標頭值,在詳細介紹了 bit.ly/1BTiIu9。更重要的屬性之一是 x-ms-日期,這是您必須設置的日期和時間在設備的初始化過程中的原因。X-ms-日期必須是 UTC 時間戳記。在設備上的時間戳記必須少於 15 分鐘的差速器相比,託管存儲服務的伺服器上的時間戳記。存儲服務可確保請求不超過 15 分鐘 ; 如果時間框架有一個更大的差別,該服務返回 403 (禁止)。其他屬性不會改變和可以硬編碼或檢索從某些其他來源 — — 一個設定檔,例如。

一旦授權標頭的格式正確,這需要大約 35 行代碼,它需要進行雜湊處理和編碼要求。使用.NET 框架的完整版本,所需的代碼類似于這樣:

using (HashAlgorithm hashSHA256 = 
  new HashAlgorithm(HashAlgorithmType.SHA256))
{
  Byte[] dataToHmac = 
    System.Text.Encoding.UTF8.GetBytes(canonicalizedstring);
  signature = 
    Convert.ToBase64String(hashSHA256.ComputeHash(dataToHmac));
}

雜湊授權標頭所需的 System.Security.Cryptography.HashAlgorithm.ComputeHash 方法存在的微.net 版本 4.3 (bit.ly/1wIl77O) 和雜湊簽名是有效的選項。然而,我選擇開發 WebAPI 接受作為參數的構造的標頭,對其進行編碼,散列值並將它返回到與放 Blob REST API 呼叫一起使用:。我選擇了這種方法,主要是因為我想要測試: 從調用的 WebAPI,發現這是一個邏輯的地方去做。下面的代碼演示如何 WebAPI 被稱為從: 設備:

string queryString = "constructedHeader=" + constructedHeader;
Uri uri = new Uri("https://*??.azurewebsites.net/api/HMACSHA256?" + queryString);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
reader.Close();
response.Close();

來自 WebAPI,作為你的回應可能已經知道,是一個 JSON 物件,responseFromServer 字串的內容。還有在開源 MicroJSON 圖書館 microjson.codeplex.com,這對於分析結果的 WebAPI 和得到的雜湊和編碼的授權標頭值非常有用:

var jdom = (JObject)JsonHelpers.Parse(responseFromServer);
var hashedvalue = jdom["HashedValue"];
StringBuilder authorizationHeader = new StringBuilder("{0} {1}:{2}")
  .Replace("{0}", SharedKeyAuthorizationScheme)
  .Replace("{1}", "contosox")
  .Replace("{2}", hashedValue);

此外,使用字串。IndexOf 方法與該字串的組合。子字串的方法可以達到同樣的效果。

該字串。格式方法當前不支援在.NET 微架構 ; 因此,用 StringBuilder.Replace 來構造 authorizationHeader。如前所述,授權標頭包含 SharedKeyAuthorizationScheme,這是組合的 SharedKey 或 SharedKeyLite ; Azure 博客存儲名稱,contosox ; 和編碼和散列簽名。當授權標頭的格式設置正確時,將它添加到放 Blob REST API 請求物件並執行它。一旦通過身份驗證的圖像,它被添加到 Blob 容器:

request.Headers.Add("Authorization", authorizationHeader);

在此示例中,觸發圖像插入 Azure Blob 容器的事件,是按下一個按鈕。我選擇了這種方法只是為了創建此概念驗證專案。真實世界中的實現可能會改用議案、 氣體、 大氣壓力、 溫度或濕度感應器。真的,任何一個模組存在的違反了給定的閾值時觸發事件可以用來拍攝照片,然後將其上載到 Azure。在許多情況下,物聯網設備的要求,等等將不包括圖像,只有存儲捕獲的資料,例如溫度、 速度、 氣體水準、 時間。這類資料可以存儲在資料庫中通過一個簡單的 WebAPI 呼叫,一個與我討論以前,但無需授權標頭,因為沒有 Blob 或圖像相似。

現在,捕獲資料並將其存儲在 Azure 平臺上,問題是要用它來做什麼以及如何分析和從中吸取教訓。下一節中,我將提供一些思路和結論性的想法,繼續的審查、 發展和未來的討論。我的意圖在這裡一定沒有顯示的端到端的物聯網解決方案,所有的細節,但願意提供精神食糧,推動這些概念。

Microsoft Azure

大多數 IT 專業人員有一個好主意,"大資料"一詞意味著什麼。然而,如何使用,收穫它是可能不清楚。當我剛開始學習大資料時,最初的障礙,我發現我可以使用用於處理工具 (如 HDInsight、 功率雙、 活動中心、 機器學習或流分析的資料來源。儘管如此,開始使用這些服務,學習的特性和功能,但沒有的資料上運行我的演算法大源,我很快失去了興趣。我終於明白什麼是物聯網 — — 這些互聯網連接的設備 — — 可用於收集資料和建立與這些 Azure 服務一起使用的資訊一大來源。

很明顯每個這些服務旨在隨著物聯網在心目中,考慮事件集線器和流分析即時決策和 HDInsight 和機器學習分析大量的資料,尋找長期趨勢。例如,事件集線器,專門用來攝取數以百萬計的每秒設備觸發事件,為大型物聯網解決方案提供了必要的規模。對於公司和企業已經實施物聯網解決方案,或在開始創建自己的物聯網戰略,事件集線器將一個偉大的開始,來管理長期增長和規模。此外,流分析與事件集線器集成在一起,可以提供到事件集線器設備所提交的資料的即時分析。流分析可以被發送到事件的集線器與歷史資料對資料進行比較,並主動發送警報,如果目前的模式不匹配的歷史。想像一下,這個可能性。

組織和即使有較大的資料池的人 — — 不一定由物聯網設備收集 — — 可以使用該資料的分析的 HDInsight 或機器學習服務。HDInsight 是一個 Hadoop 的解決方案,可以擴展到兆百萬位元組甚至 petabytes 的資料需求,和 Azure 平臺提供了幾乎無限量的存儲和計算資源。使用 HDInsight 來查找隱藏的商機一起或單獨從機器學習以挖掘資料以説明預測未來的趨勢和行為。這些服務向您介紹新的物聯網時代通過創新的方式,開闢了巨大的可能性,所有的一切都可以在通過功率雙方便使用者的方式提出了一種公開以前看不見的資訊。

接近尾聲了

這篇文章的目的是去解釋如何配置使用: 物聯網設備,將其連接到互聯網上, 傳圖片到 Azure Blob 容器中的雲。將資料從一個設備插入到任何互聯網訪問的資料來源需要只是簡單的 Web­API 呼叫和實際設備硬體的配置非常簡單,拖動並將模組從一個工具箱功能表放到設計範本。在此示例中的唯一的真正的複雜性成立放 Blob 其餘 API 授權標頭,它必須在特定的格式進行編碼和散列使用 System.Security.Cryptography.HashAlgorithm.ComputeHash 方法通過 WebAPI 或使用.NET 微框架類。

我也總結了一些 Azure 平臺服務,並建立其存儲和分析的資料捕獲從物聯網設備的擴展能力。一旦您的設備開始捕獲足夠數量的資料,你就可以使用 Azure 平臺服務,如事件集線器和流分析進行即時分析和 HDInsight 和機器學習進行長期調查。發現的秘密隱藏在大量的生成、 存儲、 處理和呈現資訊然後可以用於業務決策、 預測和説明您企業的戰略取得成功。這樣吧 !


Benjamin Perkins 是微軟和 IIS、 NHibernate 和微軟 Azure 三本書的作者的高級技術支援升級工程師。他目前正在寫 C# 並行的 C# 6.0 版本出版的書。聯繫到他在 benperk@microsoft.com

感謝以下的微軟技術專家對本文的審閱:馬丁 Grasruck 和科林 ·Miller