node-mndp
Advanced tools
Comparing version 0.0.2 to 0.0.3
@@ -11,3 +11,3 @@ /// <reference types="node" /> | ||
*/ | ||
output(callback: (response: Device) => void): any; | ||
output(callback: (response: Device) => void): void; | ||
/** | ||
@@ -17,8 +17,2 @@ * Format the buffer array | ||
private format(callback); | ||
/** | ||
* Decode the length / the value | ||
* @param start Byte to start | ||
* @param callback | ||
*/ | ||
private decode(start); | ||
} |
@@ -25,3 +25,6 @@ "use strict"; | ||
identity: '', | ||
version: '' | ||
version: '', | ||
platform: '', | ||
uptime: 0, | ||
board: '' | ||
}; | ||
@@ -31,34 +34,41 @@ /** | ||
*/ | ||
let first_byte = 8; | ||
this.decode(first_byte).then((response) => { | ||
device.macAddress = format_1.buf2hex(response.buffer); | ||
first_byte += response.length + 4; | ||
return this.decode(first_byte); | ||
}).then((response) => { | ||
device.identity = format_1.bin2String(response.buffer); | ||
first_byte += response.length + 4; | ||
return this.decode(first_byte); | ||
}).then((response) => { | ||
device.version = response.buffer.toString(); | ||
}).then(() => { | ||
callback(device); | ||
}); | ||
let bufferLength = this.msg.buffer.byteLength; | ||
let offset = 4; | ||
while (offset + 4 < bufferLength) { | ||
let attrHead = Buffer.from(this.msg.buffer.slice(offset, offset + 4)); | ||
let attrType = attrHead.readUInt16BE(0); | ||
let attrLength = attrHead.readUInt16BE(2); | ||
offset += 4; | ||
if (offset + attrLength > bufferLength) { | ||
console.warn('invalid mndp packet: attribute too long'); | ||
break; | ||
} | ||
switch (attrType) { | ||
case 1: // mac address | ||
device.macAddress = format_1.buf2hex(this.msg.subarray(offset, offset + attrLength)); | ||
break; | ||
case 5: // identity | ||
device.identity = format_1.bin2String(this.msg.subarray(offset, offset + attrLength)); | ||
break; | ||
case 7: // version | ||
device.version = format_1.bin2String(this.msg.subarray(offset, offset + attrLength)); | ||
break; | ||
case 8: // platform | ||
device.platform = format_1.bin2String(this.msg.subarray(offset, offset + attrLength)); | ||
break; | ||
case 10: // uptime | ||
device.uptime = Buffer.from(this.msg.slice(offset, offset + attrLength)).readUInt32LE(0); | ||
break; | ||
case 12: // board | ||
device.board = format_1.bin2String(this.msg.subarray(offset, offset + attrLength)); | ||
break; | ||
default: // unknown type | ||
console.debug('unknown mndp message type', attrType); | ||
break; | ||
} | ||
offset += attrLength; | ||
} | ||
callback(device); | ||
} | ||
/** | ||
* Decode the length / the value | ||
* @param start Byte to start | ||
* @param callback | ||
*/ | ||
decode(start) { | ||
return new Promise((resolve, reject) => { | ||
let lengthArray = new Buffer(this.msg.buffer.slice(start - 2, start)); | ||
let length = lengthArray.readIntBE(0, lengthArray.byteLength); | ||
let item = new Buffer(this.msg.slice(start, start + length)); | ||
resolve({ | ||
buffer: item, | ||
length: length | ||
}); | ||
}); | ||
} | ||
} | ||
exports.Discovery = Discovery; |
@@ -10,2 +10,3 @@ /// <reference types="node" /> | ||
host: undefined | string; | ||
started: undefined | boolean; | ||
version: dgram.SocketType; | ||
@@ -12,0 +13,0 @@ constructor(options: Options); |
@@ -16,5 +16,5 @@ "use strict"; | ||
this.server = dgram.createSocket(this.version); | ||
dgram.createSocket(this.version); | ||
this.port = options.port || this.default.port; | ||
this.host = options.host || this.default.host; | ||
this.started = false; | ||
this.registerListeners(); | ||
@@ -27,2 +27,3 @@ } | ||
if (this.server) { | ||
this.started = true; | ||
this.server.bind(this.port, this.host); | ||
@@ -35,4 +36,5 @@ } | ||
stop() { | ||
if (this.server) { | ||
if (this.server && this.started) { | ||
this.server.close(); | ||
this.started = false; | ||
} | ||
@@ -39,0 +41,0 @@ } |
@@ -6,2 +6,5 @@ export interface Device { | ||
identity: string; | ||
platform: string; | ||
uptime: number; | ||
board: string; | ||
} |
import { Device } from './interfaces/device'; | ||
import { Rinfo } from './interfaces/rinfo'; | ||
import { DecodeOutput } from './interfaces/decodeOutput'; | ||
import { buf2hex, bin2String } from './util/format'; | ||
declare var Promise: any; | ||
export class Discovery { | ||
@@ -21,4 +18,3 @@ | ||
*/ | ||
output(callback: (response: Device) => void): any | ||
{ | ||
output(callback: (response: Device) => void): void { | ||
this.format((response) => { | ||
@@ -32,4 +28,3 @@ callback(response); | ||
*/ | ||
private format(callback: (device: Device) => void): any | ||
{ | ||
private format(callback: (device: Device) => void): void { | ||
let device = { | ||
@@ -39,3 +34,6 @@ ipAddress: this.info.address, | ||
identity: '', | ||
version: '' | ||
version: '', | ||
platform: '', | ||
uptime: 0, | ||
board: '' | ||
}; | ||
@@ -46,38 +44,43 @@ | ||
*/ | ||
let first_byte = 8; | ||
this.decode(first_byte).then((response) => { | ||
device.macAddress = buf2hex(response.buffer); | ||
first_byte += response.length + 4; | ||
return this.decode(first_byte); | ||
}).then((response) => { | ||
device.identity = bin2String(response.buffer); | ||
first_byte += response.length + 4; | ||
return this.decode(first_byte); | ||
}).then((response) => { | ||
device.version = response.buffer.toString(); | ||
}).then(() => { | ||
callback(device); | ||
}) | ||
} | ||
let bufferLength = this.msg.buffer.byteLength; | ||
let offset = 4; | ||
while (offset + 4 < bufferLength) { | ||
let attrHead = Buffer.from(this.msg.buffer.slice(offset, offset + 4)); | ||
let attrType = attrHead.readUInt16BE(0); | ||
let attrLength = attrHead.readUInt16BE(2); | ||
offset += 4; | ||
if (offset + attrLength > bufferLength){ | ||
console.warn('invalid mndp packet: attribute too long'); | ||
break; | ||
} | ||
/** | ||
* Decode the length / the value | ||
* @param start Byte to start | ||
* @param callback | ||
*/ | ||
private decode(start: number): Promise<DecodeOutput> | ||
{ | ||
return new Promise((resolve:any, reject:any) => { | ||
let lengthArray: Buffer = new Buffer(this.msg.buffer.slice(start - 2, start)); | ||
let length = lengthArray.readIntBE(0,lengthArray.byteLength); | ||
let item: Buffer = new Buffer(this.msg.slice(start, start + length)); | ||
resolve({ | ||
buffer: item, | ||
length: length | ||
}); | ||
}) | ||
switch (attrType) { | ||
case 1: // mac address | ||
device.macAddress = buf2hex(this.msg.subarray(offset, offset + attrLength)); | ||
break; | ||
case 5: // identity | ||
device.identity = bin2String(this.msg.subarray(offset, offset + attrLength)); | ||
break; | ||
case 7: // version | ||
device.version = bin2String(this.msg.subarray(offset, offset + attrLength)); | ||
break; | ||
case 8: // platform | ||
device.platform = bin2String(this.msg.subarray(offset, offset + attrLength)); | ||
break; | ||
case 10: // uptime | ||
device.uptime = Buffer.from(this.msg.slice(offset, offset + attrLength)).readUInt32LE(0); | ||
break; | ||
case 12: // board | ||
device.board = bin2String(this.msg.subarray(offset, offset + attrLength)); | ||
break; | ||
default: // unknown type | ||
console.debug('unknown mndp message type', attrType); | ||
break; | ||
} | ||
offset += attrLength; | ||
} | ||
callback(device); | ||
} | ||
} |
@@ -19,2 +19,3 @@ import * as dgram from "dgram"; | ||
host: undefined | string; | ||
started: undefined | boolean; | ||
version: dgram.SocketType; | ||
@@ -30,2 +31,4 @@ | ||
this.host = options.host || this.default.host; | ||
this.started = false; | ||
@@ -42,2 +45,3 @@ this.registerListeners(); | ||
if (this.server) { | ||
this.started = true; | ||
this.server.bind(this.port, this.host) | ||
@@ -52,4 +56,5 @@ } | ||
{ | ||
if (this.server) { | ||
if (this.server && this.started) { | ||
this.server.close(); | ||
this.started = false; | ||
} | ||
@@ -56,0 +61,0 @@ } |
@@ -6,2 +6,5 @@ export interface Device { | ||
identity: string; | ||
platform: string; | ||
uptime: number; | ||
board: string; | ||
} |
{ | ||
"name": "node-mndp", | ||
"version": "0.0.2", | ||
"version": "0.0.3", | ||
"description": "A Mikrotik Network Discovery Protocol in Node", | ||
@@ -5,0 +5,0 @@ "main": "./dist/index.js", |
15166
397
23