MSDN Magazin > Home > Ausgaben > 2008 > April >  Unterwegs: Konfigurieren mobiler Geräte
Unterwegs
Konfigurieren mobiler Geräte
Mike Calligaro

Willkommen bei „Unterwegs“, einer neuen Artikelreihe, die der Entwicklung für mobile Geräte gewidmet ist. Der Schwerpunkt wird hier vor allem auf Windows Mobile®-Telefonen und Tablet PCs liegen, obgleich alle Themen behandelt können, bei denen es um Mobilität geht.
Mein Name ist Mike Calligaro. Ich bin seit 14 Jahren als Entwickler bei Microsoft tätig. Abgesehen von einem zweiwöchigen Abstecher in die Windows® Desktop-Gruppe habe ich meine gesamte berufliche Laufbahn in der heute Windows Mobile genannten Abteilung verbracht. Ich habe an einer Vielzahl von Produkten mitgearbeitet, einschließlich einer frühen Version des interaktiven Fernsehens, Sega Dreamcast und des Windows CE-Betriebssystems. Ich habe die vergangenen acht Jahre an verschiedenen Bereichen von Windows Mobile gearbeitet.
Im vorliegenden Artikel werde ich das programmgesteuerte Konfigurieren von Windows Mobile-Geräten erläutern. Wenn Sie IT-Manager oder Supporttechniker sind und Windows Mobile-Geräte für Ihre Benutzer manuell konfigurieren, dann aufgepasst. Dieser Artikel ist an Sie gerichtet. Wenn Sie Anwendungen für mobile Geräte entwickeln und sich eine einfachere Möglichkeit für das Hinzufügen Ihrer Webseite zu den Favoriten des Browsers wünschen, werden Sie hier Hilfe finden.
Was wäre, wenn Sie wüssten, dass Sie mit einigen Zeilen Code und etwas XML ein VPN einrichten, das Datum und die Uhrzeit des Geräts festlegen, ein E-Mail-Konto konfigurieren, dem Gerät eine Datei hinzufügen, einen Klingelton festlegen, einen Registrierungsschlüssel ändern und vieles mehr tun können? Wie viel wäre Ihnen das wert? Eine Million Dollar? Zwei Millionen Dollar? Bei diesem MSDN® Magazin-Sonderangebot stellen wir diese Funktionen völlig kostenlos zur Verfügung. Ja wirklich, kostenlos. Einfach unschlagbar.
Hoffentlich bin ich ein besserer Entwickler, als es meine Verkaufstalente ahnen lassen. Ganz im Ernst: Die Bereitstellungs-APIs sind Teil des standardmäßigen Windows Mobile SDK, bei dem es sich um einen kostenlosen Download handelt, den Sie im Windows Mobile-Entwicklercenter unter msdn.microsoft.com/windowsmobile finden.

