-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathserver.js
More file actions
90 lines (75 loc) · 2.43 KB
/
server.js
File metadata and controls
90 lines (75 loc) · 2.43 KB
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
var server = module.exports,
net = require("net"),
EventEmitter = require("events").EventEmitter,
Tracker = require("./tracker"),
Position = require("./position");
server.create = function(){
var server = net.createServer(function(client){
var data = "",
tracker;
client.on("data", function(chunk){
if(client.tracker && client.tracker.imei === chunk.toString()){
//it is a heartbeat message, respond inmediately.
client.write(new Buffer("ON"));
return;
}
data += chunk.toString();
if(data.indexOf(";") === -1) return;
var messagesToProcess = data.split(";");
for (var i = 0; i < messagesToProcess.length -1; i++) {
processData(server, client, messagesToProcess[i]);
}
data = data.slice(data.lastIndexOf(";")+1);
if(client.tracker && client.tracker.imei === data){
//remaining is a heartbeat message, respond inmediately.
client.write(new Buffer("ON"));
data = "";
return;
}
});
client.on("error", function(error){
// handle errors
// prevent node app from crashing when the Tracker device unexpectedly closes the connection
})
});
server.trackers = new EventEmitter();
return server;
};
function processData(server, client, data){
var messageParts = parseMessage(data.trim());
if(messageParts && messageParts[2] == "A"){
client.write(new Buffer("LOAD"));
var tracker = new Tracker(client, extractImei(data));
server.trackers[tracker.imei] = tracker;
server.trackers.emit("connected", tracker);
client.tracker = tracker;
return;
}
if(messageParts && messageParts[4] && messageParts[4] === "F"){
var imei = extractImei(data),
thisTracker = server.trackers[imei];
if(!thisTracker){
server.trackers.emit("error", new Error("position receive from unknown imei"));
return;
}
thisTracker.emit("position", new Position(data));
}
if(messageParts && messageParts[1] === "help me"){
var imei = extractImei(data),
thisTracker = server.trackers[imei];
if(!thisTracker){
server.trackers.emit("error", new Error("position receive from unknown imei"));
return;
}
thisTracker.emit("help me", null);
}
}
/*
* extract the IMEI of a message
*/
function extractImei(message){
return (/imei\:([0-9]*)/).exec(message)[1];
}
function parseMessage(message){
return message.split(",");
}