UNPKG

enip-ts

Version:

Typescript implementation of the Ethernet/IP™ protocol.

132 lines 4.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Encapsulation = exports.parseStatus = exports.validateCommand = exports.Commands = void 0; const header_1 = require("./header"); const cpf_1 = require("./cpf"); var Commands; (function (Commands) { Commands[Commands["NOP"] = 0] = "NOP"; Commands[Commands["ListServices"] = 4] = "ListServices"; Commands[Commands["ListIdentity"] = 99] = "ListIdentity"; Commands[Commands["ListInterfaces"] = 100] = "ListInterfaces"; Commands[Commands["RegisterSession"] = 101] = "RegisterSession"; Commands[Commands["UnregisterSession"] = 102] = "UnregisterSession"; Commands[Commands["SendRRData"] = 111] = "SendRRData"; Commands[Commands["SendUnitData"] = 112] = "SendUnitData"; Commands[Commands["IndicateStatus"] = 114] = "IndicateStatus"; Commands[Commands["Cancel"] = 115] = "Cancel"; })(Commands || (exports.Commands = Commands = {})); ; /** * Checks if Command is a Valid Encapsulation Command * @param ecapsulation command * @returns test result */ function validateCommand(cmd) { return Object.values(Commands).includes(cmd); } exports.validateCommand = validateCommand; ; /** * Parses Encapulation Status Code to Human Readable Error Message. * @param status Status Code * @returns Human Readable Error Message */ function parseStatus(status) { switch (status) { case 0x00: return "SUCCESS"; case 0x01: return "FAIL: Sender issued an invalid encapsulation command."; case 0x02: return "FAIL: Insufficient memory resources to handle command."; case 0x03: return "FAIL: Poorly formed or incorrect data in encapsulation packet."; case 0x64: return "FAIL: Originator used an invalid session handle."; case 0x65: return "FAIL: Target received a message of invalid length."; case 0x69: return "FAIL: Unsupported encapsulation protocol revision."; default: return `FAIL: General failure <${status}> occured.`; } } exports.parseStatus = parseStatus; ; class Encapsulation { /** * Creates a register session packet * @returns register Session packet */ static registerSession(sessionID = 0x00) { const cmdBuf = Buffer.alloc(4); cmdBuf.writeUInt16LE(0x01, 0); // Protocol Version (Required to be 1) cmdBuf.writeUInt16LE(0x00, 2); // Opton Flags (Reserved for Future List) // Build Register Session Buffer and return it return header_1.Header.build(Commands.RegisterSession, sessionID, cmdBuf); } ; /** * Returns an Unregister Session Request Buffer * @returns unregister Session packet */ static unregisterSession(session) { return header_1.Header.build(Commands.UnregisterSession, session); } ; /** * Returns a UCMM Encapsulated Packet Buffer * @returns sendRRData packet */ static sendRRData(session, data, timeout = 10) { let timeoutBuf = Buffer.alloc(6); timeoutBuf.writeUInt32LE(0x00, 0); // Interface Handle ID (Shall be 0 for CIP) timeoutBuf.writeUInt16LE(timeout, 4); // Timeout (sec) // Enclose in Common Packet Format let buf = cpf_1.CPF.build([ { TypeID: cpf_1.ItemIDs.Null, data: Buffer.from([]) }, { TypeID: cpf_1.ItemIDs.UCMM, data: data } ]); // Join Timeout Data with buf = Buffer.concat([timeoutBuf, buf]); // Build SendRRData Buffer return header_1.Header.build(Commands.SendRRData, session, buf); } ; /** * Returns a Connected Message Datagram (Transport Class 3) String * @returns sendUnitData packet */ static sendUnitData(session, data, ConnectionID, SequenceNumber) { let timeoutBuf = Buffer.alloc(6); timeoutBuf.writeUInt32LE(0x00, 0); // Interface Handle ID (Shall be 0 for CIP) timeoutBuf.writeUInt16LE(0x00, 4); // Timeout (sec) (Shall be 0 for Connected Messages) // Enclose in Common Packet Format const seqAddrBuf = Buffer.alloc(4); seqAddrBuf.writeUInt32LE(ConnectionID, 0); const seqNumberBuf = Buffer.alloc(2); seqNumberBuf.writeUInt16LE(SequenceNumber, 0); const ndata = Buffer.concat([ seqNumberBuf, data ]); let buf = cpf_1.CPF.build([ { TypeID: cpf_1.ItemIDs.ConnectionBased, data: seqAddrBuf }, { TypeID: cpf_1.ItemIDs.ConnectedTransportPacket, data: ndata } ]); // Join Timeout Data with buf = Buffer.concat([timeoutBuf, buf]); // Build SendRRData Buffer return header_1.Header.build(Commands.SendUnitData, session, buf); } ; } exports.Encapsulation = Encapsulation; //# sourceMappingURL=index.js.map