[Zusammenfassung] : Die Bluetooth-Kommunikationstechnologie bietet ein breites Anwendungsspektrum in eingebetteten Systemen, und Microsofts Windows CE.NET hat sich zu einem der führenden Betriebssysteme für eingebettete Systeme entwickelt. Dieser Artikel stellt verschiedene Methoden zur Entwicklung von Bluetooth-Kommunikationsmodulen unter Windows CE.NET vor. Dabei kommen verwalteter Code in Visual Studio 2005, die P/Invoke-Technologie, das Microsoft Bluetooth Embedded Toolkit, die OpenNETCF-Klassenbibliothek und nativer Code zum Einsatz. Wichtige Technologien wie P/Invoke, die Entwicklung mit verwaltetem Code und die Entwicklung mit nativem Code werden detailliert erläutert. Abschließend werden die Vor- und Nachteile der verschiedenen Entwicklungsmethoden für Bluetooth-Kommunikationsmodule mit verwaltetem und nativem Code verglichen und analysiert. Die Inhalte sind für die Entwicklung der Bluetooth-Kommunikation zwischen Geräten auf der Windows Mobile-Plattform von praktischem Nutzen.
Schlüsselwörter : Bluetooth, Windows Mobile, P/Invoke, verwalteter Code, nativer Code
0 Einleitung
Seitdem die neun größten Elektronikkonzerne der Welt 1998 gemeinsam die Bluetooth Special Interest Group (SIG) gründeten, hat sich die Bluetooth-Technologie innerhalb von weniger als einem Jahrzehnt in zahlreichen Bereichen wie Haushaltsgeräten, E-Commerce, Automobilindustrie, Luftfahrt, Gesundheitswesen und Transportwesen etabliert. Im Bereich Mobile Computing hat Bluetooth die Reichweitenproblematik der drahtlosen Kommunikation auf äußerst wirtschaftliche Weise gelöst und somit Kabelverbindungen zwischen verschiedenen mobilen Endgeräten überflüssig gemacht. Daher ist das Anwendungspotenzial der Bluetooth-Technologie im Mobile Computing sehr groß, und ihre Weiterentwicklung ist von erheblicher praktischer Bedeutung.
Microsoft begann 1996 mit der Entwicklung des Embedded-Betriebssystems Windows CE 1.0. Dabei nutzte das Unternehmen seine erfolgreichen Erfahrungen auf dem PC-Markt und die Tatsache, dass Windows CE einem PC-Betriebssystem ähnelte…
Über den Autor: Bai Wei (1980-), männlich, Masterstudent, Forschungsschwerpunkt: Eingebettete Systeme.
Profil des Betreuers: Bai Wanmin, Professor, Forschungsschwerpunkte sind eingebettete Systeme und Computeranwendungen.
Die benutzerfreundliche Oberfläche gewinnt im Markt für eingebettete Betriebssysteme zunehmend an Marktanteilen. Die Windows Mobile-Plattform ist ein von Microsoft für eingebettete Systeme entwickeltes Betriebssystem, insbesondere Windows CE.NET. Die neueste Version von Windows CE.NET ist Windows CE 5.0 und umfasst drei Varianten: Pocket PC (datenorientiert), Smartphone (sprachorientiert) und Portable Media Center (unterhaltungsorientiert). Alle drei Varianten können die Entwicklung von Bluetooth-Anwendungen beinhalten.
Für die Windows CE.NET-Entwicklung ist Visual Studio 2005, das Ende 2005 von Microsoft veröffentlicht wurde, derzeit die optimale Wahl. Visual Studio 2005 ermöglicht die Entwicklung von verwalteten WinCE-Programmen auf Basis des .NET Compact Framework 2.0 oder 1.0 mit Sprachen wie C# oder VB.NET sowie die Entwicklung nativer WinCE-Programme auf Basis von MFC, ATL oder der Win32-API mit C++.
Da die neueste .NET Compact Framework 2.0-Klassenbibliothek noch keine Klassenbibliothek für Bluetooth-Kommunikationsmodule enthält und derzeit nur sehr wenige Informationen zur Entwicklung von Bluetooth-Kommunikationsmodulanwendungen unter Windows CE verfügbar sind, während die Anwendung der Bluetooth-Kommunikationstechnologie sehr weit verbreitet sein muss, wird dieser Artikel dieses Thema behandeln.
1. Entwicklung eines Bluetooth-Kommunikationsmoduls auf Basis von verwaltetem Code
Bei der verwalteten codebasierten Entwicklung werden eine Reihe von Anwendungsprogrammierschnittstellen (APIs) innerhalb einer Laufzeitumgebung verwendet.
Im Allgemeinen sind verwaltete Codeanwendungen einfacher und schneller zu entwickeln und können auf verschiedenen Softwareplattformen und Prozessoren ausgeführt werden, sodass der entwickelte verwaltete Code wiederverwendet werden kann und eine hohe Portabilität aufweist.
Darüber hinaus übernimmt die Laufzeitumgebung Routineaufgaben wie Speicherverwaltung, Ressourcenverwaltung, Ressourcenerfassung und Sicherheitsmanagement. Anwendungsentwickler müssen sich darum nicht kümmern. Verwaltete Anwendungen laufen auf dem Zielrechner, indem ein Echtzeit-Compiler auf dem Zielrechner den verwalteten Code vor der Ausführung in Echtzeit in Zielmaschinencode kompiliert.
Da die .NET-Plattform die Verwendung der CLR (Common Language Runtime) zum Aufruf des .NET Compact Framework in verschiedenen Sprachen ermöglicht, um Anwendungen mit der gleichen Funktionalität zu entwickeln, wird in diesem Artikel C# nur als Beispiel verwendet, um die Entwicklung des Bluetooth-Kommunikationsmoduls im Abschnitt für verwalteten Code vorzustellen.
1.1 Entwickeln Sie ein Bluetooth-Kommunikationsmodul mithilfe der P/Invoke-Methode
Die Entwicklung von Bluetooth-Kommunikationsmodulen erfordert Treiberhardware, jedoch kapselt das .NET Compact Framework die Win32-API nicht vollständig. Daher müssen für die Entwicklung eines Bluetooth-Kommunikationsmoduls auf Basis von verwaltetem Code Techniken zur Interaktion von verwaltetem Code mit nicht verwaltetem Code eingesetzt werden. P/Invoke (Platform Invoke) ist ein Dienst der .NET-Entwicklungsplattform, der es verwaltetem Code ermöglicht, native Funktionen einer DLL-Bibliothek aufzurufen, ähnlich dem GNI-Konzept in Java. Abbildung 1 veranschaulicht die Funktionsweise von P/Invoke. Zunächst wird der verwaltete Quellcode mithilfe des Compilers der entsprechenden Sprache in eine Assembly kompiliert, einschließlich Metadaten und Zwischencode. Die P/Invoke-Deklaration ist dabei als Metadaten in der Assembly enthalten. Wird die Assembly von der CLR aufgerufen, sucht die CLR anhand der Metadatendeklaration in der entsprechenden DLL-Funktion nach deren Implementierung. Wird sie gefunden, wird sie in den Speicher geladen und ihr Einstiegspunkt ermittelt. Die verwalteten Parameter werden auf den Stack gelegt, und der Einstiegspunkt der Funktion wird auf die entsprechende native DLL gesetzt, wodurch der Aufruf der nicht verwalteten DLL durch den verwalteten Code abgeschlossen wird.
Beim Schreiben von Bluetooth-Kommunikationsmodulen mit der P/Invoke-Methode ist das Attribut `DllImport` sehr nützlich. Der folgende Code veranschaulicht diesen allgemeinen Ansatz anhand eines Beispiels, in dem das verwaltete Programm die MessageBox (in `User32.lib`) aufruft: `using using namespace System::Runtime::InteropServices; namespace SysWin32 { [DllImport ( "user32.dll", EntryPoint = "MessageBox", CharSet = Unicode)] int MessageBox (void * hWnd, wchar_t * lpText, wchar_t * lpCaption, unsigned int uType); } int main() SysWin32::MessageBox (0, L"Hello world !", L"Greetings", 0) }` Beachten Sie die Codezeile mit `DllImport`. Diese Codezeile weist den Compiler an, anhand des Parameterwerts eine Funktion in der Datei User32.dll zu deklarieren und alle in der Signatur vorkommenden Zeichenketten (wie Parameter oder Rückgabewerte) als Unicode-Zeichenketten zu behandeln. Fehlt der Parameter EntryPoint, wird standardmäßig der Funktionsname verwendet. Da der Parameter CharSet Unicode angibt, sucht die Common Language Runtime zunächst nach einer Funktion namens MessageBoxW. Findet die Laufzeitumgebung diese Funktion nicht, sucht sie nach MessageBox und dem entsprechenden, gemäß der Aufrufkonvention dekorierten Namen.
Beim Aufruf von Funktionen einer benutzerdefinierten DLL muss vor der Funktionsdeklaration der DLL `extern "C"` eingefügt werden, wie unten gezeigt: `extern "C" SAMPLEDLL_API int fnSampleDLL(void);`. Beim Aufruf von nicht-nativem Code ist zu beachten, dass unstrukturierte Parameter vom verwalteten Code in die native Codeform umgewandelt werden müssen. Der Parameterwert `CharSet` kann verwendet werden, um Zeichenketten (vom Typ `string*`) in den Parametern automatisch in `wchar_t*` zu konvertieren. Analog dazu werden alle `Int32`-Parametertypen in nicht verwaltete `int`-Typen, `UInt32`-Parametertypen in nicht verwaltete `unsignedint`-Typen und `Intl6`-Parametertypen in `short int`-Typen konvertiert. `char*` wird für `in`-Parameter als `String*` (`CharSet = Ansi`) und für `out`-Parameter oder Rückgabewerte als `Text::StringBuilder*` verwendet. `wchar_t*` wird für `in`-Parameter als `String*` (`CharSet = Unicode`) und für `out`-Parameter oder Rückgabewerte als `Text::StringBuilder*` verwendet. Funktionszeiger müssen die Aufrufkonvention `_stdcall` verwenden, da dies der einzige von `DllImport` unterstützte Typ ist. Bei Arrays (wie z. B. wchar_t*[]) wird der Parameter `CharSet` nur auf den Wurzeltyp des Funktionsarguments angewendet. Daher wird `String*_gc[]` unabhängig vom Wert von `CharSet` zu `wchar_t*[]` gemarshallt. Zusätzlich zu einfachen Typen bietet die Laufzeitumgebung einen Mechanismus zum Marshallen einfacher Strukturen von einem verwalteten in einen nicht verwalteten Kontext. Einfache Strukturen enthalten keine Zeiger auf interne Datenmember, strukturierte Typmember oder andere Elemente.
Bevor Sie ein Bluetooth-Kommunikationsprogramm erstellen, sind grundlegende Bluetooth-Kenntnisse erforderlich. Ein Bluetooth-Modulprogramm muss das Aktivieren von Bluetooth, das Koppeln, Verbinden, Einrichten eines seriellen Kanals und das Starten des Kommunikationsprozesses umfassen. Außerdem muss der serielle Port in der Anwendung konfiguriert werden. Da die Bluetooth-Technologie Sicherheitsfunktionen besitzt, ist das Koppeln von Bluetooth-Geräten notwendig. Bluetooth kennt drei Betriebszustände: Ein, Aus und Auffindbar. Alle Kommunikationsgeräte benötigen eine entsprechende Geräte-ID (DeviceID), so auch Bluetooth. Die Bluetooth-Geräte-ID ist eine Zeichenkette aus durch Doppelpunkte getrennten Hexadezimalzahlen. Mit diesem Wissen können Sie nun mithilfe der P/Invoke-Methode das Bluetooth-Kommunikationsmodul in verwaltetem Code schreiben.
Die grundlegenden Funktionen, die für jeden Schritt aufgerufen werden müssen, sind folgende:
• Die ID des lokalen Geräts abrufen [DllImport("Btdrt.dll", SetLastError = true)] public static extern int BthReadLocalAddr(byte[]PBa)
• Die ID des Remotegeräts abrufen [DllImport("ws2.dll", EntryPoint = "WSALook-upServiceBegin", SetLastError = true)] public static extern int CeLookupServiceBegin(byte[] pQuerySet, LookupFlags dwFlags, ref intlphLookup)
•Listening service [DllImport ("ws2.dll", EntryPoint = "WSASetService", SetLastError= true)] public static extern int CeSetService (byte[ ] pQuerySet, RNRSERVICE_REGISTER,LookupFlags dwFlags)
•Connect [DllImport ("mscoree", EntryPoint = "@ 339")] public static extern int connect (int s, byte []name, int namelen)
• Bluetooth-Sicherheitseinstellungen: Kopplungscode anfordern [DllImport("Btdrt.dll", SetLastError=true)] public static extern int BthGetPINRequest(byte[]pba)
Set Pairing Code [DllImport("btdrt.dll", SetLastError=true) public static extern int BthSetPIN(byte[] pba, intcPinLength, byte[] ppin)
ACL-Verbindung erstellen: [DllImport ("Btdrt.dll", SetLastError=true) public static extern int BthCreateACLConnection(byte[] pbt, ref ushort phandle);
Dann folgt die Überprüfung des Pairing-Codes: `[DllImport("Btdrt.dll", SetLastError= true)] public static extern int BthAuthenticate(byte[]pbt);`
Anschließend müssen Sie die Verbindung schließen: [DllImport("Btdrt.dll", SetLastError= true)] public static extern int BthCloseConnection(ushorthandle);
• Bluetooth-Funkstatus festlegen [DllImport("BthUtil.dll", SetLastError= true)] public static extern int BthSetMode (RadioModedwMode) Nach dem Herstellen der Bluetooth-Geräteverbindung kann die Kommunikation zwischen den beiden Bluetooth-Geräten beginnen. Da die Bluetooth-Kommunikation als virtuelle serielle Kommunikation betrachtet werden kann, kann während des Verbindungsaufbaus eine ähnliche Methode wie bei der seriellen Portkommunikation verwendet werden. Es gibt zahlreiche Informationen zur seriellen Portkommunikation, daher wird dieser Artikel nicht näher darauf eingehen.
1.2 Entwicklung eines Bluetooth-Kommunikationsmoduls mit dem Microsoft Bluetooth Embedded Toolkit
Das Microsoft Bluetooth Embedded Toolkit ist ein neues Toolkit von Microsoft, basierend auf dem .NET Compact Framework 2.0, das speziell für die schnelle Entwicklung von Bluetooth-Anwendungen konzipiert wurde. Es ermöglicht die direkte Verwendung seiner Klassenbibliotheken innerhalb der .NET-Plattform und damit die schnelle und einfache Entwicklung grundlegender Bluetooth-Anwendungen. Dieses Toolkit ist jedoch nur mit Windows CE 5.0 kompatibel. Mit dem Toolkit können Sie: einen Bluetooth-Dienst starten, nach Bluetooth-Geräten in der Nähe suchen und Verbindungen zu vorhandenen Bluetooth-Geräten oder -Diensten herstellen. Das Toolkit kann von der Microsoft-Website heruntergeladen werden. Der folgende Codeausschnitt demonstriert eine einfache Textübertragung zwischen zwei Bluetooth-Geräten mithilfe dieses Toolkits:
Serverseitig: Guid serviceGuid = new Guid (" {81553B2B-FFOB-4415-86C9-22B799058B81}");
ServerHandle sh = btseore.CreateService(server-viceGuid);
NetworkStream ns = sh.AceptConnection() String dataToSend = "Hello";
Byte[] dataBuffer = System.Text.ASCIIEncoding.ASCII.GetBytes(dataToSend);
ns.Write(dataBuffer, 0, dataBuffer.Length);
ns.Flush();
ns.Close();
Client: PairedDevices = btsCore.GetPairedDevices();
Für jedes (BluetoothDevice Gerät in pairedDevices)
{pairedDevicesListBox.Item.Add(device.deviceName);
} Guid serviceGuid = new Guid (" { 01550D2D-FF0D-4415-86C9-22B799058B81 } ");
Wenn (pairedDevicesListBox.SelectedIndex﹥=0);
{BluetoothDevice deviceToConnect= (BluetoothDevice) pairedDevices [pairedDevicesListBox.Selected];
NetworkStream ns = btsCore.Connect (deviceTo-Connect, serviceGuid);
byte[ ] buffer=new byte[2000] ns. Read(buffer, 0,50);
char[] bufferAsChars = System.Text.ASCII.GetChars(buffer); System.String s = System.Text.Encoding.ASCIIGetString(buffer, 0, buffer, length);
Nachricht. Anzeigen(n). Schließen(); }
1.3 Entwicklung eines Bluetooth-Kommunikationsmoduls mit OpenNETCF
OpenNETCF ist eine Open-Source-Bibliothek von Drittanbietern, die die Entwicklungseffizienz von Windows Mobile deutlich steigert. Sie wurde von einer Gruppe Windows-Mobile-Enthusiasten entwickelt und bietet zahlreiche Klassenbibliotheken, die nicht im .NET Compact Framework 2.0 enthalten sind. Die Bibliothek kann auf zwei Arten verwendet werden: entweder als Komponente in Visual Studio 2005 installiert oder durch Bearbeiten und Verwenden des Quellcodes. OpenNETCF beinhaltet Bluetooth-Funktionalität, sodass Sie mit OpenNETCF auch Bluetooth-Kommunikationsmodule entwickeln können. Die Bibliothek steht unter www.opennetcf.com zum Download bereit. Innerhalb der Bibliothek können Sie den Namespace `BluetoothSerialPort` unter `OpenNETCF.IO.Ports` verwenden, um eine Bluetooth-Verbindung herzustellen, und die Inhalte des Namespace `OpenNETCF.IO.Serial` für die Bluetooth-Programmkommunikation nutzen.
2. Entwickeln Sie ein Bluetooth-Kommunikationsmodul auf Basis eines eigenen Codes.
Native Anwendungen werden mithilfe einer für eine bestimmte Softwareplattform spezifischen Anwendungsschnittstelle entwickelt und in Objektcode oder Maschinencode für einen bestimmten Prozessor kompiliert. Nativer Code bietet in der Regel hohe Leistung bei geringem Ressourcenbedarf, jedoch kann der kompilierte native Code bzw. die ausführbare Datei nur auf der jeweiligen Softwareplattform oder dem jeweiligen Prozessor ausgeführt werden. Darüber hinaus müssen Entwickler bei nativen Anwendungen häufig Aspekte wie Speicher-, Ressourcen- und Sicherheitsmanagement selbst übernehmen. Visual Studio 2005 ermöglicht die Entwicklung nativer WinCE-Programme auf Basis der MFC-, ATL- oder Win32-API mit C++. Dies bietet eine ähnliche Methode wie die Entwicklung von Windows Mobile-Geräten mit eMbedded Visual C++. Dieser Artikel konzentriert sich bei der Beschreibung der Entwicklung eines Bluetooth-Kommunikationsmoduls mit der P/Invoke-Methode auf den Aufruf von nativem Code zur Entwicklung von Bluetooth-Anwendungen; da die Methode ähnlich ist, wird hier auf eine detailliertere Analyse verzichtet.
3. Schlussfolgerung
Dieser Artikel beschreibt verschiedene Methoden zur Entwicklung von Bluetooth-Kommunikationsmodulen für Windows Mobile-Geräte mit verwaltetem und nativem Code in Visual Studio 2005. Jede Methode hat ihre Vor- und Nachteile. Benötigt das Bluetooth-Kommunikationsgerät des Benutzers hohe Leistung bei minimalem Ressourcenbedarf, ist die Entwicklung mit nativem Code die beste Wahl. Denn Programme, die mit nativem Code entwickelt werden, werden direkt in Maschinencode kompiliert und führen so zu einer höheren Leistung. Der größte Nachteil der nativen Codeentwicklung ist jedoch der hohe Entwicklungsaufwand und der lange Entwicklungszyklus, wodurch sie für Benutzer mit allgemeinen Anforderungen ungeeignet ist. Für Produkte mit geringeren Leistungs- und Ressourcenanforderungen sind die in diesem Artikel beschriebenen Methoden mit verwaltetem Code die bessere Wahl für die Entwicklung von Bluetooth-Kommunikationsmodulen. Programme, die mit verwaltetem Code entwickelt werden, sind einfacher und schneller. Da verwalteter Code nicht direkt endgültigen Maschinencode, sondern Zwischencode für die Ausführung generiert, können mit verwaltetem Code entwickelte Programme plattform- und prozessorübergreifend ausgeführt werden. Dies geht jedoch mit einer geringeren Zugriffsgeschwindigkeit einher. Dieser Artikel stellt drei Methoden zur Entwicklung von Bluetooth-Kommunikationsgeräten auf Basis von verwaltetem Code vor. Da Microsoft bis zum .NET Framework 2.0 keine Klassenbibliothek speziell für Bluetooth-Kommunikationsmodule entwickelt hatte, war die Verwendung der P/Invoke-Methode eine gängige Wahl für die Entwicklung solcher Module in verwaltetem Code. Die Methoden zur Entwicklung von Bluetooth-Kommunikationsmodulen mit dem Microsoft Bluetooth Embedded Toolkit und der OpenNET CF-Klassenbibliothek sind ähnlich; beide stellen Wrapper für Low-Level-APIs dar, was die Entwicklung vereinfacht und beschleunigt und sie besser für die Entwicklung von Bluetooth-Kommunikationsmodulen mit allgemeinen Anforderungen geeignet macht.
Bluetooth-Geräte bieten ein sehr breites Anwendungsspektrum in eingebetteten Systemen, doch es besteht noch erheblicher Entwicklungsbedarf. Die Entwicklung besserer und effizienterer Bluetooth-Anwendungen für die Windows Mobile-Plattform wird die Nutzung der Bluetooth-Technologie in eingebetteten Produkten deutlich verbessern. Dieser Entwicklungsaspekt ist von großer praktischer Bedeutung und wird ein zentraler Schwerpunkt zukünftiger Forschung sein.