Dies ist die Beschreibung der JavaScript 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 JavaScript API Bindings ist Teil deren allgemeine Beschreibung.
Der folgende Beispielcode ist Public Domain (CC0 1.0).
Download (ExampleEnumerate.js)
1var Tinkerforge = require('tinkerforge');
2
3var HOST = 'localhost';
4var PORT = 4223;
5
6ipcon = new Tinkerforge.IPConnection(); // Create IP connection
7ipcon.connect(HOST, PORT,
8 function(error) {
9 console.log('Error: '+error);
10 }
11); // Connect to brickd
12
13// Register Connected Callback
14ipcon.on(Tinkerforge.IPConnection.CALLBACK_CONNECTED,
15 function(connectReason) {
16 // Trigger Enumerate
17 ipcon.enumerate();
18 }
19);
20
21// Register Enumerate Callback
22ipcon.on(Tinkerforge.IPConnection.CALLBACK_ENUMERATE,
23 // Print incoming enumeration
24 function(uid, connectedUid, position, hardwareVersion, firmwareVersion,
25 deviceIdentifier, enumerationType) {
26 console.log('UID: '+uid);
27 console.log('Enumeration Type: '+enumerationType);
28
29 if(enumerationType === Tinkerforge.IPConnection.ENUMERATION_TYPE_DISCONNECTED) {
30 console.log('');
31 return;
32 }
33
34 console.log('Connected UID: '+connectedUid);
35 console.log('Position: '+position);
36 console.log('Hardware Version: '+hardwareVersion);
37 console.log('Firmware Version: '+firmwareVersion);
38 console.log('Device Identifier: '+deviceIdentifier);
39 console.log('');
40 }
41);
42
43console.log("Press any key to exit ...");
44process.stdin.on('data',
45 function(data) {
46 ipcon.disconnect();
47 process.exit(0);
48 }
49);
Download (ExampleAuthenticate.js)
1var Tinkerforge = require('tinkerforge');
2
3var HOST = 'localhost';
4var PORT = 4223;
5var SECRET = 'My Authentication Secret!';
6
7ipcon = new Tinkerforge.IPConnection(); // Create IP connection
8ipcon.connect(HOST, PORT,
9 function(error) {
10 console.log('Error: '+error);
11 }
12); // Connect to brickd
13
14// Disable auto reconnect mechanism, in case we have the wrong secret.
15// If the authentication is successful, reenable it.
16ipcon.setAutoReconnect(false);
17
18// Register Connected Callback
19ipcon.on(Tinkerforge.IPConnection.CALLBACK_CONNECTED,
20 // Authenticate each time the connection got (re-)established
21 function(connectReason) {
22 switch(connectReason) {
23 case Tinkerforge.IPConnection.CONNECT_REASON_REQUEST:
24 console.log('Connected by request');
25 break;
26 case Tinkerforge.IPConnection.CONNECT_REASON_AUTO_RECONNECT:
27 console.log('Auto-Reconnected');
28 break;
29 }
30 ipcon.authenticate(SECRET,
31 function() {
32 console.log('Authentication succeeded');
33
34 // ...reenable auto reconnect mechanism, as described above...
35 ipcon.setAutoReconnect(true);
36
37 // ...then trigger Enumerate
38 ipcon.enumerate();
39 },
40 function(error) {
41 console.log('Could not authenticate: '+error);
42 }
43 );
44 }
45);
46
47// Register Enumerate Callback
48ipcon.on(Tinkerforge.IPConnection.CALLBACK_ENUMERATE,
49 // Print incoming enumeration
50 function(uid, connectedUid, position, hardwareVersion, firmwareVersion,
51 deviceIdentifier, enumerationType) {
52 console.log('UID: '+uid+', Enumeration Type: '+enumerationType);
53 }
54);
55
56console.log("Press any key to exit ...");
57process.stdin.on('data',
58 function(data) {
59 ipcon.disconnect();
60 process.exit(0);
61 }
62);
Download (ExampleEnumerate.html), Test (ExampleEnumerate.html)
1<!DOCTYPE html>
2<html>
3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
4 <head>
5 <title>Tinkerforge | JavaScript Example</title>
6 </head>
7 <body>
8 <div style="text-align:center;">
9 <h1>Enumerate Example</h1>
10 <p>
11 <input value="localhost" id="host" type="text" size="20">:
12 <input value="4280" id="port" type="text" size="5">
13 <input value="Start Example" id="start" type="button" onclick="startExample();">
14 </p>
15 <p>
16 <textarea id="text" cols="80" rows="24" style="resize:none;"
17 >Press "Start Example" to begin ...</textarea>
18 </p>
19 </div>
20 <script src="./Tinkerforge.js" type='text/javascript'></script>
21 <script type='text/javascript'>
22 var ipcon;
23 var textArea = document.getElementById("text");
24 function startExample() {
25 textArea.value = "";
26 var HOST = document.getElementById("host").value;
27 var PORT = parseInt(document.getElementById("port").value);
28 if(ipcon !== undefined) {
29 ipcon.disconnect();
30 }
31 ipcon = new Tinkerforge.IPConnection(); // Create IP connection
32 ipcon.connect(HOST, PORT,
33 function(error) {
34 textArea.value += 'Error: '+error+ '\n';
35 }
36 ); // Connect to brickd
37 // Don't use device before ipcon is connected
38
39 // Register Connected Callback
40 ipcon.on(Tinkerforge.IPConnection.CALLBACK_CONNECTED,
41 function(connectReason) {
42 // Trigger Enumerate
43 ipcon.enumerate();
44 }
45 );
46 // Register Enumerate Callback
47 ipcon.on(Tinkerforge.IPConnection.CALLBACK_ENUMERATE,
48 // Print incoming enumeration
49 function(uid, connectedUid, position, hardwareVersion,
50 firmwareVersion, deviceIdentifier, enumerationType) {
51 textArea.value += 'UID: '+uid+'\n';
52 textArea.value += 'Enumeration Type: '+enumerationType+'\n';
53 if(enumerationType === Tinkerforge.IPConnection.ENUMERATION_TYPE_DISCONNECTED) {
54 textArea.value += '\n';
55 textArea.scrollTop = textArea.scrollHeight;
56 return;
57 }
58 textArea.value += 'Connected UID: '+connectedUid+'\n';
59 textArea.value += 'Position: '+position+'\n';
60 textArea.value += 'Hardware Version: '+hardwareVersion+'\n';
61 textArea.value += 'Firmware Version: '+firmwareVersion+'\n';
62 textArea.value += 'Device Identifier: '+deviceIdentifier+'\n';
63 textArea.value += '\n';
64 textArea.scrollTop = textArea.scrollHeight;
65 }
66 );
67 }
68 </script>
69 </body>
70</html>
Download (ExampleAuthenticate.html), Test (ExampleAuthenticate.html)
1<!DOCTYPE html>
2<html>
3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
4 <head>
5 <title>Tinkerforge | JavaScript Example</title>
6 </head>
7 <body>
8 <div style="text-align:center;">
9 <h1>Authenticate Example</h1>
10 <p>
11 <input value="localhost" id="host" type="text" size="20">:
12 <input value="4280" id="port" type="text" size="5">,
13 <input value="My Authentication Secret!" id="secret" type="text" size="30">:
14 <input value="Start Example" id="start" type="button" onclick="startExample();">
15 </p>
16 <p>
17 <textarea id="text" cols="80" rows="24" style="resize:none;"
18 >Press "Start Example" to begin ...</textarea>
19 </p>
20 </div>
21 <script src="./Tinkerforge.js" type='text/javascript'></script>
22 <script type='text/javascript'>
23 var ipcon;
24 var textArea = document.getElementById("text");
25 function startExample() {
26 textArea.value = "";
27 var HOST = document.getElementById("host").value;
28 var PORT = parseInt(document.getElementById("port").value);
29 var SECRET = document.getElementById("secret").value;
30 if(ipcon !== undefined) {
31 ipcon.disconnect();
32 }
33 ipcon = new Tinkerforge.IPConnection(); // Create IP connection
34
35 // Disable auto reconnect mechanism, in case we have the wrong secret.
36 // If the authentication is successful, reenable it.
37 ipcon.setAutoReconnect(false);
38
39 ipcon.connect(HOST, PORT,
40 function(error) {
41 textArea.value += 'Error: '+error+ '\n';
42 }
43 ); // Connect to brickd
44 // Don't use device before ipcon is connected
45
46 // Register Connected Callback
47 ipcon.on(Tinkerforge.IPConnection.CALLBACK_CONNECTED,
48 // Authenticate each time the connection got (re-)established
49 function(connectReason) {
50 switch(connectReason) {
51 case Tinkerforge.IPConnection.CONNECT_REASON_REQUEST:
52 textArea.value += 'Connected by request\n';
53 break;
54 case Tinkerforge.IPConnection.CONNECT_REASON_AUTO_RECONNECT:
55 textArea.value += 'Auto-Reconnected\n';
56 break;
57 }
58 ipcon.authenticate(SECRET,
59 function() {
60 textArea.value += 'Authentication succeeded\n';
61
62 // ...reenable auto reconnect mechanism, as described above...
63 ipcon.setAutoReconnect(true);
64
65 // ...then trigger Enumerate
66 ipcon.enumerate();
67 },
68 function(error) {
69 textArea.value += 'Could not authenticate: '+error+'\n';
70 }
71 );
72 }
73 );
74 // Register Enumerate Callback
75 ipcon.on(Tinkerforge.IPConnection.CALLBACK_ENUMERATE,
76 // Print incoming enumeration
77 function(uid, connectedUid, position, hardwareVersion, firmwareVersion,
78 deviceIdentifier, enumerationType) {
79 textArea.value += 'UID: '+uid+', Enumeration Type: '+enumerationType+'\n';
80 textArea.scrollTop = textArea.scrollHeight;
81 }
82 );
83 }
84 </script>
85 </body>
86</html>
Allgemein kann jede Methode der JavaScript Bindings zwei optionale Parameter
haben, returnCallback und errorCallback. Dies sind benutzerdefinierte
Callback-Funktionen. Der returnCallback wird aufgerufen mit den
Rückgabewerten der Methode, sofern vorhanden. Der errorCallback wird im
Fehlerfall mit einem Fehlercode aufgerufen. Der Fehlercode kann einer der
folgenden Werte sein:
IPConnection.ERROR_ALREADY_CONNECTED = 11
IPConnection.ERROR_NOT_CONNECTED = 12
IPConnection.ERROR_CONNECT_FAILED = 13
IPConnection.ERROR_INVALID_FUNCTION_ID = 21
IPConnection.ERROR_TIMEOUT = 31
IPConnection.ERROR_INVALID_PARAMETER = 41
IPConnection.ERROR_FUNCTION_NOT_SUPPORTED = 42
IPConnection.ERROR_UNKNOWN_ERROR = 43
IPConnection.ERROR_STREAM_OUT_OF_SYNC = 51
IPConnection.ERROR_NON_ASCII_CHAR_IN_SECRET = 71
IPConnection.ERROR_WRONG_DEVICE_TYPE = 81
IPConnection.ERROR_DEVICE_REPLACED = 82
IPConnection.ERROR_WRONG_RESPONSE_LENGTH = 83
IPConnection.ERROR_INT64_NOT_SUPPORTED = 91
Der Namespace der JavaScript Bindings ist Tinkerforge.*.
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
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.
Trennt die TCP/IP Verbindung zum Brick Daemon oder einer WIFI/Ethernet Extension.
secret -- string
undefined
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.
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 -- 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.
boolean
Gibt true zurück wenn Auto-Reconnect aktiviert ist und false sonst.
timeout -- int
Setzt den Timeout in Millisekunden für Getter und für Setter die das Response-Expected-Flag aktiviert haben.
Standardwert ist 2500.
int
Gibt den Timeout zurück, wie er von setTimeout() gesetzt wurde.
Broadcast einer Enumerierungsanfrage. Alle Bricks und Bricklets werden mit einem Enumerate Callback antworten.
callback_id -- int
function -- function
Registriert die function 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 wird mit der Funktion on()
durchgeführt. Die Parameter bestehen aus dem IP Connection Objekt, der
Callback ID, der Callback Funktion und optionalen Benutzer Daten:
ipcon.on(IPConnection.CALLBACK_EXAMPLE,
function (param) {
console.log(param);
}
);
Die verfügbaren IDs mit den zugehörigen Callback Funktionssignaturen werden weiter unten beschrieben.
uid -- string
connectedUid -- string
position -- char
hardwareVersion -- [int, int, int]
firmwareVersion -- [int, int, int]
deviceIdentifier -- int
enumerationType -- int
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:
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
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-class>.DEVICE_IDENTIFIER
Zum Beispiel: Master.DEVICE_IDENTIFIER
oder AmbientLight.DEVICE_IDENTIFIER.
connectReason -- 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.
disconnectReason -- 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.