Visual Basic .NET - IP Connection

Dies ist die Beschreibung der Visual Basic .NET API Bindings für die IP Connection. Die IP Connection kümmert sich um die Kommunikation zwischen einem Brick Daemon oder einer WIFI/Ethernet Extension. Bevor Bricks und Bricklets über deren API angesprochen werden können muss eine IP Connection erzeugt und die TCP/IP Verbindung hergestellt werden.

Eine Installationanleitung für die Visual Basic .NET API Bindings ist Teil deren allgemeine Beschreibung.

Beispiele

Der folgende Beispielcode ist Public Domain (CC0 1.0).

Enumerate

Download (ExampleEnumerate.vb)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Imports Tinkerforge

Module ExampleEnumerate
    Const HOST As String = "localhost"
    Const PORT As Integer = 4223

    Sub EnumerateCB(ByVal sender As IPConnection, _
                    ByVal uid As String, _
                    ByVal connectedUid As String, _
                    ByVal position As Char, _
                    ByVal hardwareVersion() As Short, _
                    ByVal firmwareVersion() As Short, _
                    ByVal deviceIdentifier As Integer, _
                    ByVal enumerationType As Short)
        System.Console.WriteLine("UID:               {0}", uid)
        System.Console.WriteLine("Enumeration Type:  {0}", enumerationType)

        If enumerationType = IPConnection.ENUMERATION_TYPE_DISCONNECTED Then
            System.Console.WriteLine("")
            Return
        End If

        System.Console.WriteLine("Connected UID:     {0}", connectedUid)
        System.Console.WriteLine("Position:          {0}", position)
        System.Console.WriteLine("Hardware Version:  {0}.{1}.{2}", _
                                 hardwareVersion(0), hardwareVersion(1), hardwareVersion(2))
        System.Console.WriteLine("Firmware Version:  {0}.{1}.{2}", _
                                 firmwareVersion(0), firmwareVersion(1), firmwareVersion(2))
        System.Console.WriteLine("Device Identifier: {0}", deviceIdentifier)
        System.Console.WriteLine("")
    End Sub

    Sub Main()
        ' Create connection and connect to brickd
        Dim ipcon As New IPConnection()
        ipcon.Connect(HOST, PORT)

        ' Register Enumerate Callback
        AddHandler ipcon.EnumerateCallback, AddressOf EnumerateCB

        ' Trigger Enumerate
        ipcon.Enumerate()

        System.Console.WriteLine("Press key to exit")
        System.Console.ReadLine()
        ipcon.Disconnect()
    End Sub
End Module

Authenticate

Download (ExampleAuthenticate.vb)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Imports Tinkerforge

Module ExampleAuthenticate
    Const HOST As String = "localhost"
    Const PORT As Integer = 4223
    Const SECRET As String = "My Authentication Secret!"

    Sub ConnectedCB(ByVal sender As IPConnection, _
                    ByVal connectReason As Short)
        Select Case connectReason
            Case IPConnection.CONNECT_REASON_REQUEST
                System.Console.WriteLine("Connected by request")
            Case IPConnection.CONNECT_REASON_AUTO_RECONNECT
                System.Console.WriteLine("Auto-Reconnect")
        End Select

        ' Authenticate first...
        Try
            sender.Authenticate(SECRET)
            System.Console.WriteLine("Authentication succeeded")
        catch
            System.Console.WriteLine("Could not authenticate")
            Exit Sub
        End Try

        ' ...reenable auto reconnect mechanism, as described below...
        sender.SetAutoReconnect(true)

        ' ...then trigger enumerate
        sender.Enumerate()
    End Sub

    Sub EnumerateCB(ByVal sender As IPConnection, _
                    ByVal uid As String, _
                    ByVal connectedUid As String, _
                    ByVal position As Char, _
                    ByVal hardwareVersion() As Short, _
                    ByVal firmwareVersion() As Short, _
                    ByVal deviceIdentifier As Integer, _
                    ByVal enumerationType As Short)
        System.Console.WriteLine("UID: {0}, Enumeration Type: {1}", uid, enumerationType)
    End Sub

    Sub Main()
        ' Create IPConnection and connect to brickd
        Dim ipcon As New IPConnection()

        ' Register Connected Callback
        AddHandler ipcon.Connected, AddressOf ConnectedCB

        ' Register Enumerate Callback
        AddHandler ipcon.EnumerateCallback, AddressOf EnumerateCB

        ' Disable auto reconnect mechanism, in case we have the wrong secret.
        ' If the authentication is successful, reenable it.
        ipcon.SetAutoReconnect(false)

        ' Connect to brickd
        ipcon.Connect(HOST, PORT)

        System.Console.WriteLine("Press key to exit")
        System.Console.ReadLine()
        ipcon.Disconnect()
    End Sub
