Windows Azure

CyberNanny:透過分散式元件進行遠端存取

Angel Hernandez Hernandez

下載代碼示例

這篇文章是關於應用程式調用 CyberNanny,其中最近寫,請允許我以遠端查看我的寶貝女兒米蘭達在家裡從任何地方的任何時候。它寫在 Visual c + + (MFC),它包括不同的技術,如 Kinect 和 SDK,Windows Azure、 Web 服務和通過 Outlook 的辦公自動化。該專案位於 CodePlex (cybernanny.codeplex.com),您可以在簽出代碼或對它作出貢獻。

我進入螺母和螺栓的應用程式之前,我來簡要地解釋來建造它所採用的技術。

C + + 已 — — 仍然是 — — 在許多軟體商店健將。新的標準 c + + 11 說,將語言帶到一個新的水準。三個詞來描述它會是現代、 優雅和速度極快。此外,MFC 是仍左右,微軟已被升級它的每個新版本的 Visual c + + 編譯器。

Kinect 技術很神奇,至少可以說,; 它改變我們與遊戲和電腦進行交互的方式。而微軟為開發商提供一個 SDK,一個新世界的機會就亮相創建需要的人機交互的軟體。有趣的是,雖然 Kinect SDK 基於 COM (以及新的程式設計模型,在 Windows 8,稱為 Windows 運行時,通常縮寫為 WinRT)。此外可以使用 Microsoft.net 框架語言 SDK。

Windows Azure 是作為一種服務 (PaaS) 的 Microsoft 平臺,提供的已有幾年。它提供了一系列的服務,使建築物在其上 (如計算和存儲) 的解決方案。我在 CyberNanny 的要求之一就是通過一個高度可用的佇列,消息的可靠的傳遞和 Windows Azure 提供的。

可以使用 Windows Web 服務 API (WWSAPI),是推出 Windows 7 的本機使用與 Web 服務的消費。我有一篇博客文章 (bit.ly/LiygQY),描述了 Windows 的演示文稿基礎 (WPF) 應用程式實現使用 WWSAPI 的本機組件。很重要,何況 WWSAPI 內置於作業系統,所以無需下載或安裝任何事,除了 Windows SDK (對於頁眉和 lib 檔)。

何必浪費時間重造呢?其中一項規定 CyberNanny 是發送帶附帶照片的電子郵件的能力,所以而不是寫我自己的電子郵件類,我傾向于重用此任務的 Outlook 提供的功能。這讓我專注的主要目標:建立分散式應用程式照顧我的孩子。

這篇文章分為四個主要部分:

  1. 一般建築解決方案的概述
  2. Kinect 的體系結構
  3. 本地部署的元件 (本機)
  4. 雲託管元件 (託管)

一般建築解決方案的概述

CyberNanny 概念很簡單 (如中所示圖 1),但它也有一些感人的作品。它可以簡要描述為寫在 Visual c + +,捕獲幀通過 Kinect 感應器的胖用戶端中。以後可以作為圖片附加到新的電子郵件,通過自動化組成在 Outlook 中使用這些幀。代理程式更新的產卵的計時器,輪詢佇列寄宿在 Windows Azure 觸發一個執行緒掛起的請求有關。請求插入到該佇列通過 ASP.NET Web 頁中。

CyberNanny Architecture
圖 1 CyberNanny 體系結構

請注意,為了運行和測試的解決方案,您必須:

  • Kinect 感應器 (我用我在 Xbox 360 上的一個)
  • Windows Azure 訂閱
  • Kinect SDK

Kinect 的體系結構

有的東西是如何工作和如何實施好建築瞭解至關重要的發展專案,而在這種情況下 Kinect 也不例外。微軟為託管代碼和本機代碼的開發人員提供了一個 SDK。我將描述 Kinect 建成後,該體系結構,如中所示圖 2

Kinect for Windows Architecture
圖 2 Kinect Windows 體系結構

帶圓圈的數位圖 2 對應于以下內容:

  1. Kinect 硬體:硬體元件,包括 Kinect 和通過該感應器連接到電腦的 USB 集線器。
  2. Kinect 的驅動程式:Windows 驅動程式的 Kinect,其中作為 SDK 安裝過程的一部分進行安裝,這篇文章中所述。Kinect 驅動程式支援:
    • 作為一個核心模式的音訊裝置,您可以通過在 Windows 中的標準音頻 Api 訪問的 Kinect 麥克風陣列。
    • 音訊和視頻流的流音訊和視頻 (顏色、 深度和骨架) 的控制項。
    • 使應用程式可以使用多個 Kinect 的設備枚舉函數。
  3. 音訊和視頻元件:Kinect 自然使用者介面 (NUI) 為骨架的跟蹤、 音訊、 顏色和深度成像技術。
  4. DirectX 媒體物件 (DMO):這是麥克風陣列波束形成和音訊源定位。
  5. Windows 7 標準 Api:音訊、 演講和媒體在 Windows 7 中,Windows 7 SDK 和 Microsoft 語音 SDK 中所述的 Api。

