Dieser Artikel wurde maschinell übersetzt.

Windows Azure

CyberNanny: Remotezugriff über verteilte Komponenten

Angel Hernandez Hernandez

Downloaden des Codebeispiels

Dieser Artikel ist über eine Anwendung namens CyberNanny, die ich vor kurzem schrieb mich meine kleine Tochter Miranda zu Hause von überall aus der Ferne sehen können zu jeder Zeit.Es ist in Visual C++ (MFC) geschrieben, und es besteht aus verschiedene Technologien wie Kinect und seine SDK, Windows Azure, Webservices und Office-Automatisierung über Outlook.Das Projekt ist auf CodePlex gehostet (cybernanny.codeplex.com), wo Sie schauen Sie sich den Code oder dazu beitragen.

Bevor ich in die Schrauben und Muttern der Anwendung bekommen, erkläre ich kurz die Technologien verwendet, um es zu bauen.

C++ wurde — und immer noch ist — das Arbeitstier in vielen Software-Shops.Damit sei nimmt die neue Norm C++-11 die Sprache auf ein neues Niveau.Drei Begriffe zu beschreiben wäre es modern, elegant und extrem schnell.Auch MFC ist immer noch rund, und Microsoft hat aktualisieren es mit jeder neuen Version der Visual C++-Compiler.

Die Kinect-Technologie ist erstaunlich, um es gelinde auszudrücken; Es ändert die Art, wie, die wir mit spielen und Computern zu interagieren.Und mit Microsoft, die Entwicklern mit einem SDK, stellt sich eine neue Welt der Möglichkeiten zum Erstellen von Software, die menschlichen Interaktion erfordert.Interessant ist, aber das Kinect SDK COM (wie auch das neue Programmiermodell in Windows 8, Windows Runtime, oft abgekürzt als WinRT genannt) basiert auf.Das SDK ist auch Microsoft .net Framework-Sprachen zur Verfügung.

Windows Azure ist, dass die Microsoft Platform as a Service (PaaS) anbieten, die schon seit ein paar Jahren.Es bietet eine Reihe von Dienstleistungen, die es ermöglichen, Lösungen auf ihnen (z. B. Compute und Speicher).Eine der Anforderungen, die ich mit CyberNanny war die zuverlässige Zustellung von Nachrichten über eine hochverfügbare Warteschlange und Windows Azure bereitstellt.

Die native Verwendung und Nutzung von Webdiensten ist möglich mit dem Windows Web Services API (WWSAPI), die mit Windows 7 eingeführt wurde.Ich habe einen Blogbeitrag (bit.ly/LiygQY), beschreibt eine Windows Presentation Foundation (WPF)-Anwendung implementieren eine native Komponente mithilfe von WWSAPI.Es ist wichtig zu erwähnen, dass WWSAPI am Betriebssystem integriert ist so keine Notwendigkeit besteht, herunterladen oder installieren alles andere als im Windows SDK (Header und Lib-Dateien).

Weshalb also das Rad neu erfinden?Eine der Voraussetzungen für CyberNanny die Möglichkeit zum Senden von E-mails mit angehängten Bildern war, also anstelle des Schreibens meiner eigenen e-Mailing-Klasse, ich es vorgezogen, die Funktionalität von Outlook für diese Aufgabe wiederverwenden.Dies erlaubte mir, auf das Ziel konzentrieren: Aufbau einer verteilten Anwendungs für die Suche nach meinem Baby.

Dieser Artikel ist in vier Hauptabschnitte unterteilt:

  1. Überblick über die allgemeinen architektonischen Lösung
  2. Kinect-Architektur
  3. Lokal eingesetzten Komponenten (nativ)
  4. Wolke gehosteten Komponenten (Leitung)

Überblick über die allgemeinen architektonischen Lösung

Das CyberNanny-Konzept ist einfach (wie im Abbildung 1), aber es hat auch einige bewegliche Stücke.Es kann kurz beschrieben werden, als dicke Client geschrieben in Visual C++, die Bilder über den Kinect-Sensor erfasst.Diese Rahmen können später als Bild verwendet werden, die an eine neue E-mail in Outlook durch Automatisierung komponiert befestigt ist.Die Anwendung ist über ausstehende Anforderungen von notifizierten Laichen einen Thread ausgelöst von einem Timer, der abfragt, eine Warteschlange in Windows Azure gehostet.Die Anfragen werden in der Warteschlange über ein ASP.NET Web-Seite eingefügt.

