Dies ist die Beschreibung der Perl 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 Perl API Bindings ist Teil deren allgemeine Beschreibung.
Der folgende Beispielcode ist Public Domain (CC0 1.0).
Download (example_enumerate.pl)
1#!/usr/bin/perl
2
3use strict;
4use Tinkerforge::IPConnection;
5
6use constant HOST => 'localhost';
7use constant PORT => 4223;
8
9# Create connection and connect to brickd
10my $ipcon = Tinkerforge::IPConnection->new();
11
12# Print incoming enumeration
13sub cb_enumerate
14{
15 my ($uid, $connected_uid, $position, $hardware_version,
16 $firmware_version, $device_identifier, $enumeration_type) = @_;
17
18 print "UID: $uid\n";
19 print "Enumeration Type: $enumeration_type\n";
20
21 if ($enumeration_type == Tinkerforge::IPConnection->ENUMERATION_TYPE_DISCONNECTED)
22 {
23 print "\n";
24 return;
25 }
26
27 print "Connected UID: $connected_uid\n";
28 print "Position: $position\n";
29 print "Hardware Version: ".join('.', @$hardware_version)."\n";
30 print "Firmware Version: ".join('.', @$firmware_version)."\n";
31 print "Device Identifier: $device_identifier\n";
32 print "\n";
33}
34
35$ipcon->connect(&HOST, &PORT);
36
37# Register Enumerate Callback
38$ipcon->register_callback($ipcon->CALLBACK_ENUMERATE, 'cb_enumerate');
39
40# Trigger Enumerate
41$ipcon->enumerate();
42
43print "Press key to exit\n";
44<STDIN>;
45$ipcon->disconnect();
Download (example_authenticate.pl)
1#!/usr/bin/perl
2
3use strict;
4use Tinkerforge::IPConnection;
5
6use constant HOST => 'localhost';
7use constant PORT => 4223;
8use constant SECRET => 'My Authentication Secret!';
9
10# Create IPConnection
11our $ipcon = Tinkerforge::IPConnection->new();
12
13# Disable auto reconnect mechanism, in case we have the wrong secret.
14# If the authentication is successful, reenable it.
15$ipcon->set_auto_reconnect(0);
16
17# Authenticate each time the connection got (re-)established
18sub cb_connected
19{
20 my ($connect_reason) = @_;
21
22 if ($connect_reason == $ipcon->CONNECT_REASON_REQUEST)
23 {
24 print "Connected by request\n";
25 }
26 elsif ($connect_reason == $ipcon->CONNECT_REASON_AUTO_RECONNECT)
27 {
28 print "Auto-Reconnect\n";
29 }
30
31 # Authenticate first...
32 eval
33 {
34 $ipcon->authenticate(&SECRET);
35 print "Authentication succeeded\n";
36 };
37 if ($!)
38 {
39 print "Could not authenticate: $!\n";
40 return;
41 }
42
43 # ...reenable auto reconnect mechanism, as described above...
44 $ipcon->set_auto_reconnect(1);
45
46 # ...then trigger Enumerate
47 $ipcon->enumerate();
48}
49
50# Print incoming enumeration
51sub cb_enumerate
52{
53 my ($uid, $connected_uid, $position, $hardware_version,
54 $firmware_version, $device_identifier, $enumeration_type) = @_;
55
56 print "UID: $uid, Enumeration Type: $enumeration_type\n";
57}
58
59# Register Connected Callback
60$ipcon->register_callback($ipcon->CALLBACK_CONNECTED, 'cb_connected');
61
62# Register Enumerate Callback
63$ipcon->register_callback($ipcon->CALLBACK_ENUMERATE, 'cb_enumerate');
64
65# Connect to brickd
66$ipcon->connect(&HOST, &PORT);
67
68print "Press key to exit\n";
69<STDIN>;
70$ipcon->disconnect();
Allgemein kann jede Subroutine der Perl Bindings Fehler als
Tinkerforge::Error Objekt mittels croak() melden. Das Objekt hat eine
get_code() und eine get_message() Subroutine. Es sind verschiedene
Fehlercodes definiert:
Error->ALREADY_CONNECTED = 11
Error->NOT_CONNECTED = 12
Error->CONNECT_FAILED = 13
Error->INVALID_FUNCTION_ID = 21
Error->TIMEOUT = 31
Error->INVALID_PARAMETER = 41
Error->FUNCTION_NOT_SUPPORTED = 42
Error->UNKNOWN_ERROR = 43
Error->STREAM_OUT_OF_SYNC = 51
Error->INVALID_UID = 61
Error->NON_ASCII_CHAR_IN_SECRET = 71
Error->WRONG_DEVICE_TYPE = 81
Error->DEVICE_REPLACED = 82
Error->WRONG_RESPONSE_LENGTH = 83
Alle folgend aufgelisteten Funktionen sind Thread-sicher.
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.
$host -- string
$port -- int
undef
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.
undef
Trennt die TCP/IP Verbindung zum Brick Daemon oder einer WIFI/Ethernet Extension.
$host -- string
undef
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.
int
Kann die folgenden Zustände zurückgeben:
IPConnection->CONNECTION_STATE_DISCONNECTED = 0: Keine Verbindung aufgebaut.
IPConnection->CONNECTION_STATE_CONNECTED = 1: Eine Verbindung zum Brick Daemon oder der WIFI/Ethernet Extension ist aufgebaut.
IPConnection->CONNECTION_STATE_PENDING = 2: IP Connection versucht im Moment eine Verbindung aufzubauen.
$auto_reconnect -- bool
undef
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 1.
bool
Gibt True zurück wenn Auto-Reconnect aktiviert ist und False sonst.
$timeout -- float
undef
Setzt den Timeout in Sekunden für Getter und für Setter die das Response-Expected-Flag aktiviert haben.
Standardwert ist 2,5.
float
Gibt den Timeout zurück, wie er von set_timeout() gesetzt wurde.
undef
Broadcast einer Enumerierungsanfrage. Alle Bricks und Bricklets werden mit einem Enumerate Callback antworten.
$callback_id -- int
$function -- callable
undef
Registriert den $function Namen für die gegebene $callback_id.
Die verfügbaren Callback IDs mit zugehörenden Funktionssignaturen sind unten beschrieben.
Callbacks können registriert werden um über Ereignisse informiert zu werden.
Die Registrierung kann mit der Funktion register_callback() durchgeführt werden. Der erste Parameter
ist der Callback ID und der zweite die Callback Funktion:
sub my_callback
{
print "@_[0]";
}
$ipcon->register_callback(IPConnection->CALLBACK_EXAMPLE, 'my_callback')
Die Callback Funktion wird dann von einem internen Thread der IP Connection
aufgerufen werden. Im Gegensatz zu vielen anderen Programmiersprachen werden
Variablen nicht automatisch zwischen Threads geteilt. Wenn eine Variable
gleichzeitig in einer Callback Funktion und dem Rest des Programms genutzt
werden soll, dann muss diese als :shared markiert werden. Siehe dazu auch
die Dokumentation des threads::shared Perl Moduls für weitere
Details.
Die verfügbaren IDs mit der dazugehörigen Parameteranzahl und -typen werden weiter unten beschrieben.
$uid -- string
$connected_uid -- string
$position -- char
@hardware_version -- [int, int, int]
@firmware_version -- [int, int, int]
$device_identifier -- int
$enumeration_type -- int
Der Callback empfängt sieben Parameter:
$uid: Die UID des Bricks/Bricklets.
$connected_uid: 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).
@hardware_version: Major, Minor und Release Nummer der Hardwareversion.
@firmware_version: Major, Minor und Release Nummer der Firmwareversion.
$device_identifier: Eine Zahl, welche den Brick/Bricklet repräsentiert.
$enumeration_type: Art der Enumerierung.
Mögliche Enumerierungsarten sind:
IPConnection->ENUMERATION_TYPE_AVAILABLE = 0: Gerät ist verfügbar
(Enumerierung vom Benutzer ausgelöst: enumerate()). Diese Enumerierungsart kann mehrfach für das
selbe Gerät auftreten.
IPConnection->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.
IPConnection->ENUMERATION_TYPE_DISCONNECTED = 2: Gerät wurde getrennt (Nur bei
USB-Verbindungen möglich). In diesem Fall haben nur $uid und
$enumeration_type 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-class>->DEVICE_IDENTIFIER
Zum Beispiel: BrickMaster->DEVICE_IDENTIFIER
oder BrickletAmbientLight->DEVICE_IDENTIFIER.
$connect_reason -- int
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:
IPConnection->CONNECT_REASON_REQUEST = 0: Verbindung aufgebaut nach Anfrage vom Benutzer.
IPConnection->CONNECT_REASON_AUTO_RECONNECT = 1: Verbindung aufgebaut durch Auto-Reconnect.
$disconnect_reason -- int
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:
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.