-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
157 lines (125 loc) · 3.26 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
var Parser = require('binary-parser').Parser;
var SerialPort = require('serialport');
function crc16check(pucY, ucX) {
var PRESET_VALUE = 0xFFFF
var POLYNOMIAL = 0x8408
var ucI, ucJ;
var uiCrcValue = PRESET_VALUE;
for (ucI = 0; ucI < ucX; ucI++) {
uiCrcValue = uiCrcValue ^ pucY[ucI];
for (ucJ = 0; ucJ < 8; ucJ++) {
if (uiCrcValue & 0x0001) {
uiCrcValue = (uiCrcValue >> 1) ^ POLYNOMIAL;
} else {
uiCrcValue = (uiCrcValue >> 1);
}
}
}
return uiCrcValue;
}
var port = new SerialPort('com3', {
baudRate: 115200,
dataBits: 8,
stopBits: 1,
parity: 'none',
flowControl: false,
xon: false,
xoff: false,
rtscts: false,
bufferSize: 30,
});
var resFrameHeader = new Parser()
.uint8('length')
.uint8('address')
.uint8('command')
.uint8('status')
var resFrameTagData = new Parser()
.uint8('ant')
.uint8('num')
.uint8('epclength')
.buffer('epcid', {
encoding: 'hex',
length: 12
})
.uint8('rssi')
var resFrameTagDataRT = new Parser()
.uint8('ant')
.uint8('epclength')
.buffer('epcid', {
encoding: 'hex',
length: 12
})
.uint8('rssi')
var reqFrametagData = new Parser()
.uint8('qvalue')
.uint8('session')
.uint8('maskmem')
.uint16('maskaddr')
.uint8('masklen')
.uint8('maskdata')
.uint8('addrtid')
.uint8('lentid')
var framesBuffer = Buffer.alloc(0);
var frames = [];
var frame;
var frameSize = 0;
// Setup the port even `data` on arrival event handler
port.on('data', function(data) {
if (!data) {
return
}
framesBuffer = Buffer.concat([framesBuffer, data], framesBuffer.length + data.length);
frameSize = framesBuffer[0] + 1;
if (framesBuffer.length >= frameSize) {
//lets extract the frame (by size only)
//Create a frame
frame = Buffer.alloc(frameSize);
framesBuffer.copy(frame, 0, 0, frameSize);
// if crc16 return non zero value then the frame is invalid and we are better off droping it
if (crc16check(frame, frame.length)) {
frame = null;
}
//remove frame from buffer
framesBufferPendingSize = framesBuffer.length - frameSize
tempbuffer = Buffer.alloc(framesBufferPendingSize);
framesBuffer.copy(tempbuffer, 0, frameSize, tempbuffer.length);
framesBuffer = tempbuffer;
}
if (frame) {
parseframe(frame);
}
});
var tags = Array();
/**
* Parse the frame recived from RFID reader (compelete frame)
* @param {[type]} frame [description]
*/
function parseframe(frame) {
var header = Buffer.alloc(4)
frame.copy(header, 0, 0, header.length)
var frameHead = resFrameHeader.parse(header);
var dataBody = Buffer.alloc(frame.length - (header.length + 2))
frame.copy(dataBody, 0, header.length, frame.length + 2);
if (dataBody.length > 3) {
if (frameHead.command == 1) { //Answer Mode
frameBody = resFrameTagData.parse(dataBody);
}
if (frameHead.command == 238) { //Real Time Inventory Mode
frameBody = resFrameTagDataRT.parse(dataBody);
}
if (tags[frameBody.epcid.toString('hex')]) {
tags[frameBody.epcid.toString('hex')]++;
} else {
tags[frameBody.epcid.toString('hex')] = 1;
}
console.log("\033[2J");
console.log("\033[H");
console.log(Object.keys(tags).length);
console.log(tags);
}
}
//Starts Here
//get Info '04 FF 21 19 95'
//start inventory '06 00 01 04 ff d4 39' ---> 05 00 01 f8 69 0f
var buf = new Buffer('06000104ffd439', 'hex');
port.write(buf);