node-red-contrib-tcp-client-server-avd 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -11
- package/nodes/tcp-client-server.html +2 -2
- package/nodes/tcp-client-server.js +39 -4
- package/package.json +5 -2
- package/NodeRedTCP/README.md +0 -408
- package/NodeRedTCP/SPECIFICATIE.md +0 -460
- package/NodeRedTCP/nodes/tcp-client-server-avd.html +0 -298
- package/NodeRedTCP/nodes/tcp-client-server-avd.js +0 -606
- package/NodeRedTCP/package.json +0 -32
- package/SPECIFICATIE.md +0 -402
package/README.md
CHANGED
|
@@ -26,10 +26,11 @@ npm install
|
|
|
26
26
|
### TCP Client Mode
|
|
27
27
|
- Automatisch verbinden bij flow start (optioneel)
|
|
28
28
|
- Handmatig verbinden/verbreken via messages
|
|
29
|
-
-
|
|
29
|
+
- Robuuste automatische herconnectie (detectie via error, close en write-fouten)
|
|
30
|
+
- Snelle herverbinding (standaard 2 sec, minimum 1 sec)
|
|
30
31
|
- Ondersteuning voor verschillende dataformaten (String, Buffer, JSON, Hex)
|
|
31
32
|
- Message delimiter ondersteuning voor message framing
|
|
32
|
-
- Keep-alive optie
|
|
33
|
+
- Keep-alive optie (aanbevolen voor detectie van half-open verbindingen)
|
|
33
34
|
|
|
34
35
|
### TCP Server Mode
|
|
35
36
|
- Automatisch starten bij flow start (optioneel)
|
|
@@ -198,6 +199,15 @@ Als er geen topic is opgegeven, wordt de payload automatisch verzonden.
|
|
|
198
199
|
}
|
|
199
200
|
```
|
|
200
201
|
|
|
202
|
+
### ClientId bepalen (Server Mode)
|
|
203
|
+
|
|
204
|
+
Om naar een specifieke client te sturen heb je de `clientId` nodig. Deze is beschikbaar in:
|
|
205
|
+
|
|
206
|
+
1. **`client/connected`** – bij elke nieuwe clientverbinding
|
|
207
|
+
2. **`data`** – bij elk ontvangen bericht (via `msg.clientId`)
|
|
208
|
+
|
|
209
|
+
Bewaar de `clientId` uit een van deze messages en gebruik deze in je `send` message met `clientId: msg.clientId`.
|
|
210
|
+
|
|
201
211
|
## Configuratie Opties
|
|
202
212
|
|
|
203
213
|
### Client Mode
|
|
@@ -207,14 +217,14 @@ Als er geen topic is opgegeven, wordt de payload automatisch verzonden.
|
|
|
207
217
|
- **IP Versie**: IPv4 of IPv6 (standaard: IPv4)
|
|
208
218
|
- **Auto Verbinden**: Automatisch verbinden bij flow start (standaard: true)
|
|
209
219
|
- **Herconnectie**: Automatische herconnectie bij verbroken verbinding (standaard: true)
|
|
210
|
-
- **Reconnect Interval**: Tijd tussen reconnect pogingen in seconden (standaard:
|
|
220
|
+
- **Reconnect Interval**: Tijd tussen reconnect pogingen in seconden (standaard: 2, minimum: 1)
|
|
211
221
|
- **Max Reconnect Pogingen**: Maximum aantal reconnect pogingen (0 = oneindig, standaard: 0)
|
|
212
|
-
- **Connection Timeout**: Timeout voor
|
|
222
|
+
- **Connection Timeout**: Timeout voor het opzetten van de verbinding in seconden (standaard: 10). Wordt na succesvol verbinden uitgeschakeld; geen idle-timeout.
|
|
213
223
|
- **Input Format**: Data formaat voor verzenden (String, Buffer, JSON, Hex String)
|
|
214
224
|
- **Output Format**: Data formaat voor ontvangen (String, Buffer, JSON, Hex String)
|
|
215
225
|
- **Encoding**: Character encoding voor String format (UTF-8, ASCII, Latin1, Base64)
|
|
216
226
|
- **Message Delimiter**: Optionele delimiter voor message framing (bijv. `\n` of `\r\n`)
|
|
217
|
-
- **Keep-Alive**: TCP keep-alive optie (standaard: false)
|
|
227
|
+
- **Keep-Alive**: TCP keep-alive optie (standaard: false). Aanbevolen voor vroegtijdige detectie van verbroken verbindingen.
|
|
218
228
|
|
|
219
229
|
### Server Mode
|
|
220
230
|
|
|
@@ -228,7 +238,7 @@ Als er geen topic is opgegeven, wordt de payload automatisch verzonden.
|
|
|
228
238
|
- **Output Format**: Data formaat voor ontvangen (String, Buffer, JSON, Hex String)
|
|
229
239
|
- **Encoding**: Character encoding voor String format (UTF-8, ASCII, Latin1, Base64)
|
|
230
240
|
- **Message Delimiter**: Optionele delimiter voor message framing (bijv. `\n` of `\r\n`)
|
|
231
|
-
- **Keep-Alive**: TCP keep-alive optie (standaard: false)
|
|
241
|
+
- **Keep-Alive**: TCP keep-alive optie (standaard: false). Aanbevolen voor vroegtijdige detectie van verbroken verbindingen.
|
|
232
242
|
|
|
233
243
|
## Status Weergave
|
|
234
244
|
|
|
@@ -286,7 +296,7 @@ Een TCP client met automatische herconnectie.
|
|
|
286
296
|
- Port: 8080
|
|
287
297
|
- Auto Verbinden: aan
|
|
288
298
|
- Herconnectie: aan
|
|
289
|
-
- Reconnect Interval:
|
|
299
|
+
- Reconnect Interval: 2 seconden (of 1 voor snellere herverbinding)
|
|
290
300
|
- Max Reconnect Pogingen: 0 (oneindig)
|
|
291
301
|
|
|
292
302
|
### Voorbeeld 4: Server met Meerdere Clients
|
|
@@ -300,10 +310,15 @@ Een TCP server die data ontvangt van meerdere clients en responses terugstuurt.
|
|
|
300
310
|
|
|
301
311
|
**Function Node code:**
|
|
302
312
|
```javascript
|
|
303
|
-
// Echo de data terug naar dezelfde client
|
|
304
|
-
msg.topic
|
|
305
|
-
|
|
306
|
-
|
|
313
|
+
// Echo de data terug naar dezelfde client (clientId uit ontvangen bericht)
|
|
314
|
+
if (msg.topic === "data") {
|
|
315
|
+
return {
|
|
316
|
+
topic: "send",
|
|
317
|
+
clientId: msg.clientId,
|
|
318
|
+
payload: "Echo: " + msg.payload
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
return null;
|
|
307
322
|
```
|
|
308
323
|
|
|
309
324
|
## Troubleshooting
|
|
@@ -341,6 +356,13 @@ MIT
|
|
|
341
356
|
|
|
342
357
|
## Versie Geschiedenis
|
|
343
358
|
|
|
359
|
+
### Versie 1.1.0
|
|
360
|
+
- Robuuste verbindingscontrole: error handler triggert socket.destroy() voor betrouwbare herverbinding
|
|
361
|
+
- Write-error detectie: bij mislukte verzending wordt herverbinding gestart
|
|
362
|
+
- Snellere herverbinding: standaard 2 sec, minimum 1 sec
|
|
363
|
+
- Geen idle-timeout na verbinden: verbinding blijft open zolang beide partijen verbonden zijn
|
|
364
|
+
- Voorkomen dubbele reconnect en race conditions
|
|
365
|
+
|
|
344
366
|
### Versie 1.0.0
|
|
345
367
|
- Initiele release
|
|
346
368
|
- TCP Client functionaliteit
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
clientIpVersion: { value: "4" },
|
|
12
12
|
clientAutoConnect: { value: true },
|
|
13
13
|
clientReconnect: { value: true },
|
|
14
|
-
clientReconnectInterval: { value:
|
|
14
|
+
clientReconnectInterval: { value: 2, validate: function(v) { return /^\d+$/.test(v) && v >= 1; } },
|
|
15
15
|
clientMaxReconnectAttempts: { value: 0, validate: function(v) { return /^\d+$/.test(v) && v >= 0; } },
|
|
16
16
|
clientConnectionTimeout: { value: 10, validate: function(v) { return /^\d+$/.test(v) && v > 0; } },
|
|
17
17
|
clientInputFormat: { value: "string" },
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
|
|
119
119
|
<div class="form-row">
|
|
120
120
|
<label for="node-input-clientReconnectInterval"><i class="fa fa-clock-o"></i> Reconnect Interval (sec)</label>
|
|
121
|
-
<input type="number" id="node-input-clientReconnectInterval" placeholder="
|
|
121
|
+
<input type="number" id="node-input-clientReconnectInterval" placeholder="2" min="1" title="Minimum 1 seconde voor snelle herverbinding">
|
|
122
122
|
</div>
|
|
123
123
|
|
|
124
124
|
<div class="form-row">
|
|
@@ -118,7 +118,7 @@ module.exports = function(RED) {
|
|
|
118
118
|
ipVersion: config.clientIpVersion || "4",
|
|
119
119
|
autoConnect: config.clientAutoConnect !== false,
|
|
120
120
|
reconnect: config.clientReconnect !== false,
|
|
121
|
-
reconnectInterval: parseInt(config.clientReconnectInterval) ||
|
|
121
|
+
reconnectInterval: Math.max(1, parseInt(config.clientReconnectInterval) || 2),
|
|
122
122
|
maxReconnectAttempts: parseInt(config.clientMaxReconnectAttempts) || 0,
|
|
123
123
|
connectionTimeout: parseInt(config.clientConnectionTimeout) || 10,
|
|
124
124
|
inputFormat: config.clientInputFormat || "string",
|
|
@@ -187,6 +187,12 @@ module.exports = function(RED) {
|
|
|
187
187
|
return;
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
+
// Timer opruimen zodat een lopende herconnectie niet later de (nieuwe) verbinding verstoort
|
|
191
|
+
if (node.clientReconnectTimer) {
|
|
192
|
+
clearTimeout(node.clientReconnectTimer);
|
|
193
|
+
node.clientReconnectTimer = null;
|
|
194
|
+
}
|
|
195
|
+
|
|
190
196
|
if (node.clientSocket) {
|
|
191
197
|
node.clientSocket.destroy();
|
|
192
198
|
}
|
|
@@ -256,7 +262,14 @@ module.exports = function(RED) {
|
|
|
256
262
|
});
|
|
257
263
|
|
|
258
264
|
socket.on('close', function(hadError) {
|
|
265
|
+
// Alleen reageren als deze socket nog de actieve client-socket is.
|
|
266
|
+
// Anders is dit een late 'close' van een eerder vervangen socket en negeren we die
|
|
267
|
+
// om valse "verbinding verloren" en herconnectie te voorkomen.
|
|
268
|
+
if (node.clientSocket !== socket) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
259
271
|
node.clientConnected = false;
|
|
272
|
+
node.clientSocket = null;
|
|
260
273
|
node.status({ fill: "red", shape: "ring", text: "verbinding gesloten" });
|
|
261
274
|
|
|
262
275
|
const msg = {
|
|
@@ -267,16 +280,24 @@ module.exports = function(RED) {
|
|
|
267
280
|
};
|
|
268
281
|
node.send(msg);
|
|
269
282
|
|
|
270
|
-
|
|
283
|
+
// Robuuste herverbinding: alleen starten als nog geen timer loopt
|
|
284
|
+
if (!node.clientReconnectTimer && node.clientConfig.reconnect &&
|
|
285
|
+
(node.clientConfig.maxReconnectAttempts === 0 || node.clientReconnectAttempts < node.clientConfig.maxReconnectAttempts)) {
|
|
271
286
|
node.clientReconnectAttempts++;
|
|
287
|
+
const intervalMs = node.clientConfig.reconnectInterval * 1000;
|
|
272
288
|
node.clientReconnectTimer = setTimeout(function() {
|
|
289
|
+
node.clientReconnectTimer = null;
|
|
273
290
|
clientConnect();
|
|
274
|
-
},
|
|
291
|
+
}, intervalMs);
|
|
275
292
|
node.status({ fill: "yellow", shape: "ring", text: `herconnectie in ${node.clientConfig.reconnectInterval}s...` });
|
|
276
293
|
}
|
|
277
294
|
});
|
|
278
295
|
|
|
279
296
|
socket.on('error', function(err) {
|
|
297
|
+
// Alleen reageren als deze socket nog de actieve is (voorkom valse status bij oude socket).
|
|
298
|
+
if (node.clientSocket !== socket) {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
280
301
|
node.clientConnected = false;
|
|
281
302
|
node.status({ fill: "red", shape: "ring", text: `fout: ${err.message}` });
|
|
282
303
|
|
|
@@ -287,10 +308,16 @@ module.exports = function(RED) {
|
|
|
287
308
|
error: err.message
|
|
288
309
|
};
|
|
289
310
|
node.send(msg);
|
|
311
|
+
// Socket vernietigen zodat 'close' wordt getriggerd en herverbinding start
|
|
312
|
+
try { socket.destroy(); } catch (e) { /* negeer */ }
|
|
290
313
|
});
|
|
291
314
|
|
|
292
315
|
socket.on('timeout', function() {
|
|
293
316
|
// Timeout wordt alleen gebruikt tijdens connect, niet tijdens verbonden state
|
|
317
|
+
// Alleen reageren als deze socket nog de actieve is.
|
|
318
|
+
if (node.clientSocket !== socket) {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
294
321
|
if (!node.clientConnected) {
|
|
295
322
|
socket.destroy();
|
|
296
323
|
node.clientConnected = false;
|
|
@@ -330,9 +357,17 @@ module.exports = function(RED) {
|
|
|
330
357
|
toSend = Buffer.concat([formatted, delim]);
|
|
331
358
|
}
|
|
332
359
|
|
|
333
|
-
node.clientSocket.write(toSend)
|
|
360
|
+
node.clientSocket.write(toSend, function(err) {
|
|
361
|
+
if (err) {
|
|
362
|
+
node.clientConnected = false;
|
|
363
|
+
node.error("Verzenden mislukt: " + err.message);
|
|
364
|
+
try { node.clientSocket.destroy(); } catch (e) { /* negeer */ }
|
|
365
|
+
}
|
|
366
|
+
});
|
|
334
367
|
} catch (err) {
|
|
368
|
+
node.clientConnected = false;
|
|
335
369
|
node.error("Fout bij verzenden: " + err.message);
|
|
370
|
+
try { if (node.clientSocket) node.clientSocket.destroy(); } catch (e) { /* negeer */ }
|
|
336
371
|
}
|
|
337
372
|
}
|
|
338
373
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-red-contrib-tcp-client-server-avd",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Node-RED node voor TCP client en/of server functionaliteit",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"node-red",
|
|
@@ -14,12 +14,15 @@
|
|
|
14
14
|
"tcp-client-server-avd": "nodes/tcp-client-server.js"
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
|
-
"author": "",
|
|
17
|
+
"author": "Arie van Dijke",
|
|
18
18
|
"license": "MIT",
|
|
19
19
|
"engines": {
|
|
20
20
|
"node": ">=12.0.0"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"tar": "^7.0.0"
|
|
25
|
+
},
|
|
23
26
|
"repository": {
|
|
24
27
|
"type": "git",
|
|
25
28
|
"url": ""
|
package/NodeRedTCP/README.md
DELETED
|
@@ -1,408 +0,0 @@
|
|
|
1
|
-
# Node-RED TCP Client/Server Node (AVD)
|
|
2
|
-
|
|
3
|
-
Een flexibele Node-RED node die functioneert als TCP client en/of TCP server, met uitgebreide configuratiemogelijkheden en foutafhandeling.
|
|
4
|
-
|
|
5
|
-
## Installatie
|
|
6
|
-
|
|
7
|
-
### Via Node-RED Manage Palette (aanbevolen voor lokale installatie)
|
|
8
|
-
|
|
9
|
-
1. Open de Node-RED webinterface
|
|
10
|
-
2. Ga naar **Menu** → **Manage palette**
|
|
11
|
-
3. Klik op de **Install** tab
|
|
12
|
-
4. Klik op **install from** of gebruik het upload veld
|
|
13
|
-
5. Geef het volledige pad op naar het `.tgz` bestand:
|
|
14
|
-
```
|
|
15
|
-
C:\Users\Arie\Desktop\NodeRedTCP\node-red-contrib-tcp-client-server-avd-1.0.0.tgz
|
|
16
|
-
```
|
|
17
|
-
Of upload het bestand direct
|
|
18
|
-
6. Klik op **Install**
|
|
19
|
-
7. Herstart Node-RED (indien nodig)
|
|
20
|
-
|
|
21
|
-
### Via npm (aanbevolen voor gepubliceerde packages)
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
npm install node-red-contrib-tcp-client-server-avd
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### Handmatige installatie
|
|
28
|
-
|
|
29
|
-
1. Clone of download dit project
|
|
30
|
-
2. Kopieer de map naar je Node-RED `nodes` directory (meestal `~/.node-red/nodes/`)
|
|
31
|
-
3. Installeer dependencies:
|
|
32
|
-
```bash
|
|
33
|
-
cd ~/.node-red/nodes/node-red-contrib-tcp-client-server-avd
|
|
34
|
-
npm install
|
|
35
|
-
```
|
|
36
|
-
4. Herstart Node-RED
|
|
37
|
-
|
|
38
|
-
## Functionaliteiten
|
|
39
|
-
|
|
40
|
-
### TCP Client Mode
|
|
41
|
-
- Automatisch verbinden bij flow start (optioneel)
|
|
42
|
-
- Handmatig verbinden/verbreken via messages
|
|
43
|
-
- Automatische herconnectie met configureerbare instellingen
|
|
44
|
-
- Ondersteuning voor verschillende dataformaten (String, Buffer, JSON, Hex)
|
|
45
|
-
- Message delimiter ondersteuning voor message framing
|
|
46
|
-
- Keep-alive optie
|
|
47
|
-
|
|
48
|
-
### TCP Server Mode
|
|
49
|
-
- Automatisch starten bij flow start (optioneel)
|
|
50
|
-
- Luisteren op geconfigureerde poort
|
|
51
|
-
- Meerdere gelijktijdige client verbindingen
|
|
52
|
-
- Unieke client identificatie
|
|
53
|
-
- Broadcast naar alle clients of verzenden naar specifieke client
|
|
54
|
-
- Zelfde dataformaat ondersteuning als client mode
|
|
55
|
-
|
|
56
|
-
### Gecombineerde Mode
|
|
57
|
-
- Gebruik zowel client als server functionaliteit in één node
|
|
58
|
-
- Onafhankelijke configuratie voor beide modi
|
|
59
|
-
|
|
60
|
-
## Gebruik
|
|
61
|
-
|
|
62
|
-
### Basis Configuratie
|
|
63
|
-
|
|
64
|
-
1. Sleep de node naar je flow
|
|
65
|
-
2. Dubbelklik op de node om te configureren
|
|
66
|
-
3. Selecteer de gewenste mode: TCP Client, TCP Server, of TCP Client & Server
|
|
67
|
-
4. Configureer de instellingen volgens je behoeften
|
|
68
|
-
|
|
69
|
-
### Client Mode - Verbinden
|
|
70
|
-
|
|
71
|
-
**Automatisch verbinden:**
|
|
72
|
-
- Zet "Auto Verbinden" aan
|
|
73
|
-
- De client verbindt automatisch bij flow start
|
|
74
|
-
|
|
75
|
-
**Handmatig verbinden:**
|
|
76
|
-
- Zet "Auto Verbinden" uit
|
|
77
|
-
- Stuur een message met `topic: "connect"` naar de node
|
|
78
|
-
|
|
79
|
-
**Verbinden verbreken:**
|
|
80
|
-
- Stuur een message met `topic: "disconnect"` naar de node
|
|
81
|
-
|
|
82
|
-
### Server Mode - Server Beheer
|
|
83
|
-
|
|
84
|
-
**Automatisch starten:**
|
|
85
|
-
- Zet "Auto Start" aan
|
|
86
|
-
- De server start automatisch bij flow start
|
|
87
|
-
|
|
88
|
-
**Handmatig starten:**
|
|
89
|
-
- Zet "Auto Start" uit
|
|
90
|
-
- Stuur een message met `topic: "start"` naar de node
|
|
91
|
-
|
|
92
|
-
**Server stoppen:**
|
|
93
|
-
- Stuur een message met `topic: "stop"` naar de node
|
|
94
|
-
|
|
95
|
-
## Message Formats
|
|
96
|
-
|
|
97
|
-
### Input Messages (naar Node)
|
|
98
|
-
|
|
99
|
-
#### Client Mode
|
|
100
|
-
|
|
101
|
-
**Verbinden:**
|
|
102
|
-
```javascript
|
|
103
|
-
{ topic: "connect" }
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
**Verbreken:**
|
|
107
|
-
```javascript
|
|
108
|
-
{ topic: "disconnect" }
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
**Data verzenden:**
|
|
112
|
-
```javascript
|
|
113
|
-
{
|
|
114
|
-
topic: "send",
|
|
115
|
-
payload: "data om te verzenden" // string, buffer, of object
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
Als er geen topic is opgegeven, wordt de payload automatisch verzonden.
|
|
120
|
-
|
|
121
|
-
#### Server Mode
|
|
122
|
-
|
|
123
|
-
**Server starten:**
|
|
124
|
-
```javascript
|
|
125
|
-
{ topic: "start" }
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
**Server stoppen:**
|
|
129
|
-
```javascript
|
|
130
|
-
{ topic: "stop" }
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
**Data verzenden naar specifieke client:**
|
|
134
|
-
```javascript
|
|
135
|
-
{
|
|
136
|
-
topic: "send",
|
|
137
|
-
clientId: "client-unique-id",
|
|
138
|
-
payload: "data om te verzenden"
|
|
139
|
-
}
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
**Data verzenden naar alle clients (broadcast):**
|
|
143
|
-
```javascript
|
|
144
|
-
{
|
|
145
|
-
topic: "broadcast",
|
|
146
|
-
payload: "data om te verzenden"
|
|
147
|
-
}
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
### Output Messages (van Node)
|
|
151
|
-
|
|
152
|
-
#### Client Mode
|
|
153
|
-
|
|
154
|
-
**Verbindingsstatus:**
|
|
155
|
-
```javascript
|
|
156
|
-
{
|
|
157
|
-
topic: "status",
|
|
158
|
-
payload: "connected" | "disconnected" | "error",
|
|
159
|
-
status: "connected" | "disconnected" | "error",
|
|
160
|
-
error: "error message (indien van toepassing)"
|
|
161
|
-
}
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
**Ontvangen data:**
|
|
165
|
-
```javascript
|
|
166
|
-
{
|
|
167
|
-
topic: "data",
|
|
168
|
-
payload: "ontvangen data",
|
|
169
|
-
timestamp: "ISO timestamp"
|
|
170
|
-
}
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
#### Server Mode
|
|
174
|
-
|
|
175
|
-
**Server status:**
|
|
176
|
-
```javascript
|
|
177
|
-
{
|
|
178
|
-
topic: "status",
|
|
179
|
-
payload: "listening" | "stopped" | "error",
|
|
180
|
-
port: 1234,
|
|
181
|
-
error: "error message (indien van toepassing)"
|
|
182
|
-
}
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
**Client verbinding:**
|
|
186
|
-
```javascript
|
|
187
|
-
{
|
|
188
|
-
topic: "client/connected",
|
|
189
|
-
clientId: "unique-client-id",
|
|
190
|
-
remoteAddress: "client-ip",
|
|
191
|
-
remotePort: "client-port"
|
|
192
|
-
}
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
**Client verbreking:**
|
|
196
|
-
```javascript
|
|
197
|
-
{
|
|
198
|
-
topic: "client/disconnected",
|
|
199
|
-
clientId: "unique-client-id"
|
|
200
|
-
}
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
**Ontvangen data:**
|
|
204
|
-
```javascript
|
|
205
|
-
{
|
|
206
|
-
topic: "data",
|
|
207
|
-
payload: "ontvangen data",
|
|
208
|
-
clientId: "unique-client-id",
|
|
209
|
-
remoteAddress: "client-ip",
|
|
210
|
-
remotePort: "client-port",
|
|
211
|
-
timestamp: "ISO timestamp"
|
|
212
|
-
}
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
## Configuratie Opties
|
|
216
|
-
|
|
217
|
-
### Client Mode
|
|
218
|
-
|
|
219
|
-
- **Host**: Server hostname of IP adres (standaard: "localhost")
|
|
220
|
-
- **Port**: Server poort nummer (standaard: 8080)
|
|
221
|
-
- **IP Versie**: IPv4 of IPv6 (standaard: IPv4)
|
|
222
|
-
- **Auto Verbinden**: Automatisch verbinden bij flow start (standaard: true)
|
|
223
|
-
- **Herconnectie**: Automatische herconnectie bij verbroken verbinding (standaard: true)
|
|
224
|
-
- **Reconnect Interval**: Tijd tussen reconnect pogingen in seconden (standaard: 5)
|
|
225
|
-
- **Max Reconnect Pogingen**: Maximum aantal reconnect pogingen (0 = oneindig, standaard: 0)
|
|
226
|
-
- **Connection Timeout**: Timeout voor connectiepogingen in seconden (standaard: 10)
|
|
227
|
-
- **Input Format**: Data formaat voor verzenden (String, Buffer, JSON, Hex String)
|
|
228
|
-
- **Output Format**: Data formaat voor ontvangen (String, Buffer, JSON, Hex String)
|
|
229
|
-
- **Encoding**: Character encoding voor String format (UTF-8, ASCII, Latin1, Base64)
|
|
230
|
-
- **Message Delimiter**: Optionele delimiter voor message framing (bijv. `\n` of `\r\n`)
|
|
231
|
-
- **Keep-Alive**: TCP keep-alive optie (standaard: false)
|
|
232
|
-
|
|
233
|
-
### Server Mode
|
|
234
|
-
|
|
235
|
-
- **Listen Port**: Poort waarop de server luistert (standaard: 8080)
|
|
236
|
-
- **Bind Address**: IP adres om aan te binden (standaard: "0.0.0.0" = alle interfaces)
|
|
237
|
-
- **IP Versie**: IPv4 of IPv6 (standaard: IPv4)
|
|
238
|
-
- **Auto Start**: Automatisch starten bij flow start (standaard: true)
|
|
239
|
-
- **Max Connections**: Maximum aantal gelijktijdige verbindingen (0 = onbeperkt, standaard: 0)
|
|
240
|
-
- **Connection Timeout**: Timeout voor client verbindingen in seconden (standaard: 600)
|
|
241
|
-
- **Input Format**: Data formaat voor verzenden (String, Buffer, JSON, Hex String)
|
|
242
|
-
- **Output Format**: Data formaat voor ontvangen (String, Buffer, JSON, Hex String)
|
|
243
|
-
- **Encoding**: Character encoding voor String format (UTF-8, ASCII, Latin1, Base64)
|
|
244
|
-
- **Message Delimiter**: Optionele delimiter voor message framing (bijv. `\n` of `\r\n`)
|
|
245
|
-
- **Keep-Alive**: TCP keep-alive optie (standaard: false)
|
|
246
|
-
|
|
247
|
-
## Status Weergave
|
|
248
|
-
|
|
249
|
-
De node toont verschillende status indicatoren:
|
|
250
|
-
|
|
251
|
-
### Client Mode
|
|
252
|
-
- **Groen (verbonden)**: Succesvol verbonden met server
|
|
253
|
-
- **Rood (fout)**: Verbindingsfout of verbreken
|
|
254
|
-
- **Grijs (niet verbonden)**: Niet verbonden
|
|
255
|
-
- **Geel (verbinden)**: Verbinding wordt tot stand gebracht
|
|
256
|
-
|
|
257
|
-
### Server Mode
|
|
258
|
-
- **Groen (luisterend)**: Server luistert actief op poort
|
|
259
|
-
- **Rood (gestopt/fout)**: Server is gestopt of fout opgetreden
|
|
260
|
-
- **Blauw (actief)**: Server actief met X verbindingen
|
|
261
|
-
|
|
262
|
-
## Voorbeelden
|
|
263
|
-
|
|
264
|
-
### Voorbeeld 1: Basis TCP Client
|
|
265
|
-
|
|
266
|
-
Een eenvoudige TCP client die verbindt met een server en data verzendt/ontvangt.
|
|
267
|
-
|
|
268
|
-
**Flow:**
|
|
269
|
-
```
|
|
270
|
-
[Inject] → [TCP Client Node] → [Debug]
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
**Configuratie:**
|
|
274
|
-
- Mode: TCP Client
|
|
275
|
-
- Host: localhost
|
|
276
|
-
- Port: 8080
|
|
277
|
-
- Auto Verbinden: aan
|
|
278
|
-
|
|
279
|
-
### Voorbeeld 2: Basis TCP Server
|
|
280
|
-
|
|
281
|
-
Een TCP server die luistert op poort 8080 en data ontvangt van clients.
|
|
282
|
-
|
|
283
|
-
**Flow:**
|
|
284
|
-
```
|
|
285
|
-
[TCP Server Node] → [Debug]
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
**Configuratie:**
|
|
289
|
-
- Mode: TCP Server
|
|
290
|
-
- Listen Port: 8080
|
|
291
|
-
- Auto Start: aan
|
|
292
|
-
|
|
293
|
-
### Voorbeeld 3: Client met Reconnect
|
|
294
|
-
|
|
295
|
-
Een TCP client met automatische herconnectie.
|
|
296
|
-
|
|
297
|
-
**Configuratie:**
|
|
298
|
-
- Mode: TCP Client
|
|
299
|
-
- Host: 192.168.1.100
|
|
300
|
-
- Port: 8080
|
|
301
|
-
- Auto Verbinden: aan
|
|
302
|
-
- Herconnectie: aan
|
|
303
|
-
- Reconnect Interval: 5 seconden
|
|
304
|
-
- Max Reconnect Pogingen: 0 (oneindig)
|
|
305
|
-
|
|
306
|
-
### Voorbeeld 4: Server met Meerdere Clients
|
|
307
|
-
|
|
308
|
-
Een TCP server die data ontvangt van meerdere clients en responses terugstuurt.
|
|
309
|
-
|
|
310
|
-
**Flow:**
|
|
311
|
-
```
|
|
312
|
-
[TCP Server Node] → [Function Node] → [TCP Server Node]
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
**Function Node code:**
|
|
316
|
-
```javascript
|
|
317
|
-
// Echo de data terug naar dezelfde client
|
|
318
|
-
msg.topic = "send";
|
|
319
|
-
msg.payload = "Echo: " + msg.payload;
|
|
320
|
-
return msg;
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
## Troubleshooting
|
|
324
|
-
|
|
325
|
-
### Client kan niet verbinden
|
|
326
|
-
|
|
327
|
-
1. Controleer of de server draait en bereikbaar is
|
|
328
|
-
2. Controleer firewall instellingen
|
|
329
|
-
3. Controleer host en port configuratie
|
|
330
|
-
4. Bekijk de status van de node voor foutmeldingen
|
|
331
|
-
|
|
332
|
-
### Server kan niet starten
|
|
333
|
-
|
|
334
|
-
1. Controleer of de poort niet al in gebruik is
|
|
335
|
-
2. Controleer of je rechten hebt om op de poort te luisteren (voor poorten < 1024 op Linux/Mac)
|
|
336
|
-
3. Controleer firewall instellingen
|
|
337
|
-
4. Bekijk de status van de node voor foutmeldingen
|
|
338
|
-
|
|
339
|
-
### Data wordt niet correct ontvangen
|
|
340
|
-
|
|
341
|
-
1. Controleer de Output Format configuratie
|
|
342
|
-
2. Controleer de Encoding instelling
|
|
343
|
-
3. Voor message framing, gebruik de Message Delimiter optie
|
|
344
|
-
4. Voor binary data, gebruik Buffer format
|
|
345
|
-
|
|
346
|
-
## Bekende Beperkingen
|
|
347
|
-
|
|
348
|
-
- TLS/SSL ondersteuning is nog niet geïmplementeerd (toekomstige versie)
|
|
349
|
-
- UDP protocol wordt niet ondersteund (alleen TCP)
|
|
350
|
-
- Rate limiting is nog niet beschikbaar
|
|
351
|
-
|
|
352
|
-
## Licentie
|
|
353
|
-
|
|
354
|
-
MIT
|
|
355
|
-
|
|
356
|
-
## Versie Geschiedenis
|
|
357
|
-
|
|
358
|
-
### Versie 1.0.0
|
|
359
|
-
- Initiele release
|
|
360
|
-
- TCP Client functionaliteit
|
|
361
|
-
- TCP Server functionaliteit
|
|
362
|
-
- Gecombineerde mode
|
|
363
|
-
- String, Buffer, JSON, en Hex data formaten
|
|
364
|
-
- Automatische herconnectie
|
|
365
|
-
- Message delimiter ondersteuning
|
|
366
|
-
- IPv4 en IPv6 ondersteuning
|
|
367
|
-
- Keep-alive optie
|
|
368
|
-
- Meerdere client verbindingen (server mode)
|
|
369
|
-
- Package structuur geoptimaliseerd:
|
|
370
|
-
- Bestandsnamen: `tcp-client-server-avd.js/html`
|
|
371
|
-
- package.json bijgewerkt met `main` en `files` velden
|
|
372
|
-
- Node configuratie vereenvoudigd (automatische HTML detectie)
|
|
373
|
-
- Distributie via `npm pack` voor correcte package structuur
|
|
374
|
-
- Installatie via Node-RED Manage Palette ondersteund
|
|
375
|
-
|
|
376
|
-
## Package Details
|
|
377
|
-
|
|
378
|
-
### Package Structuur
|
|
379
|
-
```
|
|
380
|
-
node-red-contrib-tcp-client-server-avd/
|
|
381
|
-
├── package.json
|
|
382
|
-
├── README.md
|
|
383
|
-
├── SPECIFICATIE.md
|
|
384
|
-
└── nodes/
|
|
385
|
-
├── tcp-client-server-avd.js
|
|
386
|
-
└── tcp-client-server-avd.html
|
|
387
|
-
```
|
|
388
|
-
|
|
389
|
-
### Node Type
|
|
390
|
-
- **Node type naam**: `tcp-client-server-avd`
|
|
391
|
-
- **Package naam**: `node-red-contrib-tcp-client-server-avd`
|
|
392
|
-
- **Versie**: 1.0.0
|
|
393
|
-
|
|
394
|
-
### Distributie
|
|
395
|
-
Het package wordt gedistribueerd als `.tgz` bestand dat kan worden geïnstalleerd via:
|
|
396
|
-
- Node-RED Manage Palette (upload of pad)
|
|
397
|
-
- npm (na publicatie)
|
|
398
|
-
- Handmatige installatie
|
|
399
|
-
|
|
400
|
-
Om een nieuw distributie-bestand te maken:
|
|
401
|
-
```bash
|
|
402
|
-
cd NodeRedTCP
|
|
403
|
-
npm pack
|
|
404
|
-
```
|
|
405
|
-
|
|
406
|
-
## Ondersteuning
|
|
407
|
-
|
|
408
|
-
Voor vragen, problemen of suggesties, open een issue op de GitHub repository.
|