CyberNanny ArchitectureAbbildung 1 CyberNanny Architektur

Beachten Sie, dass, um ausführen und testen die Lösung, die Sie haben müssen:

  • Kinect Sensor (Ich habe auf meiner Xbox 360)
  • Windows Azure-Abonnement
  • Kinect SDK

Kinect-Architektur

Nachdem ein gutes architektonisches Verständnis wie Dinge funktionieren und wie sie umgesetzt werden können, ist entscheidend für Entwicklungsprojekte und Kinect ist in diesem Fall keine Ausnahme.Microsoft hat eine SDK für Entwickler von verwaltetem und systemeigenem Code bereitgestellt.Ich werde beschreiben die Architektur Kinect baut auf, wie in Abbildung 2.

Kinect for Windows ArchitectureAbbildung 2 Kinect für Windows-Architektur

Die eingekreisten Zahlen in Abbildung 2 , der dem folgenden entsprechen:

  1. Kinect-Hardware: Die Hardware-Komponenten, einschließlich der Kinect und der USB-Hub, der durch den Sensor an den Computer angeschlossen ist.
  2. Kinect-Treiber: Die Windows-Treiber für die Kinect, die als Teil des Installationsvorgangs SDK installiert werden, wie in diesem Artikel beschrieben.Die Kinect-Treiber unterstützen:
    • Das Kinect-Mikrofon-Array als ein Kernel-Modus-audio-Gerät, das Sie über die standard-audio-APIs in Windows zugreifen können.
    • Audio- und Videostreaming Steuerelemente für streaming Audio und Video (Farbe, Tiefe und Skelett).
    • Gerät-Enumeration Funktionen, mit die eine Anwendung mehr als eine Kinect verwenden können.
  3. Audio- und video-Komponenten: Die Kinect Natural User Interface (NUI) für Skelett Tracking, Audio, Farbe und Tiefe Bildgebung.
  4. DirectX Media-Objekt (DMO): Dies ist zum Mikrofon Array Strahl Formen und Audioquelle Lokalisierung.
  5. Windows 7 standard-APIs: Audio, Rede und Medien-APIs in Windows 7, in Windows 7 SDK und Microsoft Speech SDK beschrieben.

Ich werde zeigen, wie ich verwendet die Videokomponente zur Erfassung von Frames, die dann als JPEG-Dateien für e-Mail-Zwecke gespeichert werden.Die Wiedergabe der aufgezeichneten Frames erfolgt über Direct2D.

Die Nui_Core-Klasse habe ich eine Klasse namens Nui_Core, die die Funktionalität kapselt brauchte ich von der Kinect-Sensor.Es gibt eine Instanz dieses Objekts in der Anwendung.Die Anwendung interagiert mit dem Sensor über ein Mitglied des Typs INuiSensor, das physische Gerät darstellt, die an den Computer angeschlossen.Es ist wichtig, dass das Kinect SDK COM-basiert, daher ist die oben genannten Schnittstelle — sowie alle anderen COM-Schnittstellen in der gesamten Anwendung verwendet — wird verwaltet durch intelligente Zeiger (z. B. CComPtr <INuiSensor> M_pSensor;).

Die Schritte beginnen, Erfassen von Bildern mit dem Sensor sind:

  1. Prüfen Sie, ob durch Aufrufen von NuiGetSensorCount ist ein Sensor zur Verfügung.
  2. Erstellen Sie eine Instanz des Kinect Sensors durch Aufrufen von NuiCreateSensorByIndex.
  3. Erstellen Sie ein Factory-Objekt für die Erstellung von Direct2D-Ressourcen durch Aufrufen von D2D1CreateFactory.
  4. Erstellen Sie Ereignisse für jeden Stream von der Anwendung benötigt.
  5. Öffnen Sie die Ströme durch Aufrufen von NuiImageStreamOpen.
  6. Verarbeiten Sie die erfassten Daten (Frame).

Sobald die Nui_Core Instanz eingerichtet ist, Sie können problemlos ein Bildschirmfoto auf Nachfrage durch Aufrufen der TakePicture-Methode, wie in Abbildung 3.

Abbildung 3 die TakePicture-Methode

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);
  }
}

Beachten Sie, dass einen intelligenten Zeiger um die Bytes des Bildes als auch die Anzahl der Bytes, die darauf kopiert werden gespeichert, und dann diese Informationen wird verwendet, um die Bitmap Handwerk.

