Ενσωμάτωση TCP/UDP
Το πρωτόκολλο TCP/UDP προορίζεται για συσκευές που επικοινωνούν με απλές εντολές απευθείας μέσω network socket — χωρίς web API, χωρίς μοντέλο καταχωρητών: επαγγελματικά audio players και μήτρες ήχου (AUDAC XMP44 και μονάδες SourceCon), βιντεοπροβολείς (PJLink), οθόνες και ενισχυτές πίσω από γέφυρες RS-232-over-IP, καθώς και προσαρμοσμένες πλακέτες μικροελεγκτών. Ορίζετε τα πλαίσια εντολών (command frames) που στέλνει το HyperVisu όταν αλλάζει μια τιμή, τα μοτίβα (patterns) που εξάγουν τιμές από τα πλαίσια απάντησης της συσκευής, και προαιρετικά πλαίσια ερωτημάτων (query frames) για polling. Όλες οι ειδικές ρυθμίσεις της συσκευής βρίσκονται στην παραμετροποίηση, καμία στον server.
Κάθε σύνδεση αντιστοιχεί σε μία συσκευή, μέσω TCP (μία μόνιμη σύνδεση, ανοιχτή συνεχώς με αυτόματη επανασύνδεση) ή UDP (datagrams). Μέσω TCP, όλα τα αντικείμενα της συσκευής μοιράζονται το ίδιο μοναδικό socket — γεγονός απαραίτητο για συσκευές που δέχονται μόνο έναν client (όπως το XMP44).
Τι χρειάζεστε: τη διεύθυνση IP και τη θύρα της συσκευής, το εγχειρίδιο εντολών της (σύνταξη πλαισίου, οριοθέτη, εντολές και απαντήσεις ανάδρασης), καθώς και αν στέλνει αυτόματα αλλαγές κατάστασης (push) ή απαιτείται περιοδική ανάγνωση (poll).
Συνδέσεις. Το TCP/UDP υποστηρίζει πολλαπλές συνδέσεις: μία σύνδεση ανά συσκευή (βλ. «Συνδέσεις»). Πεδία:
| Πεδίο | Περιγραφή |
|---|---|
| Device address | Διεύθυνση IP ή hostname της συσκευής. |
| Port | Η θύρα TCP ή UDP στην οποία ακούει η συσκευή (AUDAC XMP44: 5001). |
| Poll Interval (seconds) | Συχνότητα περιοδικής ανάγνωσης της συσκευής. 0 για συσκευή που στέλνει αυτόματα την κατάστασή της (push). |
| Transport | TCP · persistent connection ή UDP · datagrams. |
| Frame delimiter | Χαρακτήρας οριοθέτησης μεταξύ δύο πλαισίων — \r\n για σχεδόν όλα τα πρωτόκολλα κειμένου. |
| Payload encoding | ASCII text για πρωτόκολλα κειμένου, HEX bytes για δυαδικά πρωτόκολλα. |
| Listen port | Μόνο για UDP. Για συσκευές που στέλνουν δεδομένα (push) σε σταθερή θύρα. Αν μείνει κενό, οι απαντήσεις επιστρέφουν στη θύρα αποστολής του server. |
| Heartbeat frame / Every | Μόνο για TCP, προαιρετικό. Πλαίσιο που αποστέλλεται σε κατάσταση αδράνειας ώστε η συσκευή να μην κλείσει τη σύνδεση (τουλάχιστον ανά 5 s). Στην προεπισκόπηση Frame sent εμφανίζεται με ορατούς τους χαρακτήρες ελέγχου. |
| Connect timeout | Χρόνος αναμονής για την αποδοχή της σύνδεσης από τη συσκευή (ms, προεπιλογή 5000). |
| Delay between commands | Πολλές συσκευές απορρίπτουν διαδοχικές εντολές. Αυξήστε αυτήν την τιμή αν κάποιες αγνοούνται (ms, προεπιλογή 50). |
| Read everything on connect | Ενεργό: Το HyperVisu στέλνει όλα τα ερωτήματα μία φορά μόλις η συσκευή συνδεθεί, ώστε η εφαρμογή να εμφανίζει την πραγματική κατάσταση χωρίς αναμονή του πρώτου κύκλου polling. |
Το παράθυρο διαλόγου Add connection ζητά τα πεδία Instance Name, Device address, Port, Poll Interval (seconds), Transport και Frame delimiter (προεπιλογές 30, TCP · persistent connection και \r\n). Τα υπόλοιπα πεδία βρίσκονται στην ενότητα Framing and timing της αποθηκευμένης σύνδεσης: επιλέξτε τη νέα σύνδεση, ρυθμίστε τα και πατήστε Save connection.
Το κουμπί Test στο παράθυρο διαλόγου Add connection ανοίγει ένα socket στη διεύθυνση που πληκτρολογήσατε. Αυτό επιβεβαιώνει μόνο ότι η συσκευή είναι προσβάσιμη, όχι ότι αναγνωρίζει τα πλαίσιά σας. Σε μια αποθηκευμένη σύνδεση, όταν η υπηρεσία διατηρεί ήδη τη μοναδική σύνδεση της συσκευής, το Test αναφέρει την τρέχουσα κατάσταση λειτουργίας και τον αριθμό εισερχόμενων/εξερχόμενων πλαισίων αντί να ανοίξει δεύτερο socket.

