enip-ts
Version:
Typescript implementation of the Ethernet/IP™ protocol.
132 lines • 4.97 kB
JavaScript
;
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