Gründe für das Konfigurieren
Obwohl der Name „Windows Mobile“ erst später aufkam, hat Microsoft seine erste Plattform für Mobiltelefone im Jahr 2002 veröffentlicht. Der Einstieg in den Markt der Telefonsoftware bedeutete, dass viele Dinge implementiert werden mussten, die die Betreiber mobiler Geräte wünschten, mit denen Sie jedoch nicht vertraut waren, wie z. B. die Möglichkeit, Geräte von einem Remotestandort aus zu konfigurieren. Zugegeben, es gab nicht viel zu konfigurieren bei einem Telefon jener Zeit, doch wir mussten diese grundlegende Ebene der Konfiguration unterstützen, um konkurrenzfähig zu sein. Nachdem wir die Infrastruktur entwickelt hatten, war es für uns leicht, mehr im Bereich der Remotekonfiguration zu tun.
Aufgrund meiner Arbeitsanforderungen verwende ich z. B. verschiedene Telefone und viele verschiedene Betriebssystemversionen. In den nicht so stabilen Zeiten im Entwicklungslebenszyklus musste ich gelegentlich verschiedene Telefone mehrere Male am Tag einrichten. Auch wenn alles reibungslos läuft, ist es nichts Ungewöhnliches, dass ich mindestens ein Telefon pro Woche konfigurieren muss. Statt meine Exchange Server-Adresse manuell einzugeben und meinen Klingelton festzulegen, stelle ich ein XML-Blob zusammen, das den größten Teil des Setups erledigt. Die XML-Datei und ein kleines Programm zur Verarbeitung befinden sich auf einer Speicherkarte. So bin ich immer startbereit, wenn jemand mir ein neues Telefon zum Testen gibt.
Ich bin sicher, dass die Fähigkeit, Penny Arcade als einen Browserfavoriten einrichten zu können, nie zu den Anforderungen eines Mobiltelefonbetreibers gehörte, doch ich bin froh, dass wir uns in diesem Fall den Ansatz „Ich habe einen Hammer, also sieht alles wie ein Nagel aus“ gehalten haben.
Für diese Konfigurationszauberei benötigen Sie lediglich eine einzelne API (DMProcessConfigXML) und etwas XML. Angenommen, Sie möchten zum Beispiel Live Search als Browserfavoriten festlegen. Beginnen Sie mit dem folgenden XML-Code:
// WAP provisioning XML to add a new browser favorite.
LPCWSTR g_wszFavoriteXml = 
    L"<wap-provisioningdoc> "
    L"   <characteristic type=\"BrowserFavorite\"> "
    L"      <characteristic type=\"Live Search\"> "
    L"         <parm name=\"URL\" value=\"http://m.live.com/\"/> "
    L"      </characteristic> "
    L"   </characteristic>"
    L"</wap-provisioningdoc>";
Mit dieser Voraussetzung haben Sie hier den gesamten Code, den Sie benötigen, um den Favoriten mithilfe des XML festzulegen:
HRESULT AddFavorite() {
   HRESULT hr         = E_FAIL;
   LPWSTR wszOutput   = NULL;
   
   // Process the XML.
   hr = DMProcessConfigXML(g_wszFavoriteXml, 
     CFGFLAG_PROCESS, &wszOutput);
 
   // The caller must delete the XML returned from DMProcessConfigXML.
   delete [] wszOutput;
   return hr;
 }
Aus Platzgründen habe ich die Dinge hier etwas vereinfacht. In Ihrem eigenen Code sollten Sie eine Sicherheits- und Fehlerüberprüfung durchführen. Es ist außerdem wahrscheinlicher, dass Sie XML von einer Datei lesen, als dass Sie es in Ihren Code kompilieren. Im Grunde ist dies aber alles, was zu tun ist.
Es gibt auch einen verwalteten Wrapper für DMProcessConfigXML. In C# können Sie stattdessen ConfigurationManager.ProcessConfiguration verwenden. Hier ist der gleiche Code in C#:
XmlDocument configDoc = new XmlDocument();
configDoc.LoadXml(
    "<wap-provisioningdoc>"+
    "<characteristic type=\"BrowserFavorite\">"+
    "<characteristic type=\"Live Search\">"+
    "<parm name=\"URL\" value=\"http://m.live.com/\"/>"+
    "</characteristic>"+
    "</characteristic>"+
    "</wap-provisioningdoc>"
    );
ConfigurationManager.ProcessConfiguration(configDoc, false);