我將演示如何我用於視頻元件捕獲的幀,然後將保存為 JPEG 檔的電子郵件的目的。捕獲的幀的呈現方式是通過 Direct2D 完成的。

Nui_Core 類寫了一個類名為 Nui_Core,其中封裝我從 Kinect 感應器所需的功能。有此物件在應用程式中的單個實例。通過 INuiSensor,它表示的物理設備連接到電腦的類型的成員與感應器,該應用程式進行交互。它是重要的是要記住 Kinect SDK 是基於 COM 的因此,上述的介面 — — 以及一切其他 COM 介面用於整個應用程式 — — 由智慧指標 (例如,CComPtr <INuiSensor> m_pSensor;)。

要啟動與感應器捕獲幀的步驟如下:

  1. 請檢查是否有可用的感應器通過調用 NuiGetSensorCount。
  2. 通過調用 NuiCreateSensorByIndex 創建的 Kinect 感應器的實例。
  3. 工廠為創建物件的 Direct2D 資源創建通過調用 D2D1CreateFactory。
  4. 創建所需的應用程式的每個流的事件。
  5. 通過調用 NuiImageStreamOpen 打開流。
  6. 將捕獲的資料 (幀) 的過程。

一旦 Nui_Core 實例的設置,您可以輕鬆地圖片對採取需求通過調用 TakePicture 方法,如中所示圖 3

圖 3 TakePicture 方法

 

void Nui_Core::TakePicture(std::shared_ptr<BYTE>& imageBytes, int& bytesCount) {
  byte *bytes;
  NUI_IMAGE_FRAME imageFrame;
  NUI_LOCKED_RECT LockedRect;
  if (SUCCEEDED(m_pSensor->NuiImageStreamGetNextFrame(m_hVideoStream,
    m_millisecondsToWait, &imageFrame))) {
    auto pTexture = imageFrame.pFrameTexture;
    pTexture->LockRect(0, &LockedRect, NULL, 0);
    if (LockedRect.Pitch != 0) {
      bytes = static_cast<BYTE *>(LockedRect.pBits);
      m_pDrawColor->Draw(bytes, LockedRect.size);
    }
    pTexture->UnlockRect(0);
    imageBytes.reset(new BYTE[LockedRect.size]);
    memcpy(imageBytes.get(), bytes, LockedRect.size);
    bytesCount = LockedRect.size;
    m_pSensor->NuiImageStreamReleaseFrame(m_hVideoStream, &imageFrame);
  }
}

注意您通過將圖像,以及將被覆制到它的位元組數的位元組存儲的智慧指標,然後使用此資訊來手工你點陣圖。

這是重要的是要提到一旦您已經使用感應器完,它必須通過調用 NuiShutdown,關閉和被使用的控制碼需要釋放。

DrawDevice 類如先前所述,由 Direct2D ; 提供呈現功能 這就是為什麼支援另一類是需要與 Nui_Core 一起使用。此類是負責確保有資源可供捕獲的幀,如點陣圖,在這種情況下。

初始化、 繪製和 EnsureResources 的三種主要方法。我將描述每個。

初始化:這是負責設置三種類型的成員的 DrawDevice。應用程式有三個選項卡上,使用索引標籤控制項,所以有成員,每個選項卡 (顏色、 Skeletal 和深度視圖)。每個選項卡是一個視窗,則負責呈現其相應的框架。下面的代碼所示的 InitializeColorView 是一個好例子的調用初始化方法:

 

bool Nui_Core::InitializeColorView() {
  auto width = m_rect.Width();
  auto height = m_rect.Height();
  m_pDrawColor = std::shared_ptr<DrawDevice>(new DrawDevice());
  return (m_pDrawColor.get()->Initialize(m_views[TAB_VIEW_1]->m_hWnd,
  m_pD2DFactory.p, 640, 320, NULL));
}

繪製:這將呈現正確選項卡上的幀。它作為參數的位元組 * 由感應器捕獲。就像電影、 動畫的影響來自靜態幀的連續呈現。

