2009-07-01 17 views
1

Ich arbeite an einer mobilen Anwendung (C#/WPF auf einem Tablet PC), die auf einen Bluetooth-fähigen Drucker druckt. Im Moment feuere ich gerade einen Druckauftrag ab, und wenn der Drucker nicht vorhanden ist, meldet das Druckersubsystem dem Benutzer einen Fehler. Ich mache nichts programmatisch mit Bluetooth, nur mit PrintDialog().Erkennung von Bluetooth-Drucker

Ich möchte diesen Prozess ändern, um den Drucker zuerst zu erkennen - wenn es nicht verfügbar ist, dann werde ich nur das Dokument speichern, ohne zu drucken. Gibt es eine Möglichkeit im Code, um zu erkennen, ob das Bluetooth-Gerät angeschlossen/aktiv/verfügbar ist?

Wenn ich mir das Gerät im Bluetooth-Panel unter der Systemsteuerung anschaue, scheint es keinen Status zu geben, der angibt, ob das Gerät verfügbar ist oder nicht, also ist dies möglicherweise nicht möglich.

Ich gehe davon aus, dass der Drucker in Windows bereits eingerichtet und konfiguriert wurde - alles, was ich tun muss, ist festzustellen, ob es tatsächlich zu einem bestimmten Zeitpunkt vorhanden ist.

Antwort

1

Vielleicht verwenden Sie die 32feet.NET-Bibliothek (von denen ich der Betreuer bin) und überprüfen Sie, ob der Drucker vorhanden ist, bevor Sie den Auftrag senden. Sie müssen die Bluetooth-Adresse des Druckers kennen; kann man das vom System bekommen, oder vielleicht weißt du es immer.

Die Erkennung im MSFT Bluetooth-Stack gibt immer alle bekannten Geräte im Bereich zurück :-(Aber wir können andere Mittel verwenden, um das Vorhandensein/Fehlen des Geräts zu erkennen. Vielleicht BluetoothDeviceInfo.GetServiceRecords in seinem BeginGetServiceRecords-Formular (nicht getestet/kompiliert):

bool IsPresent(BluetoothAddress addr) // address from config somehow 
{ 
    BluetoothDeviceInfo bdi = new BluetoothDeviceInfo(addr); 
    if (bdi.Connected) { 
     return true; 
    } 
    Guid arbitraryClass = BluetoothService.Headset; 
    AsyncResult<bool> ourAr = new AsyncResult<bool>(); // Jeffrey Richter's impl 
    IAsyncResult ar = bdi.BeginGetService(arbitraryClass, IsPresent_GsrCallback, ourAr); 
    bool signalled = ourAr.AsyncWaitHandle.WaitOne(Timeout); 
    if (!signalled) { 
     return false; // Taken too long, so not in range 
    } else { 
     return ourAr.Result; 
    } 
} 

void IsPresent_GsrCallback(IAsyncResult ar) 
{ 
    AsyncResult<bool> ourAr = (AsyncResult<bool>)ar.AsyncState; 
    const bool IsInRange = true; 
    const bool completedSyncFalse = true; 
    try { 
     bdi.EndGetServiceResult(ar); 
     ourAr.SetAsCompleted(IsInRange, completedSyncFalse); 
    } catch { 
     // If this returns quickly, then it is in range and 
     // if slowly then out of range but caller will have 
     // moved on by then... So set true in both cases... 
     // TODO check what error codes we get here. SocketException(10108) iirc 
     ourAr.SetAsCompleted(IsInrange, completedSyncFalse); 
    } 
}