Konfigurationsdienstanbieter
DMProcessConfigXML sendet das XML, das es empfängt, an verschiedene Konfigurationsdienstanbieter (Configuration Service Providers, CSPs). Diese Anbieter lesen das XML und handeln entsprechend. Falls es eine Art von Konfiguration gibt, die Sie ändern möchten, die aber nicht unterstützt wird, ist die Wahrscheinlichkeit groß, dass wir dafür noch keinen CSP geschrieben haben. Wir interessieren uns für Ihre Vorschläge zu neuen CSPs, die Ihrer Meinung nach nützlich wären und hinzugefügt werden sollten.
Die endgültige Liste der Konfigurationsdienstanbieter steht unter msdn2.microsoft.com/bb737536.aspx zur Verfügung. Außerdem gibt es einige XML-Beispiele, die unter msdn2.microsoft.com/bb737572.aspx verfügbar sind.
Leider besteht hinsichtlich der Verfügbarkeit von CSPs nach wie vor ein Unterschied zwischen Windows Mobile Professional (Pocket PC)-Telefonen und Windows Mobile Standard (Smartphone)-Telefonen. Sie werden feststellen, dass einige der CSPs in der Standard-Version, aber nicht in der Professional-Version, verfügbar sind. (Die Ironie dabei ist uns nicht entgangen.) Wir arbeiten daran, die Plattformen in Zukunft zu vereinigen. Ferner haben OEMs und Betreiber mobiler Geräte die Möglichkeit, selektiv CSPs zu deaktivieren, um die Funktionalität, die nicht geändert werden soll, zu sperren. Sicherheitshalber sollten Sie immer jede Konfiguration, deren Bereitstellung Sie planen, auf den Telefonen testen, die unterstützt werden sollen.
Hier einige Beispiele. Als Erstes sehen Sie ein XML-Blob, das die Zeitzone festlegt und den Alarm aktiviert und einrichtet:
<wap-provisioningdoc>
   <characteristic type="clock">
      <parm name="TimeZone" value="4"/>
      <parm name="AlarmOn" value="1"/>
      <parm name="AlarmTime" value="06:30:00Z"/>  
   </characteristic>
</wap-provisioningdoc>
„characteristic type“ teilt Ihnen mit, dass der Clock-CSP verwendet wird. Jeder CSP hat eine MSDN-Seite, auf der die Parameter beschrieben werden, die Sie ändern können, sowie die möglichen Werte, die Sie für jeden Parameter festlegen können. Zum Beispiel ist die Dokumentation steht für den Clock-CSP unter msdn2.microsoft.com/bb737261.aspx zur Verfügung und beschreibt die möglichen Werte für TimeZone, AlarmOn und AlarmTime sowie zwei Parameter, die in diesem Beispiel nicht enthalten sind (Datum und Uhrzeit).
Stellen Sie sicher, dass Sie in den Dokumenten die richtigen Werte ablesen, um sie den Parametern zuzuweisen. Ich bin mir sicher, sie erscheinen jemandem anderen logisch, aber einem Normalsterblichen wie mir geben sie oft Rätsel auf. Zum Beispiel ist der TimeZone-Wert für GMT -8 „4“, doch der Wert für GMT -5 ist „35“.
In Abbildung 1 sehen Sie ein Beispiel für einige der Dinge, die Sie mit dem Sync-CSP anstellen können. (Die Dokumentation für den Sync-Anbieter steht unter msdn2.microsoft.com/bb737700.aspx zur Verfügung.) Wie Sie sehen, können Sie auswählen, welche Daten Sie synchronisieren, womit Sie sie synchronisieren, wie oft synchronisiert wird und so weiter. Es gibt etwa 50 Parameter, die sich auf das Synchronisieren beziehen und die Sie mit diesem Anbieter konfigurieren können.
<wap-provisioningdoc>
   <characteristic type="Sync">
      <characteristic type="Connection">
         <parm name="Server" value="testserver"/>
         <parm name="User" value="testuser"/>
         <parm name="Domain" value="thephone-company"/>
         <parm name="AllowSSLOption" value="1"/>
      </characteristic>
      <characteristic type="Settings">
         <parm name="PeakStartTime" value="0800"/>
         <parm name="PeakEndTime" value="1800"/>
         <parm name="PeakFrequency" value="0"/>
         <parm name="BodyTruncation" value="5120"/>
      </characteristic>
      <characteristic type="Calendar">
         <parm name="Enabled" value="1"/>
      </characteristic>
      <characteristic type="Contacts">
         <parm name="Enabled" value="1"/>
      </characteristic>
      <characteristic type="Mail">
         <parm name="Enabled" value="1"/>
      </characteristic>
   </characteristic>