Es ist wichtig zu erwähnen, dass sobald Sie mit dem Sensor fertig sind, es heruntergefahren werden, durch Aufrufen von NuiShutdown, und Griffe, die verwendet wurden freigegeben werden müssen.

Die DrawDevice-Klasse als bereits erwähnt, werden die Darstellungsfunktionen von Direct2D bereitgestellt; Deshalb ist ein weiterer Support-Klasse ist für den Einsatz in Verbindung mit Nui_Core erforderlich. Diese Klasse ist verantwortlich dafür, dass Ressourcen für stehen die erfassten Frame, z. B. eine Bitmap in diesem Fall.

Die drei wichtigsten Methoden sind Initialize, Draw und EnsureResources. Ich werde jede beschreiben.

Initialisieren: Dies ist verantwortlich für die Einrichtung von drei Mitgliedern des Typs DrawDevice. Die Anwendung hat ein Registerkarten-Steuerelement mit drei Registerkarten, so es ein Mitglied für jede Registerkarte (Farbe, Skelett- und Tiefe Blick gibt). Jede Registerkarte ist ein Fenster, das für die Wiedergabe ihrer entsprechenden Frame verantwortlich ist. Die InitializeColorView in den folgenden Code dargestellt ist ein gutes Beispiel für die Initialize-Methode:

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));
}

Zeichnen: Dies macht einen Frame auf der entsprechenden Registerkarte. Es nimmt als Argument eine Byte * vom Sensor erfasst. Die nachfolgende Darstellung der statische Bilder genau wie in den Filmen entstammt die Wirkung der Animation.

EnsureResources: Dies ist verantwortlich für das Erstellen einer Bitmap, wenn von der Draw-Methode angefordert.

Lokal eingesetzten Komponenten (nativ)

Das CyberNanny-Projekt umfasst Folgendes:

  • Anwendung (Application)
    • CCyberNannyApp (geerbt von CWinApp). Die Anwendung hat ein einzelnes Element des Typs Nui_Core für die Interaktion mit dem Sensor.
  • Benutzeroberflächenelemente
    • CCyberNannyDlg (Hauptfenster, geerbt von CDialogEx)
    • CAboutDlg (über Dialog, geerbt von CDialogEx)
  • Web Service-Client
    • Nach der Ausführung von WSUTIL gegen einen Dienst, Web Services Description Language (WSDL) Dateien automatisch generiert. Diese Dateien enthalten die Nachrichten, Strukturen und durch den WCF-Webdienst verfügbar gemachten Methoden.
  • Outlook-Objekt-Klassen
    • Um einige der Outlook-Objekte zu bearbeiten, müssen Sie diese in Ihr Projekt importieren, indem Sie ActiveX-Steuerelement-Assistenten "MFC-Klasse hinzufügen" auswählen. In dieser Lösung verwendeten Objekte sind Anwendung, Attachment, Mail-Element und Namespace.
  • Proxy
    • Dies ist eine benutzerdefinierte Klasse, die die Schaffung der erforderlichen Objekte zur Interaktion mit WWSAPI kapselt.
  • Hilfsklassen
    • Diese Klassen werden verwendet, um die Funktionalität der Anwendung, wie z. B. die Umwandlung einer Bitmap in ein JPEG zur Reduzierung der Dateigröße, bietet einen Wrapper um E-mails versenden mit Outlook interagieren und so weiter zu unterstützen.

Wenn die Anwendung gestartet wird, treten die folgenden Ereignisse:

  1. Eine neue Fensternachricht wird durch Aufrufen von Register-WindowMessage definiert. Dies ist für das Hinzufügen von Elementen zu der Liste der Ereignisse, wenn eine Anforderung verarbeitet wird. Dies ist erforderlich, weil UI-Elemente aus einem Thread verschiedene vom UI-Thread kann nicht direkt geändert, oder Sie werde einen illegalen threadübergreifende Aufruf entstehen. Dies wird von der MFC-messaging-Infrastruktur verwaltet.
  2. Sie initialisieren Sie Ihre Nui_Core-Member und richten Sie ein paar der Timer (eine Aktualisierung der aktuellen Zeit auf der Statusleiste und einer, die startet einen Thread für die Warteschlange zu überprüfen, ob eine ausstehende Anforderung abrufen).
  3. Der Kinect-Sensor startet Aufnahme Rahmen, aber die Anwendung kein Bild zu nehmen, es sei denn, es eine Anforderung in der Warteschlange liegt. Die Methode ProcessRequest ist verantwortlich für eine Aufnahme, serialisieren das Bild auf die Festplatte, schreiben in der Ereignisanzeige und Anpfiff der Outlook-Automatisierung, wie in Abbildung 4.