Σύνδεση αντικειμένου (Binding) (βλ. παρακάτω «Αντιστοίχιση TCP/UDP»). Για κάθε αντικείμενο ορίζετε ένα Key — ένα σύντομο κείμενο που περιέχεται σε κάθε απάντηση με αυτήν την τιμή: μόνο τα εισερχόμενα πλαίσια που περιέχουν το κλειδί ελέγχονται με το μοτίβο αντιστοίχισης (match pattern) του αντικειμένου (για την AUDAC, το όνομα της εντολής ανάδρασης: OG1, FREQ2). Η σύγκριση διακρίνει πεζά/κεφαλαία (case-sensitive) και το κλειδί δεν μπορεί να περιέχει :. Δύο αντικείμενα μπορούν να μοιράζονται το ίδιο κλειδί, για παράδειγμα ένα αντικείμενο εντολής και το αντίστοιχο αντικείμενο ανάδρασης. Στη διαχείριση αποθηκεύεται ως <connection>:<key>. Το υπόλοιπο τμήμα είναι η συμβολοσειρά τύπου δεδομένων του αντικειμένου, η οποία δημιουργείται από τα πεδία του επεξεργαστή:
| Πεδίο | Αποθήκευση ως | Σημασία |
|---|---|---|
| Payload encoding | ASCII / HEX | Πρώτο στοιχείο της συμβολοσειράς. Δεν αλλάζει τα δεδομένα που αποστέλλονται ούτε τον τρόπο ανάγνωσης των απαντήσεων: η κωδικοποίηση ορίζεται στις ρυθμίσεις της σύνδεσης στο Framing and timing. |
| Command template | SEND= | Αποστέλλεται όταν αλλάζει η τιμή (αντικείμενα Out και In/Out). Το ${value} αντικαθίσταται από την τιμή. |
| Different commands for ON and OFF → Command for ON / Command for OFF | SEND1= / SEND0= | Για boolean αντικείμενα των οποίων η συσκευή χρησιμοποιεί δύο ξεχωριστές εντολές (SPPLAY1 / SPSTOP1) αντί για μία εντολή με παράμετρο 0/1. Αφήστε το OFF κενό για μπουτόν μονής ενέργειας. |
| Query template | POLL= | Αποστέλλεται σε κάθε κύκλο poll και μία φορά κατά τη σύνδεση (αντικείμενα In και In/Out). Αφήστε το κενό για συσκευές που στέλνουν αυτόματα δεδομένα (push). |
| Match pattern | MATCH= | Εφαρμόζεται σε κάθε εισερχόμενο πλαίσιο που περιέχει το κλειδί. Η τιμή που απομονώνει καταχωρείται ως τιμή του αντικειμένου. Χωρίς αυτό, το αντικείμενο In δεν λαμβάνει ποτέ τιμή. |
| Scale / Offset | SCALE= / OFFSET= | Ανάγνωση: value = raw × scale + offset. Κατά την εγγραφή χρησιμοποιείται η αντίστροφη πράξη. Μόνο για αριθμητικές τιμές. |
| Acknowledge pattern / Acknowledge timeout (ms) | ACK= / ACKTIMEOUT= | Προαιρετικό. Όταν οριστεί, η εγγραφή θεωρείται επιτυχής μόνο εφόσον ένα πλαίσιο ταιριάξει με το μοτίβο εντός του χρονικού ορίου (προεπιλογή 2000 ms). |
Τα πρότυπα (templates) χρησιμοποιούν το ${value}, καθώς και ${value:d} για στρογγυλοποίηση κλιμακωμένης τιμής σε ακέραιο (π.χ. ρυθμιστικό 0–100 % για συσκευή που δέχεται μόνο ακεραίους), ${value:02d} για ακέραιο με συμπλήρωση μηδενικών, ${value:1f} για σταθερό αριθμό δεκαδικών ψηφίων, και σε λειτουργία HEX τα ${value:u8}, ${value:u16be}, ${value:u16le}, ${value:u32be}, ${value:u32le} για bytes σταθερού πλάτους. Οι χαρακτήρες \r, \n, \t και \xNN χρησιμοποιούνται ως byte escapes. Σε λειτουργία ASCII, εάν παραλειφθεί ο οριοθέτης από το πρότυπο, προστίθεται αυτόματα στο τέλος.
Τα μοτίβα αντιστοίχισης (match patterns) χρησιμοποιούν τα παρακάτω tokens. Όλα τα υπόλοιπα στοιχεία συγκρίνονται επακριβώς ως απλό κείμενο:
| Token | Λειτουργία / εξαγωγή |
|---|---|
\v | αριθμός |
\h | δεκαεξαδικός (hex), αναγιγνώσκεται ως αριθμός |
\a | κείμενο, μέχρι τον επόμενο σταθερό χαρακτήρα (για αντικείμενα κειμένου) |
\iText\i | παράκαμψη του κειμένου "Text" |
\sN | παράκαμψη N χαρακτήρων |
\d \w \. | ψηφίο / λέξη / οποιοσδήποτε χαρακτήρας |
Ο επεξεργαστής εμφανίζει το πεδίο Frame sent με ορατούς τους χαρακτήρες ελέγχου (# | D001 | hv | SOG1 | 28 | U | <CR><LF>), καθώς και την αποθηκευμένη συμβολοσειρά. Το Frame sent είναι προεπισκόπηση, όχι αρχείο καταγραφής: κάθε μεταβλητή ${value…} αντικαθίσταται από την ενδεικτική τιμή 28, χωρίς τη μορφοποίηση τιμής ή την κλιμάκωση, ενώ για αντικείμενα με ξεχωριστές εντολές ON και OFF εμφανίζει μόνο την εντολή ON. Δεν εμφανίζει τον οριοθέτη που προσθέτει αυτόματα ο server σε λειτουργία ASCII. Ελέγξτε την πραγματική εντολή και απόκριση απευθείας στη συσκευή.

Χρήσιμες πληροφορίες λειτουργίας
- Κατεύθυνση. Τα αντικείμενα In εκτελούν αντιστοίχιση (και poll, εφόσον διαθέτουν ερώτημα), τα αντικείμενα Out εκτελούν αποστολή, ενώ τα αντικείμενα In/Out εκτελούν και τα δύο — η απάντηση της ίδιας της συσκευής αποτελεί την επιβεβαίωση, όπως ακριβώς συμβαίνει με τα αντικείμενα κατάστασης (status) στο KNX.
- Ένα πλαίσιο, πολλά αντικείμενα. Κάθε εισερχόμενο πλαίσιο ελέγχεται έναντι όλων των αντικειμένων In της σύνδεσης των οποίων το κλειδί περιέχεται σε αυτό. Έτσι, ένα μόνο πλαίσιο κατάστασης μπορεί να ενημερώσει πολλαπλά αντικείμενα. Πανομοιότυπα πρότυπα ερωτημάτων αποστέλλονται μία φορά ανά κύκλο poll.
- TCP. Σε περίπτωση διακοπής, η επανασύνδεση πραγματοποιείται με σταδιακά αυξανόμενη καθυστέρηση. Κατά την επανασύνδεση, τα ερωτήματα εκτελούνται ξανά εφόσον είναι ενεργό το Read everything on connect. Τα εξερχόμενα πλαίσια τοποθετούνται σε ουρά με χρονική απόσταση ίση με το Delay between commands.
- UDP. Κάθε datagram αντιστοιχεί σε ένα πλαίσιο. Για αυτόματες αποστολές (unsolicited push) απαιτείται η ρύθμιση του Listen port.
- Οι εντολές που αποστέλλονται ενώ η συσκευή είναι εκτός σύνδεσης αποτυγχάνουν χωρίς να μπλοκάρουν άλλες διεργασίες. Η εφαρμογή διατηρεί την τελευταία γνωστή κατάσταση.
Παράδειγμα εφαρμογής — Media player AUDAC XMP44
Το XMP44 ακούει σε TCP θύρα 5001, δέχεται έναν μόνο client και χρησιμοποιεί πλαίσια της μορφής # | D001 | <source> | <command> | <argument> | <checksum> | <CR><LF> — ο χαρακτήρας U γίνεται δεκτός ως checksum. Η ρύθμιση του κέρδους εξόδου (gain) γίνεται με SOG1 | <arg> όπου arg = 8 − dB. Η συσκευή απαντά με πλαίσιο ενημέρωσης … | OG1 | <arg> | …, το οποίο εκπέμπει αυτόματα και όταν το gain ρυθμιστεί από την πρόσοψη. Η αναπαραγωγή και η διακοπή αποτελούν δύο ξεχωριστές εντολές (SPPLAY1, SPSTOP1).
-
Δημιουργήστε μια σύνδεση TCP/UDP (βλ. «Συνδέσεις»): διεύθυνση
192.168.1.60, θύρα5001, πρωτόκολλο μεταφοράς TCP, οριοθέτης\r\n, διάστημα ανάγνωσης (poll)30. Πατήστε Test και μετά Create connection. Επιλέξτε τη νέα σύνδεση και, στην ενότητα Framing and timing, αφήστε ενεργό το Read everything on connect και ορίστε heartbeat# | D001 | hv | GTPS | 0 | U | \r\nανά120s. Πατήστε Save connection. -
Στο μενού Devices, προσθέστε ένα widget Audio με όνομα "XMP44 player" και επιλέξτε αυτήν τη σύνδεση στο πεδίο Protocol.
-
Στο αντικείμενο volume (In/Out): key
OG1, command template# | D001 | hv | SOG1 | ${value:d} | U | \r\n, query template# | D001 | hv | GOG1 | 0 | U | \r\n, match pattern\i | OG1 | \i\v, scale-1, offset8— έτσι τα −20 dB αποστέλλονται ως28και η λήψη τιμής28αναγιγνώσκεται ως −20 dB. -
Στο αντικείμενο play (Out, boolean): key
PLAY1, Different commands for ON and OFF: ON# | D001 | hv | SPPLAY1 | 0 | U | \r\n, OFF# | D001 | hv | SPSTOP1 | 0 | U | \r\n. -
Στο αντικείμενο track title (In, text): key
SON1, query# | D001 | hv | GSON1 | 0 | U | \r\n, match\i | SON1 | \i\a |. -
Πατήστε Save object σε κάθε αντικείμενο, έπειτα πατήστε Apply changes στην πλευρική στήλη και επιβεβαιώστε. Η μετακίνηση του ρυθμιστικού έντασης στέλνει την εντολή
SOG1, η απάντησηOG1της συσκευής επιβεβαιώνει τη νέα στάθμη και οποιαδήποτε αλλαγή από την πρόσοψη της συσκευής ενημερώνει άμεσα την εφαρμογή.
💡 Συμβουλή: Έχετε διαθέσιμο το εγχειρίδιο εντολών της συσκευής κατά την παραμετροποίηση — το κλειδί (key) είναι το όνομα της ανάδρασης (
OG1), το οποίο στην AUDAC διαφέρει από το όνομα της εντολής ελέγχου (SOG1).
Αντιστοίχιση TCP/UDP
Τα αντικείμενα TCP/UDP παραμετροποιούνται στο παράθυρο διαλόγου ρυθμίσεων αντικειμένου (βλ. «Ρυθμίσεις αντικειμένου, καταγραφή και ειδοποιήσεις»). Οι καρτέλες περιλαμβάνουν:
Frame addressing
| Πεδίο | Περιγραφή |
|---|---|
| Key | Κείμενο που περιέχεται σε κάθε απάντηση με την τιμή αυτού του αντικειμένου — π.χ. OG1. Μόνο τα εισερχόμενα πλαίσια που περιέχουν το κλειδί ελέγχονται έναντι του μοτίβου αντιστοίχισης (match pattern). Η σύγκριση διακρίνει πεζά/κεφαλαία. Δεν επιτρέπεται ο χαρακτήρας :. Το κλειδί δεν απαιτείται να είναι μοναδικό: δύο αντικείμενα μπορούν να μοιράζονται το ίδιο, για παράδειγμα ένα αντικείμενο εντολής και το αντίστοιχο αντικείμενο ανάδρασης. Η αποθηκευμένη διεύθυνση είναι <connection>:<key>. |
| Payload encoding | ASCII text για πρωτόκολλα κειμένου, HEX bytes για δυαδικά πρωτόκολλα. |
Commands sent (εξερχόμενα αντικείμενα)
| Πεδίο | Περιγραφή |
|---|---|
| Command template | Αποστέλλεται όταν αλλάζει η τιμή. Το ${value} αντικαθίσταται από την τιμή (το ${value:d} τη στρογγυλοποιεί σε ακέραιο). Τα \r, \n, \xNN χρησιμοποιούνται ως byte escapes. |
| Different commands for ON and OFF | Boolean αντικείμενα: εμφανίζει τα πεδία Command for ON και Command for OFF για συσκευές που χρησιμοποιούν δύο ξεχωριστές εντολές αντί για μία εντολή με παράμετρο 0/1. Αφήστε το OFF κενό για μπουτόν μονής ενέργειας. |
| Acknowledge pattern / Acknowledge timeout (ms) | Προαιρετικό. Όταν οριστεί, η εγγραφή θεωρείται επιτυχής μόνο εφόσον ένα πλαίσιο ταιριάξει με αυτό το μοτίβο εντός του χρονικού ορίου. |
Values read back (εισερχόμενα αντικείμενα)
| Πεδίο | Περιγραφή |
|---|---|
| Query template | Αποστέλλεται σε κάθε κύκλο poll και μία φορά κατά τη σύνδεση. Αφήστε το κενό για συσκευές που στέλνουν αυτόματα δεδομένα (push). |
| Match pattern | Εφαρμόζεται σε κάθε εισερχόμενο πλαίσιο που περιέχει το κλειδί. Η τιμή που απομονώνει καταχωρείται ως τιμή του αντικειμένου. Tokens: \v αριθμός · \h hex, αναγιγνώσκεται ως αριθμός · \a κείμενο, μέχρι τον επόμενο σταθερό χαρακτήρα · \iText\i παράκαμψη κειμένου "Text" · \sN παράκαμψη N χαρακτήρων · \d \w \. ψηφίο / λέξη / οποιοσδήποτε χαρακτήρας. Χωρίς μοτίβο αντιστοίχισης, το αντικείμενο δεν λαμβάνει ποτέ τιμή. |
| Scale / Offset | Ανάγνωση: value = raw × scale + offset. Κατά την εγγραφή χρησιμοποιείται η αντίστροφη πράξη. |
Κάτω από τις καρτέλες, το πεδίο Frame sent εμφανίζει το τελικό εξερχόμενο πλαίσιο για μια ενδεικτική τιμή με ορατούς τους χαρακτήρες ελέγχου (… | 28 | U | <CR><LF>), ενώ το πεδίο Stored as εμφανίζει τη συμβολοσειρά τύπου δεδομένων που θα αποθηκευτεί. Η σύνταξη των μοτίβων, τα πρότυπα και το παράδειγμα εφαρμογής για συσκευή AUDAC περιγράφονται στην παραπάνω ενότητα TCP/UDP.