</wap-provisioningdoc>

Diese Beispiele sind nur der Anfang. Sie geben Ihnen hoffentlich eine Vorstellung davon, wie die CSPs funktionieren.

Laden des XML auf das Gerät
Sie haben also großartiges XML erstellt und eine kleine Anwendung geschrieben, die eine XML-Datei öffnet und die Daten an DMProcessConfigXML sendet. Das Konfigurieren erfordert jedoch, dass Sie das XML und die Anwendung auf das Gerät übertragen können.
Hier haben Sie einige Optionen zur Auswahl. Die einfachste Möglichkeit besteht darin, die Datei und die Anwendung auf einer Speicherkarte zu speichern, die Karte in ein Gerät einzuführen und dann die Anwendung mithilfe des Datei-Explorers auszuführen. So gehe ich vor, um meine Geräte zu konfigurieren.
Doch was ist, wenn Sie ein IT-Manager mit Hunderten von Geräten sind, die Sie konfigurieren müssen? Die zusätzlichen Schritte, den Datei-Explorer zu starten und zur Anwendung zu navigieren, würden zu viel Zeit kosten. In diesem Fall könnten Sie die Konfigurationsanwendung automatisch ausführen lassen, wenn Sie die Speicherkarte einführen.
Erstellen Sie einen Ordner namens „2577“ (seltsam, ich weiß) im Stammverzeichnis der Speicherkarte, und speichern Sie Ihre Konfigurationsanwendung in diesen Ordner. Nennen Sie die Anwendung „autorun.exe“. Falls die Anwendung automatisch einen Standard-XML-Dateinamen (zum Beispiel „config.xml“) öffnet, müssen Sie nur noch die Karte einführen, um das Gerät zu konfigurieren. Der Trick mit automatischer Ausführung funktioniert auch dann, wenn das Gerät startet. Deshalb funktioniert er selbst dann, wenn Sie ein Telefon haben, bei dem Sie den Akku entfernen müssen, um die Speicherkarte einführen zu können.
Selbstverständlich gibt es noch andere Möglichkeiten. Falls Sie nach dem anfänglichen Setup planen, eine weitere Konfiguration mit Ihren Geräten durchzuführen, könnten Sie die Konfigurationsanwendung auf dem Gerät speichern und ihr eine Erweiterung zuordnen. Dann senden Sie die Konfigurationsdateien mit der zugeordneten Erweiterung per E-Mail an Ihre Benutzer. Diese müssten nur die angefügte Konfigurationsdatei öffnen, um ihre Geräte zu konfigurieren. Alternativ könnten Ihre Benutzer eine Website aufsuchen, die die Konfigurationsdatei für sie herunterlädt.
Es ist auch möglich, PushRouter zu verwenden, um die WAP-Konfigurationsdateien (Wireless Application Protocol) über SMS an die Geräte zu senden. PushRouter geht über den Rahmen dieses Artikels hinaus, aber dies ist die Methode, mit der die Betreiber mobiler Geräte die Konfigurationsdateien an Telefone in ihren Netzwerken senden.
Wenn Sie ein unabhängiger Softwarehersteller (independent software vendor, ISV) sind, können Sie die in Ihrem Setupprogramm enthaltenen CSPs verwenden, um jede notwendige Gerätekonfiguration vorzunehmen, vom Hinzufügen von Dateien über das Ändern der Registrierungsdateien und das Hinzufügen von Browserfavoriten bis hin zum Ändern der Homepage. Aufgrund der Einfachheit des Konfigurationsformats können Sie außerdem mithilfe einer entsprechenden XML-Datei für Ihr Deinstallationsprogramm die Schritte des Installationsprogramms problemlos wieder rückgängig machen.
Wenn Sie durch ActiveSync® oder das Windows Mobile-Gerätecenter eine Verbindung zum Gerät hergestellt haben, können Sie es konfigurieren, ohne Dateien auf dem Gerät zu speichern. Das Desktoptool „rapiconfig.exe“ befindet sich im Toolverzeichnis des Windows Mobile SDK. Dieses Tool liest eine XML-Datei und verwendet RAPI, um das Gerät zu konfigurieren, das derzeit mit ActiveSync verbunden ist. Nachdem Sie das Gerät angedockt haben, gehen Sie ins Toolverzeichnis im SDK, und geben Sie (unter der Annahme, dass Ihre XML-Datei „config.xml“ heißt) Folgendes ein:
rapiconfig config.xml
Weitere Informationen zu RapiConfig finden Sie unter msdn2.microsoft.com/bb737541.aspx.
Abschließend können Sie entweder eine CAB- oder eine CPF-Datei (CAB Provisioning Format) erstellen. Sowohl CABs als auch CPFs können auf ein Gerät kopiert und direkt ausgeführt werden, ohne ein Programm zu benötigen. Das Desktoptool „makecab.exe“ wird zum Erstellen beider Dateitypen verwendet und ist ebenfalls im Windows Mobile SDK verfügbar.
Der Hauptunterschied zwischen einer CAB- und einer CPF-Datei besteht darin, dass die CPF-Datei keine Dialogfelder öffnet, wenn sie ausgeführt wird. (Sie wird im Hintergrund ausgeführt.) Dies ist auch der Hauptnachteil der CPF. In Abhängigkeit von den Sicherheitseinstellungen auf dem Gerät und davon, ob die Datei signiert ist oder nicht, kann es sein, dass CABs und CPFs ein Dialogfeld anzeigen müssen, um den Benutzer zu fragen, ob es OK ist, das Gerät zu konfigurieren. Da die CPF automatisch ausgeführt werden muss, kann sie dieses Dialogfeld nicht anzeigen. Also schlägt sie fehl. Falls Sie planen, die Konfigurationsdatei zu signieren, verwenden Sie eine CPF-Datei. Falls nicht, verwenden Sie eine CAB-Datei.
Beide lassen sich sehr einfach erstellen. Sie leiten einfach eine normale XML-Datei an makecab weiter und geben ihr den Namen der gewünschten Ausgabedatei. Der Trick besteht darin, dass die XML-Datei „_setup.xml“ genannt werden muss. Wenn Sie sie anders nennen, ist makecab erfolgreich, die CAB- oder CPF-Datei wird ordnungsgemäß generiert und schlägt dann mit einem kryptischen Fehler fehl, wenn Sie versuchen, sie zu verwenden. Die Dokumentation weist leider nicht deutlich darauf hin.
Die Syntax für das Erstellen einer CAB-Datei ist folgende:
makecab _setup.xml config.cab
Im Unterschied zur XML-Datei gibt es keine solchen Einschränkungen für den Namen der generierten CAB-Datei. Statt „config.cab“ können Sie z. B. einen beliebigen Namen für die generierte CAB-Datei auswählen. Die Syntax für das Erstellen einer CPF-Datei lautet dementsprechend wie folgt:
makecab _setup.xml config.cpf
Ersetzen Sie wiederum „config.cpf“ durch einen beliebigen Namen, mit dem Sie die CPF-Datei bezeichnen wollen. Richtig, der einzige Unterschied zwischen den beiden ist, ob Sie die Ausgabedatei CAB oder CPF nennen. In beiden Fällen muss die XML-Datei „_setup.xml“ genannt werden.
Gehen Sie zu msdn2.microsoft.com/bb737689.aspx, um weitere Informationen zu CPF-Dateien zu erhalten. Unter msdn2.microsoft.com/bb416436.aspx finden Sie weitere Informationen zum Signieren von CPF-Dateien.