Abbildung 4 der Aufrufs des Methode 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();
  }
}

Der Rahmen, die ursprünglich von Kinect erfasst ist eine Bitmap, die ungefähr 1,7 MB groß ist (das ist nicht bequem zum Versenden per e-Mail und muss daher in ein JPEG-Bild konvertiert werden). Es ist auch auf den Kopf nach unten, so dass eine 180 °-Drehung erforderlich ist. Dies geschieht durch machen ein paar Anrufe in GDI +. Diese Funktionalität ist in der ImageFile-Klasse gekapselt.

Die ImageFile-Klasse fungiert als Wrapper für Vorgänge mit GDI +. Die beiden wichtigsten Methoden sind:

  1. SerializeImage: Diese Methode übernimmt eine Shared_ptr <BYTE>, die die Bytes des aufgezeichneten Frames als Bild serialisiert werden soll, sowie die Anzahl der Bytes enthält. Das Bild wird auch gedreht, indem die RotateFlip-Methode.
  2. GetEncoderClsid: Wie bereits erwähnt, ist die Bild-Dateigröße zu groß, um als Anlage verwenden – daher muss es codiert werden in ein Format mit einem geringeren Platzbedarf (JPEG, zum Beispiel). GDI + stellt eine GetImageEncoders-Funktion, mit der Sie herausfinden, welche Encoder auf dem System verfügbar sind.

Bisher habe ich behandelt, wie die Anwendung den Kinect-Sensor nutzt und wie die Einzelbilder aufgenommen verwendet werden, um ein Bild zum Versenden per e-Mail erstellen. Als nächstes zeige ich Ihnen, wie den WCF-Dienst auf Windows Azure gehostet aufgerufen.

WWSAPI, eingeführt in Windows 7 kann Entwickler systemeigene Anwendungen, Web- oder WCF-Dienste in eine einfache und bequeme Weise, zu konsumieren, ohne sich Gedanken über die Kommunikationsdaten (Sockel). Der erste Schritt für Service konsumieren ist, haben eine WSDL mit WSUTIL verwendet, die wiederum Codegen C-Code für Webdienstproxys, produziert die Datenstrukturen, die vom Dienst erforderlich sind. Es gibt eine Alternative namens Casablanca (bit.ly/JLletJ), die Cloud-basierte Client-Server-Kommunikation in systemeigenem Code unterstützt, aber es war nicht verfügbar, wenn ich CyberNanny schrieb.

Es ist üblich, die WSDL-Datei abzurufen und zu speichern, und verwenden Sie dann die WSDL-Datei und die zugehörigen Schema-Dateien als Eingabe für die WSUTIL zu speichern. Ein Aspekt zu berücksichtigen ist Schemata. Sie zusammen mit der WSDL-Datei heruntergeladen werden müssen, wird sonst WSUTIL beschweren, wenn Sie die Dateien zu erstellen. Sie können problemlos die erforderlichen Schemas feststellen, durch Überprüfen des XSD-Parameters im Schemaabschnitt der WSDL-Datei:

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

Die resultierenden Dateien können zur Projektmappe hinzugefügt werden, und Sie fahren Sie dann mit Ihren Service über die Codegen-Dateien aufrufen. Vier Haupt-Objekte sind zur Verwendung mit WWSAPI erforderlich:

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

Diese Objekte ermöglichen die Interaktion zwischen Client und Dienst. Ich habe die Funktionalität, um den Dienst in der Proxy-Klasse aufrufen.

Die meisten WWSAPI Funktionen zurückgeben ein HRESULT, so Debuggen Fehler kann eine schwierige Aufgabe. Aber keine Angst, denn Sie die Ablaufverfolgung aus der Windows-Ereignisanzeige aktivieren und sehen genau, warum eine bestimmte Funktion nicht. Navigieren Sie zum Aktivieren der Ablaufverfolgung zu Anwendungs- und Dienstprotokolle | Microsoft | WebServices | Ablaufverfolgung (Maustaste darauf, um es zu aktivieren).

