Dies ist die Beschreibung der Delphi/Lazarus 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 Delphi/Lazarus API Bindings ist Teil deren allgemeine Beschreibung.
Der folgende Beispielcode ist Public Domain (CC0 1.0).
Download (ExampleEnumerate.pas)
1program ExampleEnumerate;
2
3{$ifdef MSWINDOWS}{$apptype CONSOLE}{$endif}
4{$ifdef FPC}{$mode OBJFPC}{$H+}{$endif}
5
6uses
7 SysUtils, IPConnection, Device;
8
9type
10 TExample = class
11 private
12 ipcon: TIPConnection;
13 public
14 procedure EnumerateCB(sender: TIPConnection;
15 const uid: string; const connectedUid: string; const position: char;
16 const hardwareVersion: TVersionNumber; const firmwareVersion: TVersionNumber;
17 const deviceIdentifier: word; const enumerationType: byte);
18 procedure Execute;
19 end;
20
21const
22 HOST = 'localhost';
23 PORT = 4223;
24
25var
26 e: TExample;
27
28{ Print incoming enumeration }
29procedure TExample.EnumerateCB(sender: TIPConnection;
30 const uid: string; const connectedUid: string; const position: char;
31 const hardwareVersion: TVersionNumber; const firmwareVersion: TVersionNumber;
32 const deviceIdentifier: word; const enumerationType: byte);
33begin
34 WriteLn('UID: ' + uid);
35 WriteLn('Enumerate Type: ' + IntToStr(enumerationType));
36
37 if (enumerationType <> IPCON_ENUMERATION_TYPE_DISCONNECTED) then begin
38 WriteLn('Connected UID: ' + connectedUid);
39 WriteLn('Position: ' + position);
40 WriteLn('Hardware Version: ' + IntToStr(hardwareVersion[0]) + '.' +
41 IntToStr(hardwareVersion[1]) + '.' +
42 IntToStr(hardwareVersion[2]));
43 WriteLn('Firmware Version: ' + IntToStr(firmwareVersion[0]) + '.' +
44 IntToStr(firmwareVersion[1]) + '.' +
45 IntToStr(firmwareVersion[2]));
46 WriteLn('Device Identifier: ' + IntToStr(deviceIdentifier));
47 end;
48
49 WriteLn('');
50end;
51
52procedure TExample.Execute;
53begin
54 { Create connection and connect to brickd }
55 ipcon := TIPConnection.Create;
56 ipcon.Connect(HOST, PORT);
57
58 { Register enumerate callback to "EnumerateCB" }
59 ipcon.OnEnumerate := {$ifdef FPC}@{$endif}EnumerateCB;
60
61 { Trigger enumerate }
62 ipcon.Enumerate;
63
64 WriteLn('Press key to exit');
65 ReadLn;
66 ipcon.Destroy; { Calls ipcon.Disconnect internally }
67end;
68
69begin
70 e := TExample.Create;
71 e.Execute;
72 e.Destroy;
73end.
Download (ExampleAuthenticate.pas)
1program ExampleAuthenticate;
2
3{$ifdef MSWINDOWS}{$apptype CONSOLE}{$endif}
4{$ifdef FPC}{$mode OBJFPC}{$H+}{$endif}
5
6uses
7 SysUtils, IPConnection, Device;
8
9type
10 TExample = class
11 private
12 ipcon: TIPConnection;
13 public
14 procedure ConnectedCB(sender: TIPConnection; const connectReason: byte);
15 procedure EnumerateCB(sender: TIPConnection;
16 const uid: string; const connectedUid: string; const position: char;
17 const hardwareVersion: TVersionNumber; const firmwareVersion: TVersionNumber;
18 const deviceIdentifier: word; const enumerationType: byte);
19 procedure Execute;
20 end;
21
22const
23 HOST = 'localhost';
24 PORT = 4223;
25 SECRET = 'My Authentication Secret!';
26
27var
28 e: TExample;
29
30{ Authenticate each time the connection got (re-)established }
31procedure TExample.ConnectedCB(sender: TIPConnection; const connectReason: byte);
32begin
33 case connectReason of
34 IPCON_CONNECT_REASON_REQUEST:
35 begin
36 WriteLn('Connected by request');
37 end;
38 IPCON_CONNECT_REASON_AUTO_RECONNECT:
39 begin
40 WriteLn('Auto-Reconnect');
41 end;
42 end;
43 { Authenticate first... }
44 try
45 sender.Authenticate(SECRET);
46 WriteLn('Authentication succeeded');
47 except
48 WriteLn('Could not authenticate');
49 exit;
50 end;
51
52 { ...reenable auto reconnect mechanism, as described below... }
53 sender.SetAutoReconnect(true);
54
55 { ...then trigger enumerate }
56 sender.Enumerate;
57end;
58
59{ Print incoming enumeration }
60procedure TExample.EnumerateCB(sender: TIPConnection;
61 const uid: string; const connectedUid: string; const position: char;
62 const hardwareVersion: TVersionNumber; const firmwareVersion: TVersionNumber;
63 const deviceIdentifier: word; const enumerationType: byte);
64begin
65 WriteLn('UID: ' + uid + ', Enumerate Type: ' + IntToStr(enumerationType));
66end;
67
68procedure TExample.Execute;
69begin
70 { Create IP Connection }
71 ipcon := TIPConnection.Create;
72
73 { Disable auto reconnect mechanism, in case we have the wrong secret.
74 If the authentication is successful, reenable it. }
75 ipcon.SetAutoReconnect(false);
76
77 { Register connected callback to "ConnectedCB" }
78 ipcon.OnConnected := {$ifdef FPC}@{$endif}ConnectedCB;
79
80 { Register enumerate callback to "EnumerateCB" }
81 ipcon.OnEnumerate := {$ifdef FPC}@{$endif}EnumerateCB;
82
83 { Connect to brickd }
84 ipcon.Connect(HOST, PORT);
85
86 WriteLn('Press key to exit');
87 ReadLn;
88 ipcon.Destroy; { Calls ipcon.Disconnect internally }
89end;
90
91begin
92 e := TExample.Create;
93 e.Execute;
94 e.Destroy;
95end.
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.
Zerstört die IP Connection. Ruft intern Disconnect auf. Der Socket zum Brick Daemon wird geschlossen
und alle Threads der IP Connection werden beendet.
Erstellt eine TCP/IP Verbindung zum gegebenen host und port. Host und Port
können auf einen Brick Daemon oder eine 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.
Trennt die TCP/IP Verbindung zum Brick Daemon oder einer WIFI/Ethernet Extension.
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.
Added in version 2.1.0.
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.
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.
Gibt true zurück wenn Auto-Reconnect aktiviert ist und false sonst.
Setzt den Timeout in Millisekunden für Getter und für Setter die das Response-Expected-Flag aktiviert haben.
Standardwert ist 2500.
Gibt den Timeout zurück, wie er von TIPConnection.SetTimeout()
gesetzt wurde.
Broadcast einer Enumerierungsanfrage. Alle Bricks und Bricklets werden mit einem Enumerate Callback antworten.
Hält den aktuellen Thread an bis TIPConnection.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.
Startet einen Thread der vorher mit TIPConnection.Wait()
angehalten wurde wieder.
Wait und Unwait agieren auf die gleiche Weise wie Acquire und
Release einer Semaphore.
Callbacks können registriert werden um über Ereignisse informiert zu werden. Die Registrierung erfolgt indem eine Prozedur einem Callback Property des TIPConnection Objektes zugewiesen wird:
procedure TExample.MyCallback(sender: TIPConnection; const param: word);
begin
WriteLn(param);
end;
ipcon.OnExample := {$ifdef FPC}@{$endif}example.MyCallback;
Die verfügbaren Callback Properties und ihre Parametertypen werden im Folgenden beschrieben.
procedure(sender: TIPConnection; const uid: string; const connectedUid: string; const position: char; const hardwareVersion: TVersionNumber; const firmwareVersion: TVersionNumber; const deviceIdentifier: word; const enumerationType: byte) of object;
Der Callback empfängt sieben Parameter:
uid: Die UID des Bricks/Bricklets.
connectedUid: Die UID des Gerätes mit dem der Brick/das Bricklet verbunden
ist. Für ein Bricklet ist dies die UID des Bricks oder Bricklets mit dem es verbunden ist.
Für einen Brick ist es die UID des untersten Bricks im 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:
IPCON_ENUMERATION_TYPE_AVAILABLE = 0: Gerät ist verfügbar (Enumerierung vom
Benutzer ausgelöst: Disconnect).
Diese Enumerierungsart kann mehrfach für das selbe Gerät auftreten.
IPCON_ENUMERATION_TYPE_CONNECTED = 1: Gerät 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.
IPCON_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 Callback 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-type>_DEVICE_IDENTIFIER
Zum Beispiel: BRICK_MASTER_DEVICE_IDENTIFIER()
oder BRICKLET_AMBIENT_LIGHT_DEVICE_IDENTIFIER().
procedure(sender: TIPConnection; const connectReason: byte) of object;
Dieser Callback wird aufgerufen wenn die IP Connection eine Verbindung zu einem Brick Daemon oder einer WIFI/Ethernet Extension aufgebaut hat, mögliche Gründe sind:
IPCON_CONNECT_REASON_REQUEST = 0: Verbindung aufgebaut nach Anfrage vom Benutzer.
IPCON_CONNECT_REASON_AUTO_RECONNECT = 1: Verbindung aufgebaut durch Auto-Reconnect.
procedure(sender: TIPConnection; const disconnectReason: byte) of object;
Dieser Callback wird aufgerufen wenn die Verbindung der IP Connection zu einem Brick Daemon oder einer WIFI/Ethernet Extension getrennt wurde, mögliche Gründe sind:
IPCON_DISCONNECT_REASON_REQUEST = 0: Trennung wurde vom Benutzer angefragt.
IPCON_DISCONNECT_REASON_ERROR = 1: Trennung aufgrund eines unlösbaren Problems.
IPCON_DISCONNECT_REASON_SHUTDOWN = 2: Trennung wurde vom Brick Daemon oder WIFI/Ethernet Extension eingeleitet.