Wer will schon XML eingeben?
XML manuell einzugeben, mag für erfahrene IT-Experten in Ordnung sein, doch was ist, wenn Sie Ihren Benutzern die Auswahl ihrer eigenen Konfiguration aus einem Satz von Optionen ermöglichen möchten? Wäre es nicht toll, eine Website mit einer Reihe von Kontrollkästchen usw. zu haben? Die Benutzer würden die Website durchsuchen, das Gewünschte auswählen, und die Website würde die XML-Datei generieren.
Für dieses Szenario bietet Microsoft® .NET Framework die XmlDocument-Klasse, die das programmgesteuerte Generieren von XML erleichtert. Denken Sie z. B. an das clock-XML von weiter oben. Der Code in Abbildung 2 erstellt es im Handumdrehen.
void CreateXML()
{
    XmlDocument xmlDoc = new XmlDocument();
    XmlElement root = CreateRoot(xmlDoc);

    XmlElement type = CreateCharacteristic(xmlDoc, "clock", root);
    CreateParm(xmlDoc, "TimeZone", "4", type);
    CreateParm(xmlDoc, "AlarmOn", "1", type);
    CreateParm(xmlDoc, "AlarmTime", "06:30:00Z", type);

    xmlDoc.Save("config.xml");           
}

XmlElement CreateRoot(XmlDocument xmlDoc)
{
    XmlElement root = xmlDoc.CreateElement("wap-provisioningdoc");
    xmlDoc.AppendChild(root);
    return root;
}