EnsureResources:這是負責創建一個點陣圖時繪製方法請求的。

本地部署的元件 (本機)

CyberNanny 專案包括以下內容:

  • Application
    • CCyberNannyApp (CWinApp 從繼承)。應用程式具有與感應器進行交互的單個成員的類型 Nui_Core。
  • UI 項目
    • CCyberNannyDlg (主視窗,從 CDialogEx 繼承)
    • CAboutDlg (關於對話方塊,從 CDialogEx 繼承)
  • Web 服務用戶端
    • 對一項服務,Web 服務描述語言 (WSDL) 執行 WSUTIL 後自動生成的檔。這些檔包含郵件、 結構和 WCF Web 服務所公開的方法。
  • Outlook 物件類
    • 為了操縱某些 Outlook 物件,您必須將其導入到您的專案通過從 ActiveX 控制項嚮導中選擇"添加 MFC 類"。在此解決方案中使用的物件在應用程式中,附件,訊息項目和 Namespace。
  • Proxy
    • 這是一個封裝的與 WWSAPI 進行交互所需的物件創建的自訂類。
  • 説明器類
    • 這些類用於支援功能的應用程式,例如將點陣圖轉換為 JPEG 來減小檔案大小,提供一個包裝要發送的電子郵件和對話模式使用 Outlook,等等。

當應用程式啟動時,會發生以下事件:

  1. 新視窗消息是通過調用登記冊 WindowMessage 定義的。這是用於將項添加到事件處理請求時的清單。這是必需的因為您不能直接修改從不同的 UI 執行緒的執行緒的 UI 元素,或者你會招致非法的跨執行緒調用。這是由 MFC 消息基礎結構管理。
  2. 您初始化您的 Nui_Core 成員,並設置幾個計時器 (一個用於更新狀態列,另一種的序幕輪詢佇列,以檢查是否存在掛起的請求的執行緒的目前時間)。
  3. Kinect 感應器啟動捕獲的幀,但應用程式不會照一張相,除非有一個請求在佇列中。ProcessRequest 方法負責拍照,序列化到磁片,事件檢視器寫入和開球 Outlook 自動化,如中所示的圖片圖 4

圖 4 ProcessRequest 方法調用

 

void CCyberNannyDlg::ProcessRequest(_request request) {
  if (!request.IsEmpty) {
    auto byteCount = 0;
    ImageFile imageFile;
    std::shared_ptr<BYTE> bytes;
    m_Kinect.TakePicture(bytes, byteCount);
    imageFile.SerializeImage(bytes, byteCount);
    EventLogHelper::LogRequest(request);
    m_emailer.ComposeAndSend(request.EmailRecipient,
    imageFile.ImageFilePath_get());
    imageFile.DeleteFile();
  }
}

 

最初由 Kinect 捕獲的幀是一個約 1.7 mb 大小 (這不方便用電子郵件發送,因此需要轉換為 JPEG 圖像) 中的點陣圖。它也是上行下來,所以 180 ° 旋轉是必需的。這是通過使對 GDI + 調用幾個。此功能是在 ImageFile 類中封裝的。

ImageFile 類用作包裝器,用於執行使用 GDI + 的操作。這兩個主要方法是:

  1. SerializeImage:此方法採用這樣 <BYTE>,其中包含已捕獲幀作為圖像,要序列化的位元組數以及的位元組的計數。通過調用 RotateFlip 方法還旋轉圖像。
  2. GetEncoderClsid:如所述,圖像的檔案大小是太大了,作為附件使用 — — 因此,它需要被編碼為較小的占地面積 (例如 JPEG) 格式。GDI + 提供了一個 GetImageEncoders 函數,可以讓你發現哪些編碼器是系統中可用的。

到目前為止,我已經介紹應用程式如何利用 Kinect 感應器和如何使用捕獲的幀創建為用電子郵件發送圖片。接下來,我將介紹如何調用 Windows Azure 上主持的 WCF 服務。

WWSAPI,介紹了在 Windows 7 中,允許本機開發人員消耗 Web 或 WCF 服務以方便快捷的方式,而無需擔心通信 (通訊端) 的詳細資訊。消費服務的第一步是要有一個 WSDL 中使用的 WSUTIL,進而將產生的服務代理,它是服務所需的資料結構的代碼產生器的 C 代碼。那裡是稱為卡薩布蘭卡的替代方法 (bit.ly/JLletJ),它支援基於雲計算的用戶端-伺服器通信在本機代碼中,但當我寫 CyberNanny 時,它並不是可用。

