diff --git a/software/utils/ProtocolParser.js b/software/utils/ProtocolParser.js new file mode 100644 index 0000000..c71c65f --- /dev/null +++ b/software/utils/ProtocolParser.js @@ -0,0 +1,79 @@ +var Writable = require('stream').Writable; +var util = require('util'); + +util.inherits(ProtocolParser, Writable); + +function ProtocolParser(options){ + if(options === undefined){ + options = {}; + } + options.decodeStrings = true; + options.objectMode = false; + if (!(this instanceof ProtocolParser)){ + return new ProtocolParser(options); + } + + Writable.call(this, options); + this._clearResult(); + +} + +ProtocolParser.prototype._write = function(chunk, encoding, callback){ + for(var i=0; i < chunk.length; i++){ + switch(this._state){ + case 0://开始数据读取 + this._result.version = chunk.readUInt8(i) & 0x0f; + this._state = 1; + break; + case 1://读取数据类型 + this._result.type = chunk.readUInt8(i); + this._state = 2; + break; + case 2://读取大小 + this._buf[this._pos++] = chunk[i]; + if(this._pos == 2){ + this._bytesLeft = this._buf.readUInt16LE(0); + this._state = 3; + this._pos = 0; + this._buf = new Buffer(this._bytesLeft - 1); + } + break; + case 3://读取下一个参数 + if(this._bytesLeft > 0){ + this._result.data.type = chunk.readUInt8(i); + this._bytesLeft--; + this._state = 4; + } + break; + case 4://读取剩余的数据 + if(this._bytesLeft > 0){ + this._buf[this._pos++] = chunk[i]; + this._bytesLeft--; + } + break; + } + if(this._bytesLeft === 0 && (this._state === 3 || this._state === 4)){ + this._result.data.param = this._buf; + this.emit('packet', this._result); + this._clearResult(); + } + } + callback(null); +} + +ProtocolParser.prototype._clearResult = function(){ + this._result = { + version: 0, + type: null, + data: { + type: null, + param: null, + } + }; + this._state = 0; + this._buf = new Buffer(6); + this._pos = 0; + this._bytesLeft = 0; +} + +module.exports = ProtocolParser; \ No newline at end of file