Documentation
¶
Overview ¶
Package knx holds the types shared by every part of go-knx: individual and group addresses, telegram priorities, the sentinel errors, the logging and metrics interfaces and the connection state.
The protocol is layered over the subpackages:
- knxnetip: KNXnet/IP frames (header, HPAI, DIB, CRI/CRD and every core, tunnelling, routing, device management and secure service),
- cemi: the common External Message Interface (L_Data, M_Prop*),
- apdu: the transport and application layer of a telegram (TPCI, APCI),
- dpt: datapoint types (encoders, decoders, registry),
- discovery: KNXnet/IP search and description,
- tunnel: the KNXnet/IP tunnelling client,
- routing: KNXnet/IP routing over IP multicast,
- client: group communication (read, write, response, subscriptions) over a tunnel or routing link,
- server: a KNXnet/IP server (discovery, description, tunnelling, routing) with virtual group objects.
KNX is the building automation standard of the KNX Association (ISO/IEC 14543-3). go-knx is an independent implementation; it is not certified by the KNX Association.
Index ¶
- Variables
- func ParseGroupAddressWithFormat(s string) (GroupAddress, GroupAddressFormat, error)
- type ContextLogger
- type FieldLogger
- type GroupAddress
- func (g GroupAddress) Format(f GroupAddressFormat) string
- func (g GroupAddress) Main() uint8
- func (g GroupAddress) MarshalText() ([]byte, error)
- func (g GroupAddress) Middle() uint8
- func (g GroupAddress) String() string
- func (g GroupAddress) Sub() uint8
- func (g GroupAddress) Sub2() uint16
- func (g GroupAddress) Uint16() uint16
- func (g *GroupAddress) UnmarshalText(b []byte) error
- type GroupAddressFormat
- type IndividualAddress
- func (a IndividualAddress) Area() uint8
- func (a IndividualAddress) Device() uint8
- func (a IndividualAddress) Line() uint8
- func (a IndividualAddress) MarshalText() ([]byte, error)
- func (a IndividualAddress) String() string
- func (a IndividualAddress) Uint16() uint16
- func (a *IndividualAddress) UnmarshalText(b []byte) error
- type Logger
- type Metrics
- type NopMetrics
- func (NopMetrics) OnConnect(net.Addr, uint8)
- func (NopMetrics) OnDecodeError(net.Addr, error)
- func (NopMetrics) OnDisconnect(net.Addr, uint8, error)
- func (NopMetrics) OnDropped(net.Addr, string)
- func (NopMetrics) OnFrameReceived(net.Addr, uint16, int)
- func (NopMetrics) OnFrameSent(net.Addr, uint16, int)
- func (NopMetrics) OnRetransmit(net.Addr, uint8)
- type Priority
- type State
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( // ErrInvalidAddress reports an individual or group address that is out // of range or not in one of the accepted presentations. ErrInvalidAddress = errors.New("knx: invalid address") // ErrMalformed reports a frame that cannot be decoded: too short, a // length field that disagrees with the data, a structure of the wrong // size or type. Decoders never panic on malformed input. ErrMalformed = errors.New("knx: malformed frame") // ErrUnsupported reports a service, connection type, frame or // datapoint type that is not implemented, or that the peer does not // support. ErrUnsupported = errors.New("knx: unsupported") // ErrInvalidOption reports an option or argument a function cannot be // called with. ErrInvalidOption = errors.New("knx: invalid option") // ErrInvalidValue reports a datapoint value outside the range of its // type, or data of the wrong size for it. ErrInvalidValue = errors.New("knx: invalid value") // ErrClosed reports an operation on a connection, client or server // that was closed. ErrClosed = errors.New("knx: closed") // ErrTimeout reports a request that the peer did not answer in time. ErrTimeout = errors.New("knx: timeout") // ErrConnectionLost reports that the peer ended the connection or // stopped answering heartbeats. ErrConnectionLost = errors.New("knx: connection lost") // ErrRejected reports a request the peer refused with a KNXnet/IP // status code; a *knxnetip.StatusError carries it. ErrRejected = errors.New("knx: rejected") // ErrBusy reports that a limit was reached: a full queue, no free // tunnelling channel, a routing busy indication. ErrBusy = errors.New("knx: busy") // ErrNotConfirmed reports a tunnelled telegram whose L_Data.con // reported an error, or did not arrive. ErrNotConfirmed = errors.New("knx: not confirmed") // ErrSecurity reports a KNX IP Secure or KNX Data Secure failure: an // authentication tag that does not verify, a replayed sequence number, // a missing key. Secure connections never fall back to plain ones. ErrSecurity = errors.New("knx: security failure") )
Sentinel errors shared by every package. They are usually wrapped with detail; test with errors.Is.
Functions ¶
func ParseGroupAddressWithFormat ¶
func ParseGroupAddressWithFormat(s string) (GroupAddress, GroupAddressFormat, error)
ParseGroupAddressWithFormat is ParseGroupAddress that also returns the presentation s was written in, so that g.Format(f) == s.
Types ¶
type ContextLogger ¶
type ContextLogger interface {
Logger
DebugContext(ctx context.Context, msg string, keysAndValues ...any)
InfoContext(ctx context.Context, msg string, keysAndValues ...any)
WarnContext(ctx context.Context, msg string, keysAndValues ...any)
ErrorContext(ctx context.Context, msg string, keysAndValues ...any)
}
ContextLogger extends Logger with context-aware structured logging, so that a handler can pick trace and span identifiers out of the context. When the Logger also implements ContextLogger, entries that belong to a request are logged with the context the request was called with.
type FieldLogger ¶
type FieldLogger interface {
Logger
// With returns a logger that adds the given fields to every entry.
With(keysAndValues ...any) FieldLogger
DebugKV(msg string, keysAndValues ...any)
InfoKV(msg string, keysAndValues ...any)
WarnKV(msg string, keysAndValues ...any)
ErrorKV(msg string, keysAndValues ...any)
}
FieldLogger extends Logger with structured key-value logging. When the Logger given to a client or server also implements FieldLogger, the library logs through it: every entry is a constant message plus fields such as "component", "remote", "session", "connection" and "error", instead of one formatted string. NewSlogLogger returns such a logger.
keysAndValues alternate string keys and values, as in log/slog.
func NewSlogFieldLogger ¶
func NewSlogFieldLogger(h slog.Handler) FieldLogger
NewSlogFieldLogger is NewSlogLogger with the result typed as a FieldLogger, for callers that want to add fields with With before handing the logger to a client or server. A nil handler returns a no-op logger.
type GroupAddress ¶
type GroupAddress uint16
GroupAddress is a 16-bit KNX group address. Its presentation (three levels, two levels or free) is a convention of the installation; the address on the wire is always the same 16 bits.
func MustParseGroupAddress ¶
func MustParseGroupAddress(s string) GroupAddress
MustParseGroupAddress is ParseGroupAddress that panics on error, for constants in programs and tests.
func NewGroupAddress2 ¶
func NewGroupAddress2(main uint8, sub uint16) (GroupAddress, error)
NewGroupAddress2 returns main/sub. main must be 0..31, sub 0..2047.
func NewGroupAddress3 ¶
func NewGroupAddress3(main, middle, sub uint8) (GroupAddress, error)
NewGroupAddress3 returns main/middle/sub. main must be 0..31, middle 0..7.
func ParseGroupAddress ¶
func ParseGroupAddress(s string) (GroupAddress, error)
ParseGroupAddress parses a group address in any presentation: three parts ("1/2/3") are main/middle/sub, two parts ("1/515") main/sub, one part ("2563") the free 16-bit number. Fields are decimal without sign, leading zeros or spaces; out-of-range fields are errors.
Example ¶
package main
import (
"fmt"
"github.com/otfabric/go-knx"
)
func main() {
for _, s := range []string{"1/2/3", "1/515", "2563"} {
g, err := knx.ParseGroupAddress(s)
if err != nil {
panic(err)
}
fmt.Println(s, "=", g, g.Format(knx.GroupTwoLevel), g.Format(knx.GroupFree))
}
_, err := knx.ParseGroupAddress("32/0/0")
fmt.Println(err)
}
Output: 1/2/3 = 1/2/3 1/515 2563 1/515 = 1/2/3 1/515 2563 2563 = 1/2/3 1/515 2563 knx: invalid address: group address "32/0/0": main is 0..31, middle 0..7, sub 0..255
func (GroupAddress) Format ¶
func (g GroupAddress) Format(f GroupAddressFormat) string
Format returns the address in presentation f.
func (GroupAddress) Main ¶
func (g GroupAddress) Main() uint8
Main returns the main group (0..31) of both level presentations.
func (GroupAddress) MarshalText ¶
func (g GroupAddress) MarshalText() ([]byte, error)
MarshalText implements encoding.TextMarshaler (three levels).
func (GroupAddress) Middle ¶
func (g GroupAddress) Middle() uint8
Middle returns the middle group (0..7) of the three-level presentation.
func (GroupAddress) String ¶
func (g GroupAddress) String() string
String returns the three-level presentation main/middle/sub.
func (GroupAddress) Sub ¶
func (g GroupAddress) Sub() uint8
Sub returns the sub group of the three-level presentation (0..255).
func (GroupAddress) Sub2 ¶
func (g GroupAddress) Sub2() uint16
Sub2 returns the sub group of the two-level presentation (0..2047).
func (GroupAddress) Uint16 ¶
func (g GroupAddress) Uint16() uint16
Uint16 returns the address as sent on the wire.
func (*GroupAddress) UnmarshalText ¶
func (g *GroupAddress) UnmarshalText(b []byte) error
UnmarshalText implements encoding.TextUnmarshaler (any presentation).
type GroupAddressFormat ¶
type GroupAddressFormat int
GroupAddressFormat selects the presentation of a GroupAddress.
const ( // GroupThreeLevel is main/middle/sub: main 0..31 (5 bits), middle 0..7 // (3 bits), sub 0..255 (8 bits), for example 1/2/3. GroupThreeLevel GroupAddressFormat = iota // GroupTwoLevel is main/sub: main 0..31 (5 bits), sub 0..2047 // (11 bits), for example 1/515. GroupTwoLevel // GroupFree is the address as one decimal number 0..65535. GroupFree )
Group address presentations.
func ParseGroupAddressFormat ¶
func ParseGroupAddressFormat(s string) (GroupAddressFormat, error)
ParseGroupAddressFormat parses "3-level" ("3", "three"), "2-level" ("2", "two") or "free".
func (GroupAddressFormat) String ¶
func (f GroupAddressFormat) String() string
String names the format: "3-level", "2-level" or "free".
type IndividualAddress ¶
type IndividualAddress uint16
IndividualAddress is the 16-bit address of a KNX device: area (4 bits), line (4 bits) and device (8 bits), written "area.line.device", for example 1.1.10.
func MustParseIndividualAddress ¶
func MustParseIndividualAddress(s string) IndividualAddress
MustParseIndividualAddress is ParseIndividualAddress that panics on error, for constants in programs and tests.
func NewIndividualAddress ¶
func NewIndividualAddress(area, line, device uint8) (IndividualAddress, error)
NewIndividualAddress returns the address area.line.device. area and line must be 0..15.
func ParseIndividualAddress ¶
func ParseIndividualAddress(s string) (IndividualAddress, error)
ParseIndividualAddress parses "area.line.device" (decimal, no sign, no leading zeros, no spaces). The result formats back to s exactly.
Example ¶
package main
import (
"fmt"
"github.com/otfabric/go-knx"
)
func main() {
a, err := knx.ParseIndividualAddress("1.1.10")
if err != nil {
panic(err)
}
fmt.Println(a.Area(), a.Line(), a.Device())
fmt.Printf("0x%04X\n", a.Uint16())
}
Output: 1 1 10 0x110A
func (IndividualAddress) Area ¶
func (a IndividualAddress) Area() uint8
Area returns the area (0..15).
func (IndividualAddress) Device ¶
func (a IndividualAddress) Device() uint8
Device returns the device (0..255).
func (IndividualAddress) Line ¶
func (a IndividualAddress) Line() uint8
Line returns the line (0..15).
func (IndividualAddress) MarshalText ¶
func (a IndividualAddress) MarshalText() ([]byte, error)
MarshalText implements encoding.TextMarshaler.
func (IndividualAddress) String ¶
func (a IndividualAddress) String() string
String returns "area.line.device".
func (IndividualAddress) Uint16 ¶
func (a IndividualAddress) Uint16() uint16
Uint16 returns the address as sent on the wire.
func (*IndividualAddress) UnmarshalText ¶
func (a *IndividualAddress) UnmarshalText(b []byte) error
UnmarshalText implements encoding.TextUnmarshaler.
type Logger ¶
type Logger interface {
Debugf(format string, args ...any)
Infof(format string, args ...any)
Warnf(format string, args ...any)
Errorf(format string, args ...any)
}
Logger is the logging interface accepted by the client and the server. Implement it to integrate any logging library.
Logging is silent by default. Methods are invoked synchronously on the protocol path and must not block.
func NewSlogLogger ¶
NewSlogLogger wraps a slog.Handler. The result implements FieldLogger and ContextLogger, so the library logs structured fields through it; messages are only built when the handler is enabled for their level. A nil handler returns a no-op logger.
func NewStdLogger ¶
NewStdLogger wraps a standard library logger. Each message is prefixed with its level. A nil l logs to os.Stderr with the standard flags.
type Metrics ¶
type Metrics interface {
// OnConnect is called when a tunnelling connection was established
// (client) or accepted (server) on channel.
OnConnect(remote net.Addr, channel uint8)
// OnDisconnect is called when a tunnelling connection ended. err is
// nil when the application closed it.
OnDisconnect(remote net.Addr, channel uint8, err error)
// OnFrameSent is called after a KNXnet/IP frame was written. service is
// its service type identifier, size its length on the wire.
OnFrameSent(remote net.Addr, service uint16, size int)
// OnFrameReceived is called for every KNXnet/IP frame read.
OnFrameReceived(remote net.Addr, service uint16, size int)
// OnDecodeError is called when a frame could not be decoded and was
// dropped.
OnDecodeError(remote net.Addr, err error)
// OnRetransmit is called when a tunnelling request is repeated because
// its acknowledgement did not arrive in time.
OnRetransmit(remote net.Addr, channel uint8)
// OnDropped is called when an inbound telegram is dropped: a full
// queue, a duplicate, a sequence number out of order, a routing rate
// limit. reason is a short constant string.
OnDropped(remote net.Addr, reason string)
}
Metrics is an optional callback interface for observing connections and traffic of a tunnel, a routing link, a client or a server. A nil Metrics disables collection.
The methods are called synchronously on the protocol path, possibly from several goroutines at once; implementations must be safe for concurrent use and must not block (increment a counter, send on a buffered channel).
Embed NopMetrics to implement only the callbacks you need and to stay compatible when methods are added.
type NopMetrics ¶
type NopMetrics struct{}
NopMetrics is a Metrics that does nothing. Embed it in your own type.
func (NopMetrics) OnDecodeError ¶
func (NopMetrics) OnDecodeError(net.Addr, error)
OnDecodeError does nothing.
func (NopMetrics) OnDisconnect ¶
func (NopMetrics) OnDisconnect(net.Addr, uint8, error)
OnDisconnect does nothing.
func (NopMetrics) OnFrameReceived ¶
func (NopMetrics) OnFrameReceived(net.Addr, uint16, int)
OnFrameReceived does nothing.
func (NopMetrics) OnFrameSent ¶
func (NopMetrics) OnFrameSent(net.Addr, uint16, int)
OnFrameSent does nothing.
func (NopMetrics) OnRetransmit ¶
func (NopMetrics) OnRetransmit(net.Addr, uint8)
OnRetransmit does nothing.
type Priority ¶
type Priority uint8
Priority is the priority of a telegram (2 bits of the control field).
const ( PrioritySystem Priority = 0 PriorityNormal Priority = 1 PriorityUrgent Priority = 2 PriorityLow Priority = 3 )
Priorities, as encoded on the wire.
func ParsePriority ¶
ParsePriority parses "system", "normal", "urgent" or "low".
Directories
¶
| Path | Synopsis |
|---|---|
|
Package apdu decodes and encodes the transport layer control information (TPCI) and the application layer protocol data unit (APCI and data) carried in the TPDU of an L_Data frame.
|
Package apdu decodes and encodes the transport layer control information (TPCI) and the application layer protocol data unit (APCI and data) carried in the TPDU of an L_Data frame. |
|
Package cemi encodes and decodes frames of the common External Message Interface (cEMI): the data link layer messages (L_Data, L_Busmon, L_Raw) that KNXnet/IP tunnelling and routing carry, and the local device management messages (M_PropRead, M_PropWrite, M_Reset, function properties) of KNXnet/IP device management.
|
Package cemi encodes and decodes frames of the common External Message Interface (cEMI): the data link layer messages (L_Data, L_Busmon, L_Raw) that KNXnet/IP tunnelling and routing carry, and the local device management messages (M_PropRead, M_PropWrite, M_Reset, function properties) of KNXnet/IP device management. |
|
Package client is KNX group communication over a link: a KNXnet/IP tunnel (package tunnel) or routing (package routing).
|
Package client is KNX group communication over a link: a KNXnet/IP tunnel (package tunnel) or routing (package routing). |
|
Package datasecure implements KNX Data Secure for group communication: the S-A_Data service that authenticates, and optionally encrypts, the APDU of a telegram end to end with a group key and a 48-bit sequence number per sender.
|
Package datasecure implements KNX Data Secure for group communication: the S-A_Data service that authenticates, and optionally encrypts, the APDU of a telegram end to end with a group key and a 48-bit sequence number per sender. |
|
Package device models virtual KNX devices: an individual address and group objects (communication objects) with their datapoint type, group addresses, communication flags and current value.
|
Package device models virtual KNX devices: an individual address and group objects (communication objects) with their datapoint type, group addresses, communication flags and current value. |
|
Package devmgmt is a KNXnet/IP device management client: it reads and writes the interface object properties of a KNXnet/IP server (local device management with M_PropRead and M_PropWrite) over a device management connection.
|
Package devmgmt is a KNXnet/IP device management client: it reads and writes the interface object properties of a KNXnet/IP server (local device management with M_PropRead and M_PropWrite) over a device management connection. |
|
Package discovery finds KNXnet/IP servers (SEARCH_REQUEST, multicast or directed unicast, standard or extended) and reads their self description (DESCRIPTION_REQUEST).
|
Package discovery finds KNXnet/IP servers (SEARCH_REQUEST, multicast or directed unicast, standard or extended) and reads their self description (DESCRIPTION_REQUEST). |
|
Package dpt encodes and decodes KNX datapoint types (DPT): the standardised representations of application values in group telegrams.
|
Package dpt encodes and decodes KNX datapoint types (DPT): the standardised representations of application values in group telegrams. |
|
examples
|
|
|
dpt
command
Command dpt encodes and decodes datapoint values.
|
Command dpt encodes and decodes datapoint values. |
|
routing-monitor
command
Command routing-monitor prints the routing indications on the KNXnet/IP multicast group.
|
Command routing-monitor prints the routing indications on the KNXnet/IP multicast group. |
|
tunnel-client
command
Command tunnel-client connects to a KNXnet/IP interface or router, switches a group object and prints the group telegrams it sees.
|
Command tunnel-client connects to a KNXnet/IP interface or router, switches a group object and prints the group telegrams it sees. |
|
virtual-server
command
Command virtual-server runs a KNXnet/IP server with a virtual device on the loopback interface, connects a tunnelling client to it, writes a switch and reads a temperature.
|
Command virtual-server runs a KNXnet/IP server with a virtual device on the loopback interface, connects a tunnelling client to it, writes a switch and reads a temperature. |
|
internal
|
|
|
ccm
Package ccm holds the two halves of the AES-CCM construction that KNX IP Secure and KNX Data Secure use with their own block 0 and counter 0 formats: the CBC-MAC and the CTR encryption.
|
Package ccm holds the two halves of the AES-CCM construction that KNX IP Secure and KNX Data Secure use with their own block 0 and counter 0 formats: the CBC-MAC and the CTR encryption. |
|
fakeknx
Package fakeknx is a scriptable fake KNXnet/IP peer for tests: a UDP socket on the loopback interface that queues the KNXnet/IP messages it receives, lets a test answer them one by one, and can answer some of them automatically.
|
Package fakeknx is a scriptable fake KNXnet/IP peer for tests: a UDP socket on the loopback interface that queues the KNXnet/IP messages it receives, lets a test answer them one by one, and can answer some of them automatically. |
|
leak
Package leak checks tests for goroutines they leave behind.
|
Package leak checks tests for goroutines they leave behind. |
|
mcast
Package mcast opens the IPv4 multicast sockets of KNXnet/IP discovery and routing with the standard library only: joining a group, selecting the outgoing interface, the loopback and the TTL of multicast datagrams.
|
Package mcast opens the IPv4 multicast sockets of KNXnet/IP discovery and routing with the standard library only: joining a group, selecting the outgoing interface, the loopback and the TTL of multicast datagrams. |
|
pbkdf2
Package pbkdf2 implements PBKDF2 (RFC 8018) with HMAC-SHA256: the key derivation of KNX IP Secure passwords and of keyrings.
|
Package pbkdf2 implements PBKDF2 (RFC 8018) with HMAC-SHA256: the key derivation of KNX IP Secure passwords and of keyrings. |
|
ratelimit
Package ratelimit is a token bucket.
|
Package ratelimit is a token bucket. |
|
udp
Package udp holds the UDP helpers shared by the KNXnet/IP client, discovery, routing and server code.
|
Package udp holds the UDP helpers shared by the KNXnet/IP client, discovery, routing and server code. |
|
interop
|
|
|
node
command
Command node is go-knx's adapter for the knx-interop matrix: it implements the knx-interop container contract (version 1.4) directly on the go-knx library, built from this repository's sources.
|
Command node is go-knx's adapter for the knx-interop matrix: it implements the knx-interop container contract (version 1.4) directly on the go-knx library, built from this repository's sources. |
|
Package keyring reads and writes KNX keyring files (.knxkeys, namespace http://knx.org/xml/keyring/1), the export of the secure keys and passwords of an ETS project: the backbone key of secure routing, the users and passwords of secure tunnelling, the group keys and senders of Data Secure, and the device keys.
|
Package keyring reads and writes KNX keyring files (.knxkeys, namespace http://knx.org/xml/keyring/1), the export of the secure keys and passwords of an ETS project: the backbone key of secure routing, the users and passwords of secure tunnelling, the group keys and senders of Data Secure, and the device keys. |
|
Package knxnetip encodes and decodes KNXnet/IP frames: the header, host protocol address information (HPAI), description information blocks (DIB), connection request and response information (CRI, CRD) and the bodies of the core, device management, tunnelling, routing and secure services.
|
Package knxnetip encodes and decodes KNXnet/IP frames: the header, host protocol address information (HPAI), description information blocks (DIB), connection request and response information (CRI, CRD) and the bodies of the core, device management, tunnelling, routing and secure services. |
|
Package mgmt implements remote device management over the KNX network: the application layer services a tool sends to a device's individual address (A_PropertyValue_Read, _Write and _Response, A_DeviceDescriptor_Read and _Response), connectionless or in a transport layer connection, optionally secured with the device's tool key (KNX Data Secure point to point, S-A_Data with tool access).
|
Package mgmt implements remote device management over the KNX network: the application layer services a tool sends to a device's individual address (A_PropertyValue_Read, _Write and _Response, A_DeviceDescriptor_Read and _Response), connectionless or in a transport layer connection, optionally secured with the device's tool key (KNX Data Secure point to point, S-A_Data with tool access). |
|
Package routing sends and receives KNX telegrams with KNXnet/IP routing: ROUTING_INDICATIONs on an IP multicast group (224.0.23.12:3671 by default), with flow control.
|
Package routing sends and receives KNX telegrams with KNXnet/IP routing: ROUTING_INDICATIONs on an IP multicast group (224.0.23.12:3671 by default), with flow control. |
|
Package secure implements KNX IP Secure (KNXnet/IP Secure): the key derivations, the session handshake of secure tunnelling, the SECURE_WRAPPER encryption, and the timer of secure routing.
|
Package secure implements KNX IP Secure (KNXnet/IP Secure): the key derivations, the session handshake of secure tunnelling, the SECURE_WRAPPER encryption, and the timer of secure routing. |
|
Package server is a KNXnet/IP server: it answers discovery (search, extended search) and description requests, accepts tunnelling connections from KNXnet/IP clients, and optionally routes over IP multicast.
|
Package server is a KNXnet/IP server: it answers discovery (search, extended search) and description requests, accepts tunnelling connections from KNXnet/IP clients, and optionally routes over IP multicast. |
|
Package tunnel is a KNXnet/IP tunnelling client over UDP: it connects to a KNXnet/IP server (an IP interface or router), sends cEMI frames with acknowledgement and retransmission, receives telegrams with sequence checking and duplicate suppression, keeps the connection alive with heartbeats and, optionally, reconnects.
|
Package tunnel is a KNXnet/IP tunnelling client over UDP: it connects to a KNXnet/IP server (an IP interface or router), sends cEMI frames with acknowledgement and retransmission, receives telegrams with sequence checking and duplicate suppression, keeps the connection alive with heartbeats and, optionally, reconnects. |