這是普遍獲得 WSDL,並將它保存到磁片,並作為輸入 WSUTIL,然後使用 WSDL 檔案和相關的架構檔。需要考慮的一個方面是架構。他們必須下載和 WSDL,否則 WSUTIL 會抱怨時生成的檔。通過檢查中的 WSDL 檔案的架構部分的.xsd 參數,您可以輕鬆確定所需的架構:

wsutil /wsdl:cybernanny.wsdl /xsd:cybernanny0.xsd cybernanny1.xsd cybernanny2.xsd cybernanny3.xsd /string:WS_STRING

生成的檔可以添加到解決方案,,然後你繼續通過代碼產生器檔調用您的服務。四個主要物件都需要與 WWSAPI 一起使用:

  1. WS_HEAP
  2. WS_ERROR
  3. WS_SERVICE_PROXY
  4. WS_CHANNEL_PROPERTY

這些物件允許在用戶端和服務之間的相互作用。我把在一起放在調用代理類中的服務的功能。

大部分的 WWSAPI 函數返回 HRESULT,因此調試錯誤可以是一個具有挑戰性的任務。但怕未必,因為您可以啟用從 Windows 事件檢視器跟蹤並查看給定的函數失敗的確切原因。要啟用跟蹤,請導航到應用程式和服務日誌 |微軟 |Web 服務 |跟蹤 (按右鍵它,使它)。

這差不多覆蓋了該解決方案的本機組件。有關詳細資訊,請參閱上述 CodePlex 網站上的原始程式碼。下一節是關於解決方案的 Windows Azure 元件。

雲託管元件 (託管)

請注意這不是廣泛的教程,Windows Azure,但相當的 CyberNanny 中的 Windows Azure 元件的說明。深入、 詳細的詳細資訊,請參閱 Windows Azure Web 網站 windowsazure.com。Windows Azure 平臺 (圖 5) 包括以下服務:

  • Windows Azure 計算
  • Windows 天青存儲
  • Windows 天青 SQL 資料庫
  • Windows Azure AppFabric
  • Windows 天青市場
  • Windows 天藍色的虛擬網路

Azure Platform Services
圖 5 Windows 天青平臺服務

CyberNanny 僅有一個已分配兩個內核,以保證高可用性的 Web 角色。如果其中一個節點出現故障,該平臺將切換到健康節點。ASP.NET 應用程式,網站角色,它只插入一個佇列的訊息項目。這些消息從 CyberNanny 然後彈出。另外還有一個 WCF 服務,它是負責處理該佇列的 Web 角色的一部分。

注意 Windows Azure 角色是雲計算的每個實例與相對應的烏雲中運行的虛擬機器 (VM) 實例的單個元件。然後,在 CyberNanny 的情況下,我已經分配兩個虛擬機器。

CyberNanny 有一個是 (無論它是只 ASPX 頁或 WCF 服務) 的 Web 應用程式的 Web 角色在 IIS 上運行。它是可通過 HTTP/HTTPS 終結點進行訪問。也有另一種類型的角色,被稱為一個工人的角色。這是處理應用程式 (例如,對於財務計算),背景和它還能夠公開面向 Internet 的和內部的終結點。

此應用程式還利用提供的 Windows Azure 存儲,從而允許可靠的存儲和傳遞的郵件的佇列。您不必編寫任何專門的代碼,以利用它美麗的佇列。既不是你負責設立的具有特定結構的資料存儲,類似于一個佇列,因為這所有的功能都現成的平臺提供的。

高可用性和可擴充性,除了 Windows Azure 平臺所提供的優點之一就是開發、 測試和部署 Windows Azure 解決方案從 Visual Studio 中,以及作為共同語言了.net 等事情要生成的解決方案的共性。

有愛運動檢測和語音辨識等將添加到 CyberNanny,其他一些很酷的功能。如果您想要使用本軟體或對該專案作出貢獻,請隨時自由地這樣做。所採用的技術目前可用,即使它們看上去"不同的",他們可以進行交互操作,並與另一個很好地發揮。

編碼愉快 !

Angel Hernandez Matos  是 Avanade 澳大利亞在企業應用程式團隊經理。他設在悉尼,澳大利亞,但最初是從委內瑞拉的卡拉卡斯。他已連續八年被 Microsoft MVP 獎得主,目前在 Visual c + + 中的 MVP。他一直在寫軟體由於他 12 歲那年,認為自己"生存的狂人"。

由於下面的技術專家,檢討這篇文章:斯科特 · 貝瑞、 聖地牙哥 Dagum、 Yonghwi Kwon 和 Nish Sivakumar