End Module

API

Grundfunktionen

Class IPConnection()

Erzeugt ein IP Connection Objekt das verwendet werden kann um die verfügbar Geräte zu enumerieren. Es wird auch für den Konstruktor von Bricks und Bricklets benötigt.

Sub IPConnection.Connect(ByVal host As String, ByVal port As Integer)

Erstellt eine TCP/IP Verbindung zum gegebenen host und port. Host und Port können auf einen Brick Daemon oder einer WIFI/Ethernet Extension verweisen.

Bricks/Bricklets können erst gesteuert werden, wenn die Verbindung erfolgreich aufgebaut wurde.

Blockiert bis die Verbindung aufgebaut wurde und wirft eine Exception, falls kein Brick Daemon oder WIFI/Ethernet Extension auf dem gegebenen Host und Port horcht.

Sub IPConnection.Disconnect()

Trennt die TCP/IP Verbindung zum Brick Daemon oder einer WIFI/Ethernet Extension.

Sub IPConnection.Authenticate(ByVal secret As String)

Führt einen Authentifizierungs-Handshake mit dem verbundenen Brick Daemon oder WIFI/Ethernet Extension durch. Ist der Handshake erfolgreich dann wechselt die Verbindung vom nicht-authentifizierten in den authentifizierten Zustand und die Kommunikation kann normal weitergeführt werden. Schlägt der Handshake fehl wird die Verbindung durch die Gegenseite geschlossen. Die Authentifizierung kann fehlschlagen wenn das Authentifizierungsgeheimnis nicht übereinstimmt oder Authentifizierung für den Brick Daemon oder die WIFI/Ethernet Extension nicht aktiviert ist.

Für mehr Informationen zur Authentifizierung siehe das dazugehörige Tutorial.

Neu in Version 2.1.0.

Function IPConnection.GetConnectionState() As Short

Kann die folgenden Zustände zurückgeben:

  • IPCON_CONNECTION_STATE_DISCONNECTED (0): Keine Verbindung aufgebaut.
  • IPCON_CONNECTION_STATE_CONNECTED (1): Eine Verbindung zum Brick Daemon oder der WIFI/Ethernet Extension ist aufgebaut.
  • IPCON_CONNECTION_STATE_PENDING (2): IP Connection versucht im Moment eine Verbindung aufzubauen.
Sub IPConnection.SetAutoReconnect(ByVal autoReconnect As Boolean)

Aktiviert oder deaktiviert Auto-Reconnect. Falls Auto-Reconnect aktiviert ist, versucht die IP Connection eine Verbindung zum vorher angegebenen Host und Port wieder herzustellen, falls die aktuell bestehende Verbindung verloren geht. Auto-Reconnect greift also erst nach einem erfolgreichen Aufruf von Connect().

Standardwert ist true.

Function IPConnection.GetAutoReconnect() As Boolean

Gibt true zurück wenn Auto-Reconnect aktiviert ist und False sonst.

Sub IPConnection.SetTimeout(ByVal timeout As Integer)

Setzt den Timeout in Millisekunden für Getter und für Setter die das Response-Expected-Flag aktiviert haben.

Standardwert ist 2500.

Function IPConnection.GetTimeout() As Integer

Gibt den Timeout zurück, wie er von IPConnection.SetTimeout() gesetzt wurde.

Sub IPConnection.Enumerate()

Broadcast einer Enumerierungsanfrage. Alle Bricks und Bricklets werden mit einem Enumerate Callback antworten.

Sub IPConnection.Wait()

Hält den aktuellen Thread an bis IPConnection.Unwait() aufgerufen wird.

Dies ist nützlich falls ausschließlich auf Callbacks reagiert werden soll oder wenn auf einen spezifischen Callback gewartet werden soll oder wenn die IP Connection in einem Thread gestartet wird.

Wait und Unwait agieren auf die gleiche Weise wie Acquire und Release einer Semaphore.

Sub IPConnection.Unwait()

Startet einen Thread der vorher mit IPConnection.Wait() angehalten wurde wieder.

Wait und Unwait agieren auf die gleiche Weise wie Acquire und Release einer Semaphore.

Callbacks

