tron25 schrieb:
Gibt es die Möglichkeit, so etwas auch außerhalb einer Sub oder Funktion abzufangen?
Das ist garnicht nötig. Wenn du BluetoothClient anstatt im Klassenbereich instanziierst in einer Methode(also das = new...) in eine Function/sub packen.
Bevor du weiter so arbeitest verpasse ich dir eine Lektion in OOP.(Object Orientiertes Programmieren)
Anstatt den ganzen BT-Kram in der Form-Klasse zu machen, machen wir eine eigene Klasse dafür, so bleibt der Code in der Formklasse deutlich überschaubarer. Noch dazu kannste dich mit mehreren Devices verbinden indem du die Klasse mehrfach instanziierst. In dem Fall wohl nicht nötig, aber da der Code besser ist, machen wir das nun so, wenn mehrere gleiche devices verwendet werden sollen, muss man die function Connect(siehe meinen Code unten) ein wenig ändern. Das hat noch einen weiteren Vorteil, machste noch so eine App, musste nicht den ganzen Kram wieder schreiben, klasse dem Projekt hinzufügen und feddich. Wiederverwertbarkeit ist IMO ein muss!
Fangen wir mit einer Klasse an, nennen sie BluetoothUtil. Überlege was muss die Klasse können.
-Verbinden
-Verbindung schliessen
-vom stream lesen
-in den stream schreiben
-alles wieder freigeben
kein muss, mach ich bei sowas immer rein
-eine function um zu testen ob verbunden
Also:
eine Function als Boolean Connect
ein sub Disconnect
eine sub Write
eine funtion Read als byte array oder string
ein function IsConnected als boolean.
IDisposeable imlpementieren
Da haben wir schon das Grundgerüst!
Ich hab das mal vorbereitet. Die Function read bleibt dir überlassen, die ist noch auskommentiert.
VB.NET-Quellcode
- Imports InTheHand.Net
- Imports InTheHand.Net.Sockets
- Imports InTheHand.Net.Bluetooth
- Public Class BluetoothUtil
- Implements IDisposable
- Private client As BluetoothClient
- Private stream As IO.Stream
- Private disposedValue As Boolean
- Public Function IsConnected() As Boolean
- Return client IsNot Nothing AndAlso client.Connected
- End Function
- Public Function Connect(deviceName As String) As Boolean
- Try
- Dim deviceInfo As BluetoothDeviceInfo = Nothing
- client = New BluetoothClient()
- Dim devices As BluetoothDeviceInfo() = client.DiscoverDevices()
- For Each d As BluetoothDeviceInfo In devices
- If d.DeviceName.ToLower().Equals(deviceName.ToLower()) Then
- deviceInfo = d
- End If
- Next
- If deviceInfo Is Nothing Then
- MessageBox.Show("Kein Device mit dem Namen: " & deviceName & " gefunden!")
- Return False
- End If
- Dim endPoint As New BluetoothEndPoint(deviceInfo.DeviceAddress, BluetoothService.SerialPort)
- client.Connect(endPoint)
- If client.Connected Then
- stream = client.GetStream()
- Return True
- End If
- MessageBox.Show("Konnte keine Verbindung zum Device aufbauen!")
- Catch ex As PlatformNotSupportedException
- MessageBox.Show("Kein Bluetooth verfügbar!")
- End Try
- Return False
- End Function
- Public Sub Disconnect()
- If Not client Is Nothing Then
- If client.Connected Then
- client.Close()
- End If
- End If
- End Sub
- Public Sub Write(data As String)
- If Not IsConnected() Then
- MessageBox.Show("Nicht verbunden!")
- Return
- End If
- If stream Is Nothing Then
- stream = client.GetStream()
- End If
- Using streamWriter As New IO.StreamWriter(stream, System.Text.Encoding.Default, 1, True)
- streamWriter.Write(data)
- End Using
- End Sub
- Protected Overridable Sub Dispose(disposing As Boolean)
- If Not disposedValue Then
- If disposing Then
- ' TODO: Verwalteten Zustand (verwaltete Objekte) bereinigen
- If Not stream Is Nothing Then
- stream.Dispose()
- End If
- If Not client Is Nothing Then
- client.Dispose()
- End If
- End If
- ' TODO: Nicht verwaltete Ressourcen (nicht verwaltete Objekte) freigeben und Finalizer überschreiben
- ' TODO: Große Felder auf NULL setzen
- disposedValue = True
- End If
- End Sub
- ' ' TODO: Finalizer nur überschreiben, wenn "Dispose(disposing As Boolean)" Code für die Freigabe nicht verwalteter Ressourcen enthält
- ' Protected Overrides Sub Finalize()
- ' ' Ändern Sie diesen Code nicht. Fügen Sie Bereinigungscode in der Methode "Dispose(disposing As Boolean)" ein.
- ' Dispose(disposing:=False)
- ' MyBase.Finalize()
- ' End Sub
- Public Sub Dispose() Implements IDisposable.Dispose
- ' Ändern Sie diesen Code nicht. Fügen Sie Bereinigungscode in der Methode "Dispose(disposing As Boolean)" ein.
- Dispose(disposing:=True)
- GC.SuppressFinalize(Me)
- End Sub
- 'Public Function Read() As String
- 'End Function
- End Class
Nun schau mal wie aufgeräumt die Form.Klasse ist, alles ist das wo es hingehöhrt.
VB.NET-Quellcode
- Public Class Form1
- Private bt As New BluetoothUtil
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- If Not bt.Connect("HyperFlat-76") Then
- Close()
- End If
- End Sub
- Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
- bt.Dispose()
- End Sub
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Dim dots As Integer = 255
- Dim data As String = Chr(27) & Chr(50) & Chr(0) & Chr(0)
- For Zaehler As Integer = 1 To 36
- data &= Chr(dots)
- Next
- bt.Write(data)
- End Sub
- End Class
Edit @tron25
Hab eine Projektmappe angehängt, probiers mal aus
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Takafusa“ ()