Das betrifft ziemlich genau die systemeigenen Komponenten der Lösung. Weitere Informationen finden Sie auf den Quellcode auf der oben genannten CodePlex-Website. Der nächste Abschnitt ist über die Windows-Azure-Komponente der Lösung.

Wolke gehosteten Komponenten (Leitung)

Bitte beachten Sie, dass dies keine umfangreiche Anleitung, Windows Azure, sondern eher eine Beschreibung der Windows-Azure-Komponenten in CyberNanny. Weitere ausführliche und detaillierte Informationen finden Sie in der Windows-Azure-Website unter windowsazure.com. Windows Azure Platform (Abbildung 5) umfasst folgenden Leistungen:

  • Windows Azure Compute
  • Windows Azure-Speicher
  • Windows-himmelblau SQL-Datenbank
  • Windows Azure AppFabric
  • Windows Marketplace himmelblau
  • Windows himmelblau virtuelles Netzwerk

Windows Azure Platform Services
Abbildung 5 Windows Azure-Plattform Services

CyberNanny hat nur eine Web-Rolle, die zwei Kerne um hohen Verfügbarkeit zu garantieren reserviert hat. Wenn einer der Knoten ausfällt, schaltet die Plattform in den gesunden Knoten. Die Web-Rolle ist eine ASP-Anwendung, und es fügt nur Nachrichtenelemente in einer Warteschlange. Diese Nachrichten werden dann vom CyberNanny heraus geholt. Es gibt auch ein WCF-Dienst, der die Rolle "Webserver" gehört, die für die Behandlung der Warteschlange verantwortlich ist.

Beachten Sie, dass eine Windows-Azure-Rolle eine einzelne Komponente in der Wolke ist, wobei jede Instanz einer Wolke entspricht, einer virtuellen Maschine (VM)-Instanz ausgeführt wird. CyberNanny der Fall dann habe ich zwei VMs zugeteilt.

CyberNanny hat eine Web-Rolle, ist eine Web-Anwendung (ob es nur ASPX-Seiten oder WCF-Dienste ist) auf dem IIS ausgeführt wird. Es ist erreichbar über HTTP/HTTPS-Endpunkte. Es gibt auch eine andere Art von Rolle, die eine Worker Rolle aufgerufen hat. Es ist eine Hintergrundverarbeitungsanwendung (z.B. für Finanzberechnungen), und hat auch die Fähigkeit, Internetanbindung und interne Endpunkte verfügbar machen.

Diese Anwendung nutzt auch eine Warteschlange von Windows Azure Storage, die zuverlässige Speicherung und Übermittlung von Nachrichten ermöglicht bereitgestellt. Die Schönheit der Warteschlange ist, dass Sie keinen speziellen Code nutzen schreiben nicht. Weder sind Sie verantwortlich für die Einrichtung der Datenspeicherung mit einer bestimmten Struktur ähneln eine Warteschlange, da alle diese Funktionalität der Plattform Out of the Box bereitgestellt wird.

Neben Hochverfügbarkeit und Skalierbarkeit zählt die Vorteile von Windows Azure Platform die Gemeinsamkeit zu tun, Dinge wie entwickeln, testen und Bereitstellen von Windows Azure Lösungen von Visual Studio, als auch mit .net als Lingua Franca Lösungen erstellen.

Es gibt einige andere coole Features, die ich lieben würde, CyberNanny, wie z. B. Bewegungserkennung und Spracherkennung hinzu. Wenn Sie diese Software verwenden, oder zu dem Projekt beitragen möchten, wenden Sie sich bitte, dies zu tun. Die verwendeten Technologien sind ab sofort und auch wenn sie "anders" aussehen, können sie zusammenarbeiten und spielen schön miteinander.

Viel Spaß beim Programmieren!

Angel Hernandez Matos ist ein Manager im Team bei Avanade Australien Unternehmensanwendungen. Er hat seinen Sitz in Sydney, Australien, aber ursprünglich aus Caracas, Venezuela. Er ist seit acht aufeinander folgenden Jahren ein Microsoft MVP-Auszeichnung-Empfänger und ist derzeit ein MVP für Visual C++. Er hat Software geschrieben da er 12 Jahre alt war und hält sich für ein "existenzielle Geek".

Unser Dank gilt den folgenden technischen Experten für die Durchsicht dieses Artikels: Scott Berry, Diego Dagum, Yonghwi Kwon und Nish Sivakumar