Rev 1956 | Rev 1962 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 1956 | Rev 1959 | ||
|---|---|---|---|
| Line 1... | Line 1... | ||
| 1 | 1 | ||
| 2 | function TrackerManager(host, username, password, database) |
2 | function TrackerManager(host, username, password, database, server_port) |
| 3 | { |
3 | { |
| 4 | var self = this; |
4 | var self = this; |
| 5 | 5 | ||
| - | 6 | this.host_ = host; |
|
| - | 7 | this.username_ = username; |
|
| - | 8 | this.password_ = password; |
|
| - | 9 | this.database_ = database; |
|
| 6 | this.tracked_node_ids_ = {}; |
10 | this.tracked_node_ids_ = {}; |
| 7 | this.db_resource_ = null; |
11 | this.db_resource_ = null; |
| - | 12 | this.server_port_ = server_port; |
|
| - | 13 | this.server_id_ = null; |
|
| 8 | 14 | ||
| 9 |
|
15 | this._StartServer = function() |
| - | 16 | { |
|
| 10 |
|
17 | self.server_id_ = Socket_StartServer(self.server_port_, self._HandleClientDataReceived, self._HandleConnectedTracker); |
| - | 18 | ||
| - | 19 | if (self.server_id_ === false) |
|
| - | 20 | { |
|
| - | 21 | return false; |
|
| - | 22 | } |
|
| - | 23 | ||
| - | 24 | return true; |
|
| - | 25 | } |
|
| 11 | 26 | ||
| 12 |
|
27 | this._ConnectToDatabase = function() |
| 13 | 28 | { |
|
| - | 29 | if (self.db_resource_) |
|
| - | 30 | { |
|
| 14 |
|
31 | MySql_Close(self.db_resource_); |
| - | 32 | self.db_resource_ = null; |
|
| - | 33 | } |
|
| 15 | 34 | ||
| - | 35 | self.db_resource_ = MySql_Connect(self.host_, self.username_, self.password_); |
|
| 16 | 36 | ||
| 17 |
|
37 | if (self.db_resource_ === false) |
| 18 | Mbb_SubscribeToDeviceStatus(function(event_string, data) |
- | |
| 19 | { |
38 | { |
| - | 39 | return false; |
|
| - | 40 | } |
|
| - | 41 | ||
| - | 42 | MySql_SelectDb(self.db_resource_, self.database_); |
|
| - | 43 | ||
| - | 44 | MySql_Query(self.db_resource_, "SET time_zone='+0:00';"); |
|
| - | 45 | ||
| - | 46 | return true; |
|
| - | 47 | } |
|
| - | 48 | ||
| - | 49 | ||
| - | 50 | /* Function for finding tracked object */ |
|
| 20 |
|
51 | this._IdentifyTracker = function(data) |
| - | 52 | { |
|
| - | 53 | var result = MySql_Query(self.db_resource_, "SELECT `Nodes`.* FROM `Nodes`, `Attributes` WHERE `Nodes`.`type` = 'tracker' AND `Nodes`.`id` = `Attributes`.`node_id` AND `Attributes`.`name` = 'Imei' AND `Attributes`.`value` = '" + data.Imei + "'"); |
|
| - | 54 | ||
| - | 55 | if (result === false || result.length == 0) |
|
| 21 | { |
56 | { |
| 22 |
|
57 | Log("Unable to find a tracker with IMEI " + data.Imei); |
| 23 | } |
58 | } |
| - | 59 | else |
|
| - | 60 | { |
|
| - | 61 | var tracker_node_id = result[0]["id"]; |
|
| - | 62 | var tracker_node_name = result[0]["name"]; |
|
| - | 63 | ||
| - | 64 | Log("Found tracker \"" + tracker_node_name + "\" (NodeId " + tracker_node_id + ") that corresponds to IMEI " + data.Imei); |
|
| - | 65 | ||
| - | 66 | result = MySql_Query(self.db_resource_, "SELECT * FROM `Links` WHERE `node_id_down` = " + tracker_node_id + " AND `Role` = 'tracker'"); |
|
| - | 67 | ||
| - | 68 | if (result === false || result.length == 0) |
|
| - | 69 | { |
|
| - | 70 | Log("Unable to find an object that is being tracked with this tracker, will store positions on the tracker itself!"); |
|
| - | 71 | ||
| - | 72 | return tracker_node_id; |
|
| - | 73 | } |
|
| - | 74 | else |
|
| - | 75 | { |
|
| - | 76 | result = MySql_Query(self.db_resource_, "SELECT * FROM `Nodes` WHERE `id` = " + result[0]["node_id_up"]); |
|
| - | 77 | ||
| 24 |
|
78 | if (result === false || result.length == 0) |
| - | 79 | { |
|
| - | 80 | Log("Failed to fetch the name of the tracked object (node_id " + result[0]["node_id_up"] + ")!"); |
|
| - | 81 | } |
|
| - | 82 | else |
|
| 25 | { |
83 | { |
| - | 84 | Log("Found \"" + result[0]["name"] + "\" (node_id " + result[0]["id"] + ") which is being tracked by \"" + tracker_node_name + "\"."); |
|
| - | 85 | ||
| 26 |
|
86 | return result[0]["id"]; |
| - | 87 | } |
|
| - | 88 | } |
|
| - | 89 | } |
|
| - | 90 | ||
| - | 91 | return false; |
|
| 27 | } |
92 | } |
| 28 | else if (event_string == "position") |
- | |
| 29 |
|
93 | |
| - | 94 | /* Function for inserting new position in database */ |
|
| 30 |
|
95 | this._InsertPosition = function(tracker_node_id, data) |
| 31 | { |
96 | { |
| 32 |
|
97 | if (data.Type != "NO") |
| 33 | { |
98 | { |
| 34 | var query = "INSERT INTO `Positions` (`node_id`, `source`, `type`, `latitude_longitude`, `datetime`, `pdop`, `hdop`, `vdop`, `satellites`, `altitude`, `height_of_geoid`, `speed`, `angle`) VALUES ("; |
99 | var query = "INSERT INTO `Positions` (`node_id`, `source`, `type`, `latitude_longitude`, `datetime`, `pdop`, `hdop`, `vdop`, `satellites`, `altitude`, `height_of_geoid`, `speed`, `angle`) VALUES ("; |
| 35 |
|
100 | query += tracker_node_id + ","; |
| 36 | query += "'gps', "; |
101 | query += "'gps',"; |
| 37 |
|
102 | query += "'" + data.Type + "',"; |
| 38 |
|
103 | query += "GeomFromText('POINT(" + data.Latitude + " " + data.Longitude + ")'),"; |
| 39 |
|
104 | query += "'" + data.Datetime + "',"; |
| 40 |
|
105 | query += data.Pdop + ","; |
| 41 |
|
106 | query += data.Hdop + ","; |
| 42 |
|
107 | query += data.Vdop + ","; |
| 43 |
|
108 | query += data.Satellites + ","; |
| 44 |
|
109 | query += data.Altitude + ","; |
| 45 |
|
110 | query += data.HeightOfGeoid + ","; |
| 46 |
|
111 | query += data.Speed + ","; |
| 47 |
|
112 | query += data.Angle; |
| 48 | query += ");"; |
113 | query += ");"; |
| - | 114 | ||
| - | 115 | if (!MySql_Query(self.db_resource_, query)) |
|
| - | 116 | { |
|
| - | 117 | if (self._ConnectToDatabase()) |
|
| - | 118 | { |
|
| - | 119 | Log("Reconnected to MySql database!"); |
|
| 49 | 120 | ||
| 50 | MySql_Query(self.db_resource_, query); |
121 | MySql_Query(self.db_resource_, query); |
| 51 | 122 | } |
|
| - | 123 | } |
|
| - | 124 | ||
| 52 | /*query = "SELECT `node_id`, `source`, AsText(latitude_longitude), `created`, `datetime`, `hdop`, `satellites`, `altitude`, `height_of_geoid`, `speed`, `angle` FROM `Positions` WHERE `id` = " + MySql_InsertId(self.db_resource_) + " LIMIT 1"; |
125 | /*query = "SELECT `node_id`, `source`, AsText(latitude_longitude), `created`, `datetime`, `hdop`, `satellites`, `altitude`, `height_of_geoid`, `speed`, `angle` FROM `Positions` WHERE `id` = " + MySql_InsertId(self.db_resource_) + " LIMIT 1"; |
| 53 | |
126 | |
| 54 | Log("From DB:" + JSON.stringify(MySql_Query(self.db_resource_, query)));*/ |
127 | Log("From DB:" + JSON.stringify(MySql_Query(self.db_resource_, query)));*/ |
| 55 | } |
128 | } |
| 56 | 129 | ||
| 57 |
|
130 | Log(JSON.stringify(data)); |
| - | 131 | } |
|
| - | 132 | ||
| - | 133 | /* Function for handling tracker connected disconnected */ |
|
| - | 134 | this._HandleClientStatusUpdate = function(client_id, state) |
|
| - | 135 | { |
|
| - | 136 | switch (state) |
|
| - | 137 | { |
|
| - | 138 | case SOCKET_STATE_CONNECTED: |
|
| - | 139 | { |
|
| - | 140 | Log("Client " + client_id + " connected!"); |
|
| - | 141 | ||
| - | 142 | self.tracked_node_ids_[client_id] = true; |
|
| - | 143 | ||
| - | 144 | break; |
|
| - | 145 | } |
|
| - | 146 | case SOCKET_STATE_DISCONNECTED: |
|
| - | 147 | { |
|
| - | 148 | Log("Client " + client_id + " disconnected!"); |
|
| - | 149 | ||
| - | 150 | if (self.tracked_node_ids_[client_id]) |
|
| - | 151 | { |
|
| - | 152 | delete self.tracked_node_ids_[client_id]; |
|
| - | 153 | } |
|
| - | 154 | ||
| - | 155 | break; |
|
| 58 | } |
156 | } |
| - | 157 | default: |
|
| - | 158 | { |
|
| - | 159 | Log("Unknown state (" + state + ") for client " + client_id + "!"); |
|
| - | 160 | break; |
|
| 59 | } |
161 | } |
| 60 | } |
162 | } |
| 61 | 163 | } |
|
| 62 | 164 | ||
| 63 | /* |
165 | /* Functio for handling tracker data */ |
| 64 | this. |
166 | this._HandleClientDataReceived = function(client_id, data) |
| - | 167 | { |
|
| - | 168 | if (self.tracked_node_ids_[client_id]) |
|
| 65 | { |
169 | { |
| 66 |
|
170 | Log(data); |
| 67 | 171 | ||
| 68 | if (result === false || result.length == 0) |
- | |
| 69 | { |
- | |
| 70 | Log("Unable to find a tracker with IMEI " + data.Info.Imei); |
- | |
| 71 | } |
- | |
| 72 | else |
- | |
| 73 | { |
- | |
| 74 | var |
172 | var json_data = eval("(" + data + ")"); |
| 75 | var tracker_node_name = result[0]["name"]; |
- | |
| 76 | - | ||
| 77 | Log("Found tracker \"" + tracker_node_name + "\" (NodeId " + tracker_node_id + ") that corresponds to IMEI " + data.Info.Imei); |
- | |
| 78 | 173 | ||
| 79 | result = MySql_Query(self.db_resource_, "SELECT * FROM `Links` WHERE `node_id_down` = " + tracker_node_id + " AND `Role` = 'tracker'"); |
- | |
| 80 | - | ||
| 81 | if ( |
174 | if (json_data.method == "MBB.OnPosition") |
| 82 | { |
175 | { |
| 83 | Log("Unable to find an object that is being tracked with this tracker, will store positions on the tracker itself!"); |
- | |
| 84 | - | ||
| 85 | self. |
176 | if (self.tracked_node_ids_[client_id]) |
| 86 | } |
- | |
| 87 | else |
- | |
| 88 | { |
177 | { |
| 89 |
|
178 | self._InsertPosition(self.tracked_node_ids_[client_id], json_data); |
| - | 179 | } |
|
| 90 | 180 | } |
|
| 91 |
|
181 | else if (json_data.method == "MBB.OnConnected") |
| 92 | { |
182 | { |
| 93 |
|
183 | self.tracked_node_ids_[client_id] = self._IdentifyTracker(json_data); |
| 94 | } |
184 | } |
| 95 | else |
185 | else |
| 96 | { |
186 | { |
| 97 | Log("Found \"" + result[0]["name"] + "\" (node_id " + result[0]["id"] + ") which is being tracked by \"" + tracker_node_name + "\"."); |
- | |
| 98 | - | ||
| 99 |
|
187 | Log("Got unknown data \"" + data + "\" from client " + client_id); |
| 100 | } |
- | |
| 101 | } |
188 | } |
| 102 | } |
189 | } |
| 103 | } |
190 | } |
| - | 191 | ||
| - | 192 | /* Initialize connection */ |
|
| - | 193 | self._ConnectToDatabase(); |
|
| - | 194 | self._StartServer(); |
|
| 104 | } |
195 | } |