Callbacks können registriert werden um über Ereignisse informiert zu werden. Die Registrierung geschieht durch Anhängen des Callback Handlers an den passenden Event:

Sub MyCallback(ByVal sender As IPConnection, ByVal value As Short)
    Console.WriteLine("Value: {0}", value)
End Sub

AddHandler ipcon.ExampleCallback, AddressOf MyCallback

Die verfügbaren Events werden im Folgenden beschrieben.

Event IPConnection.EnumerateCallback(ByVal sender As IPConnection, ByVal uid As String, ByVal connectedUid As String, ByVal position As Char, ByVal hardwareVersion() As Short, ByVal firmwareVersion() As Short, ByVal deviceIdentifier As Integer, ByVal enumerationType As Short)

Der Event empfängt sieben Parameter:

  • uid: Die UID des Bricks/Bricklets.
  • connectedUid: Die UID des Bricks mit dem das Brick/Bricklet verbunden ist. Für ein Bricklet ist dies die UID des Bricks mit dem es verbunden ist. Für einen Brick ist es die UID des untersten Master Bricks in einem Stapel. Der unterste Master Brick hat die Connected-UID "0". Mit diesen Informationen sollte es möglich sein die komplette Netzwerktopologie zu rekonstruieren.
  • position: Für Bricks: '0' - '8' (Position in Stapel). Für Bricklets: 'a' - 'h' (Position an Brick) oder 'i' (Position des Raspberry Pi (Zero) HAT) oder 'z' (Bricklet an Isolator Bricklet).
  • hardwareVersion: Major, Minor und Release Nummer der Hardwareversion.
  • firmwareVersion: Major, Minor und Release Nummer der Firmwareversion.
  • deviceIdentifier: Eine Zahl, welche den Brick/Bricklet repräsentiert.
  • enumerationType: Art der Enumerierung.

Mögliche Enumerierungsarten sind:

  • IPConnection.ENUMERATION_TYPE_AVAILABLE (0): Gerät ist verfügbar (Enumerierung vom Benutzer ausgelöst: IPConnection.Enumerate()). Diese Enumerierungsart kann mehrfach für das selbe Gerät auftreten.
  • IPConnection.ENUMERATION_TYPE_CONNECTED (1): Gerät ist wurde neu verbunden (Automatisch vom Brick gesendet nachdem die Kommunikation aufgebaut wurde). Dies kann bedeuten, dass das Gerät die vorher eingestellte Konfiguration verloren hat und neu konfiguriert werden muss.
  • IPConnection.ENUMERATION_TYPE_DISCONNECTED (2): Gerät wurde getrennt (Nur bei USB-Verbindungen möglich). In diesem Fall haben nur uid und enumerationType einen gültigen Wert.

Es sollte möglich sein Plug-and-Play-Funktionalität mit diesem Event zu implementieren (wie es im Brick Viewer geschieht).

Die Device Identifier Werte sind hier zu finden. Es gibt auch Konstanten für diese Werte, welche nach dem folgenden Muster benannt sind:

<device-class>.DEVICE_IDENTIFIER

Zum Beispiel: BrickMaster.DEVICE_IDENTIFIER oder BrickletAmbientLight.DEVICE_IDENTIFIER.

Event IPConnection.ConnectedCallback(ByVal sender As IPConnection, ByVal connectReason As Short)

Dieser Event wird ausgelöst wenn die IP Connection eine Verbindung zu einem Brick Daemon oder einer WIFI/Ethernet Extension aufgebaut hat, mögliche Gründe sind:

  • IPConnection.CONNECT_REASON_REQUEST (0): Verbindung aufgebaut nach Anfrage vom Benutzer.
  • IPConnection.CONNECT_REASON_AUTO_RECONNECT (1): Verbindung aufgebaut durch Auto-Reconnect.
Event IPConnection.DisconnectedCallback(ByVal sender As IPConnection, ByVal disconnectReason As Short)

Dieser Event wird aufgerufen wenn die Verbindung der IP Connection zu einem Brick Daemon oder einer WIFI/Ethernet Extension getrennt wurde, mögliche Gründe sind:

  • IPConnection.DISCONNECT_REASON_REQUEST (0): Trennung wurde vom Benutzer angefragt.
  • IPConnection.DISCONNECT_REASON_ERROR (1): Trennung aufgrund eines unlösbaren Problems.
  • IPConnection.DISCONNECT_REASON_SHUTDOWN (2): Trennung wurde vom Brick Daemon oder WIFI/Ethernet Extension eingeleitet.