XmlElement CreateCharacteristic(XmlDocument xmlDoc, string type, XmlElement parent)
{
    XmlElement element = xmlDoc.CreateElement("characteristic");
    element.SetAttribute("type", type);
    parent.AppendChild(element);
    return element;
}

XmlElement CreateParm(XmlDocument xmlDoc, string name, string value, XmlElement parent)
{
    XmlElement element = xmlDoc.CreateElement("parm");
    element.SetAttribute("name", name);
    element.SetAttribute("value", value);
    parent.AppendChild(element);
    return element;
}

CreateRoot, CreateCharacteristic und CreateParm sind Hilfsfunktionen, die Sie mühelos auf einmal bewältigen können. Erstellen Sie dann einfach Ihr eigenes CreateXML, das diese aufruft. Dieses Beispiel hartkodiert die Parameterinformationen, aber auf Ihrer Webseite würden die Werte von der Benutzeroberflächenauswahl des Benutzers kommen. Nach dem Generieren des XML lädt die Website das XML auf das Gerät zur Ausführung durch den Benutzer herunter.
Es wäre auch denkbar, eine Konfigurationsanwendung zu schreiben, die auf dem Gerät ausgeführt wird. Nachdem der Benutzer die geeignete Konfiguration ausgewählt hat, würde ein Code wie der in Abbildung 2 das XML generieren und direkt an ConfigurationManager.ProcessConfiguration senden. So müssten Sie nicht die Schritte ausführen, bei denen das XML an eine Datei gesendet und dann wieder eingelesen wird.

Alles konfiguriert und startklar
Wenn Sie jemals eine Exchange Server-Adresse auf der Zehnertastatur Ihres Telefons eingeben mussten, haben Sie es sich verdient, zur bequemen Desktoptastatur zu wechseln, um ein wenig XML zu erstellen. Niemandem sollte so etwas zugemutet werden. Ich hoffe, dass Sie diesen Artikel zumindest ein wenig als befreiend empfinden. Viel Erfolg beim Konfigurieren.

Senden Sie Ihre Fragen und Kommentare (in englischer Sprache) an goplaces@microsoft.com.


Mike Calligaro ist arbeitet als leitender Softwareentwickler im Windows Mobile-Team von Microsoft und schreibt Beiträge für den Windows Mobile-Teamblog unter blogs.msdn.com/windowsmobile.

Page view tracker