我正在尝试将Node.js Stream API与node-serialport模块一起使用。我尝试与之通信的设备有自己需要实现的协议。
我创建了两个Transform类。
const Delimiter = class Delimiter extends Transform {
constructor() {
super({})
this.delimiter = new Buffer(Token.TERMINATOR)
this.buffer = new Buffer(0)
}
_transform(chunk, encoding, callback) {
let data = Buffer.concat([this.buffer, chunk])
let index
while ((index = data.indexOf(this.delimiter)) !== -1) {
this.push(data.slice(0, index + 1))
data = data.slice(index + this.delimiter.length)
}
this.buffer = data
callback()
}
}
const Decoder = class Decoder extends Transform {
constructor(protocol, entity) {
super({objectMode: true})
this.protocol = protocol
this.entity = entity
}
_transform(chunk, encoding, callback) {
const decoded = decode(this.protocol, this.entity, chunk)
this.push(decoded)
callback()
}
}
我可以优雅地链接如下:
serialPort.pipe(new Delimiter()).pipe(new Decoder(Protocol, Entity.CLIENT))
我真正想做的是使用管道提供的这种非常优雅和高效的解决方案,使用SerialPort write
方法。
有什么办法可以做到吗?是否有可能以某种方式将Transform
对象添加到write
方法中,这样每当我调用像serialPort.write(new DeviceInfoRequest())
之类的东西时,对象就会被传递给管道并被处理?