knxultimate
Version:
KNX IP protocol implementation for Node. This is the ENGINE of Node-Red KNX-Ultimate node.
79 lines (68 loc) • 2.49 kB
text/typescript
import { Buffer } from 'buffer'
import { KNX_CONSTANTS } from './KNXConstants'
import { module } from '../KnxLog'
const logger = module('KNXHeader')
export default class KNXHeader {
private _headerLength: number
private _version: number
public service_type: number
public length: number
constructor(type: number, length: number) {
this._headerLength = KNX_CONSTANTS.HEADER_SIZE_10
this._version = KNX_CONSTANTS.KNXNETIP_VERSION_10
this.service_type = type
this.length = KNX_CONSTANTS.HEADER_SIZE_10 + length
}
get headerLength(): number {
return this._headerLength
}
get version(): number {
return this._version
}
static createFromBuffer(buffer: Buffer, offset: number = 0): KNXHeader {
if (buffer.length < KNX_CONSTANTS.HEADER_SIZE_10) {
logger.error(
`createFromBuffer: incomplete buffer. Buffer length: ${buffer.length} expected HEADER_SIZE_10 equals to ${KNX_CONSTANTS.HEADER_SIZE_10}`,
)
throw new Error('Incomplete buffer')
}
const header_length = buffer.readUInt8(offset)
if (header_length !== KNX_CONSTANTS.HEADER_SIZE_10) {
logger.error(
`createFromBuffer: invalid header_length. header_length: ${header_length} expected HEADER_SIZE_10 equals to ${KNX_CONSTANTS.HEADER_SIZE_10}`,
)
throw new Error(`Invalid buffer length ${header_length}`)
}
offset += 1
const version = buffer.readUInt8(offset)
if (version !== KNX_CONSTANTS.KNXNETIP_VERSION_10) {
logger.error(
`createFromBuffer: Unknown header version. Version: ${version} expected KNXNETIP_VERSION_10 to ${KNX_CONSTANTS.KNXNETIP_VERSION_10}`,
)
throw new Error(`Unknown version ${version}`)
}
offset += 1
const type = buffer.readUInt16BE(offset)
offset += 2
const length = buffer.readUInt16BE(offset)
if (length !== buffer.length) {
logger.error(
`Received KNX packet: createFromBuffer: Message length mismatch ${length}/${buffer.length} Data processed: ${buffer.toString('hex') || '??'}`,
)
// throw new Error(`Message length mismatch ${length}/${buffer.length} Data processed: ${buffer.toString("hex") || "??"}`);
}
return new KNXHeader(type, length - header_length)
}
toBuffer(): Buffer {
const buffer = Buffer.alloc(this._headerLength)
let offset = 0
buffer.writeUInt8(this._headerLength, offset)
offset += 1
buffer.writeUInt8(this._version, offset)
offset += 1
buffer.writeUInt16BE(this.service_type, offset)
offset += 2
buffer.writeUInt16BE(this.length, offset)
return buffer
}
}