Commit 766c7b3d authored by captainwong's avatar captainwong

basic node demo, can reply ack

parent 2aa66343
const assert = require('assert');
// windows:
const libademco = require('./build/Release/libademco_js');
const { send } = require('process');
// linux:
// const libademco = require('./build/Release/ademco_js');
......@@ -8,20 +9,148 @@ libademco.ademcoPrint("hello nodejs", "hello nodejs".length);
console.log(libademco);
console.log("test parse...");
var str = "\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019\r";
var cb = libademco.new_size_tp();
var pkt = new libademco.AdemcoPacket();
var res = libademco.ademcoPacketParse(str, str.length, pkt, cb);
assert.strictEqual(res, libademco.RESULT_OK);
assert.strictEqual(libademco.size_tp_value(cb), str.length);
assert.strictEqual(pkt.crc, 0xC5C3);
assert.strictEqual(pkt.len, 0x0053);
assert.strictEqual(pkt.id, libademco.AID_HB);
assert.strictEqual(pkt.seq, 0);
assert.strictEqual(pkt.acct, "90219125916578");
assert.strictEqual(pkt.data.ademcoId, 0);
assert.strictEqual(pkt.data.ademcoEvent, libademco.EVENT_I_AM_WIRE_MACHINE);
assert.strictEqual(pkt.data.gg, 0);
assert.strictEqual(pkt.data.zone, 0);
console.log("res=%d, commited=%d", res, libademco.size_tp_value(cb));
\ No newline at end of file
function test_parse() {
console.log("test parse...");
var str = "\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019\r";
var cb = libademco.new_size_tp();
var pkt = new libademco.AdemcoPacket();
var res = libademco.ademcoPacketParse(str, str.length, pkt, cb);
assert.strictEqual(res, libademco.RESULT_OK);
assert.strictEqual(libademco.size_tp_value(cb), str.length);
assert.strictEqual(pkt.crc, 0xC5C3);
assert.strictEqual(pkt.len, 0x0053);
assert.strictEqual(pkt.id, libademco.AID_HB);
assert.strictEqual(pkt.seq, 0);
assert.strictEqual(pkt.acct, "90219125916578");
assert.strictEqual(pkt.data.ademcoId, 0);
assert.strictEqual(pkt.data.ademcoEvent, libademco.EVENT_I_AM_WIRE_MACHINE);
assert.strictEqual(pkt.data.gg, 0);
assert.strictEqual(pkt.data.zone, 0);
console.log("res=%d, commited=%d", res, libademco.size_tp_value(cb));
}
function test_pack() {
console.log("test pack");
var pkt = new libademco.AdemcoPacket();
libademco.ademcoMakeHbPacket2(pkt, 1, "861234567890", 666666, libademco.EVENT_ARM, 0, 0, null);
console.log("len=%d", pkt.raw_len);
libademco.ademcoPrint(pkt.raw, pkt.raw_len);
console.log("test parse packed data");
var pkt2 = new libademco.AdemcoPacket();
var cb = libademco.new_size_tp();
var res = libademco.ademcoPacketParse(pkt.raw, pkt.raw_len, pkt2, cb);
assert.strictEqual(res, libademco.RESULT_OK);
assert.strictEqual(libademco.size_tp_value(cb), pkt.raw_len);
assert.strictEqual(pkt2.id, libademco.AID_HB);
assert.strictEqual(pkt2.seq, 1);
assert.strictEqual(pkt2.acct, "861234567890");
assert.strictEqual(pkt2.data.ademcoId, 666666);
assert.strictEqual(pkt2.data.ademcoEvent, libademco.EVENT_ARM);
assert.strictEqual(pkt2.data.gg, 0);
assert.strictEqual(pkt2.data.zone, 0);
}
class AlarmHost {
constructor(socket) {
this.socket = socket;
this.buf = null;
this.inpkt = new libademco.AdemcoPacket();
this.outpkt = new libademco.AdemcoPacket();
this.cb = libademco.new_size_tp();
this.ademcoId = 0;
this.acct = '';
this.seq = 1;
socket.on('data', (chunk) => {
if (this.buf) {
chunk = Buffer.concat([this.buf, chunk]);
}
let res = libademco.ademcoPacketParse(chunk.toString(), chunk.length, this.inpkt, this.cb);
while (res === libademco.RESULT_OK) {
chunk = chunk.slice(libademco.size_tp_value(this.cb));
this.handleMsg();
res = libademco.ademcoPacketParse(chunk.toString(), chunk.length, this.inpkt, this.cb);
}
if (res === libademco.RESULT_ERROR) {
chunk = null;
}
this.buf = chunk;
});
socket.on('close', (error) => {
console.log(this.tag() + error);
});
console.log(this.tag() + ' connectd');
}
handleMsg() {
console.log(this.tag() + ':');
libademco.ademcoPrint(this.inpkt.raw, this.inpkt.raw_len);
switch (this.inpkt.id) {
case libademco.AID_NULL:
this.acct = this.inpkt.acct;
this.sendAck(this.inpkt.seq);
break;
case libademco.AID_HB:
case libademco.AID_ADM_CID:
this.acct = this.inpkt.acct;
this.ademcoId = this.inpkt.data.ademcoId;
this.sendAck(this.inpkt.seq);
break;
}
}
tag() {
var str = this.socket.address().address + ':' + this.socket.address().port;
if (this.acct) {
str += ' acct=' + this.acct;
}
if (this.ademcoId) {
str += ' ademco_id=' + this.ademcoId;
}
return str;
}
sendAck(seq) {
libademco.ademcoMakeAckPacket2(this.outpkt, seq, this.acct, this.ademcoId);
console.log('server reply:');
libademco.ademcoPrint(this.outpkt.raw, this.outpkt.raw_len);
this.socket.write(Buffer.from(this.outpkt.raw, this.outpkt.raw_len));
}
}
function simpleServer(host, port) {
const net = require('net');
const server = net.createServer();
server.on('error', (error) => {
console.log(`server error: ${error}`);
});
server.on('listening', () => {
console.log(`server running at ${host}:${port}...`);
server.on('connection', (socket) => {
new AlarmHost(socket);
});
});
server.listen(port, host);
}
test_parse();
test_pack();
simpleServer("0.0.0.0", 12345);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment